Nuxt.js 相关
定义全局可用的 TypeScript Interface
关键词:how to define interface type in nuxt
。
参考链接:How to add global interfaces to Nuxt project。
示例代码:
// ~/types/index.ts
export { };
declare global {
type SomeType = [boolean, string, number];
interface MyFancyInterface {
...
}
const enum GlobalConstEnum {
...
}
....
}
环境配置
配置运行时环境变量(Nuxt v3)
参考资料:useRuntimeConfig
先在 .env
文件中定义环境变量,比如 API_SECRET
。
然后在 nuxt.config.ts
文件中,添加下面的内容:
export default defineNuxtConfig({
// ...
runtimeConfig: {
REG_TOKEN: process.env.REG_TOKEN,
},
})
在其他文件中,就可以用下面的方式,访问到上面定义的环境变量了。
const config = useRuntimeConfig()
console.log(config.REG_TOKEN)
配置环境变量
参考资料:The env property
如果需要添加一些项目中通用的环境变量,比如 CDN 文件的通用基础 URL,按照如下方式进行配置即可:
// nuxt.config.js
export default {
env: {
baseUrl: process.env.BASE_URL || 'http://localhost:3000'
}
}
配置项目基础路径
在默认配置下,Nuxt.js 的基础路由路径是 /
,假设其部署在 www.abc.com
域名下,则 URL 就是 www.abc.com/
。
如果要设置为子路径,比如 app2
,则按照下面的方式配置,就可以用 URL www.abc.com/app2
来访问。
// nuxt.config.js
export default {
router: {
base: '/app/'
}
}
配置接口请求代理
参考资料:Nuxt.js — How to handle CORS error 接口文档:routeRules | Config - Nitro
// nuxt.config.ts
export default defineNuxtConfig((){
routeRules: {
'/web/v1/**': {
proxy: { to: "httpw://api.abc.com/web/v1/**", },
}
}
})
错误排查
项目 dev 时 build 报错 EPERM: operation not permitted, mkdir '**.nuxt\components'
解决方案:'EPERM: operation not permitted' error when building Nuxt app。
具体操作:先停止 dev 状态,然后再 build,就不会报错了。
项目初始化后运行报错 TypeError: Cannot destructure property 'nuxt' of 'this' as it is undefined
报错信息为:Nuxt Fatal Error TypeError: Cannot destructure property 'nuxt' of 'this' as it is undefined.
。
Google 之后看到项目官方仓库就有人提了 issue:https://github.com/nuxt/nuxt/issues/10840 ,自己的报错信息正如提问者截图所示,原来是 Nuxt.js 默认关于 tailwindcss 的配置有问题。
解决方法也很简单,按照回帖中很多人所说的方法,去 tailwindcss 官网,按照 Install Tailwind CSS with Nuxt.js 一文所说的方法,对 Nuxt.js 进行重新配置即可。
用 pinia 实现状态管理
状态定义
// /stores/audio.ts
import { defineStore } from 'pinia'
export const useAudioStore = defineStore({
id: 'audio',
state: () => ({
show: false,
}),
actions: {
showAudioControl () {
this.$patch({
show: true,
})
},
},
})
状态使用
import { storeToRefs } from 'pinia'
import { useAudioStore } from '~/stores/audio'
// 1. 初始化
const audioStore = useAudioStore()
// 2. 使用值
const { doPause } = storeToRefs(audioStore)
// 3. 调用方法
audioStore.showAudioControl()
状态监听
import { storeToRefs } from 'pinia'
import { useAudioStore } from '~/stores/audio'
const audioStore = useAudioStore()
const { doPause } = storeToRefs(audioStore)
watch(doPause, () => {
if (doPause.value) {
// do something
} else {
// do something
}
})