node nvm install 18.19.0
node nvm ls
node nvm use 18.19.0
npx nuxi@latest init nuxt-demo
npm install
npm run dev
{
"name": "nuxt-demo",
"private": true,
"type": "module",
"scripts": {
"build": "nuxt build",
"dev": "nuxt dev",
"generate": "nuxt generate",
"preview": "nuxt preview",
"postinstall": "nuxt prepare"
},
"dependencies": {
"@element-plus/icons-vue": "^2.0.10",
"axios": "^0.21.1",
"element-plus": "^2.2.27",
"gsap": "^3.8.0",
"prismjs": "^1.25.0",
"vue": "3.2.45",
"umob": "^0.2.5"
},
"devDependencies": {
"@element-plus/nuxt": "^1.0.6",
"@nuxt/devtools": "latest",
"nuxt": "^3.8.0",
"vite-plugin-prismjs": "^0.0.8",
"vue": "^3.3.6",
"vue-router": "^4.2.5",
"vuex": "^4.0.2"
}
}
import { useRoute } from 'vue-router'
、const route = useRoute()
即可const route = useRoute()
, 不会响应式更新,需放在setup内部。export default defineNuxtRouteMiddleware((to, from) => {
const { name: toName } = to
const { name: fromName } = from
console.log(toName, fromName)
})
vite: {
server: { // 本地请求服务器代理
proxy: {
'/api': {
target: 'https://xxxx.com/api',
changeOrigin: true,
},
},
},
}
nitro: {
routeRules: { // 服务器请求代理
'/api/**': {
proxy: 'https://xxxx.com/api/**',
},
},
}
await Promise.all([
useFetch('/a/b', {
query: { id: '01' },
method: 'get',
}),
useFetch('/a/c', {
query: { id: '02' },
method: 'get',
})
])
请求完成之后的数据处理与正常请求一致。若出现 nuxt.config.ts中的app部分配置如下所示: 默认情况下,useFetch会在异步函数解析完成之前使用Vue的Suspense进行页面导航,而Suspense的#fallback默认为空,从而造成白屏现象 可安装NVM升级node,参考链接 https://blog.csdn.net/xhp312098226/article/details/131247719 升级完成后,mysql也将会被升级至mysql 8,需要重新设置root用户密码和权限 安装pm2 经排除,问题为以下location导致 调整location匹配规则,过滤_nuxt路径下的静态资源 [1] Nuxt3文档 [2] https://github.com/element-plus/element-plus-nuxt-starter [3] Nuxt 3 学习笔记Hydration children mismatch in
四、如何在head内注入js代码片段?
head: {
script: [{
children: `window.addEventListener('load', function() {
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js')
}
})`,
}],
}
五、路由跳转短暂白屏处理
const fetchHandle = async (id) => {
const { data: response, pending } = await useLazyFetch('/a/b/getById', {
query: { id },
method: 'get',
key: 'getById:' + id,
})
return {
response,
pending,
}
}
export const useLazyFetchHandle = (data: any, res: any, key: string) => {
const { response, pending } = data
const { data: prevData } = useNuxtData(key)
if (response.value) {
// 服务端渲染的数据处理
res.value = response.value.data
}
const isLoading = computed(() => { // 加载中
if (prevData.value) {
return !prevData.value.success && pending.value
}
return pending.value
})
watch(response, (newRes) => {
// 监听路由跳转请求的数据处理
res.value = newRes.data
})
return isLoading
}
const result = ref({})
const isLoading = useLazyFetchHandle(
await fetchHandle(id),
result,
'getById:' + id,
)
六、部署
[nuxt] [request error] [unhandled] [500] _fetch is not a function
则需升级node
sudo apt update
sudo apt upgrade
sudo apt full-upgrade
sudo apt autoremove
sudo systemctl reboot
sudo apt install update-manager-core
sudo do-release-upgrade -m desktop -d
npm run build
,并生成 .output文件夹
npm install -g pm2
ecosystem.config.js
文件,內容如下:module.exports = {
apps: [
{
name: 'nuxt-demo',
exec_mode: 'cluster',
instances: 'max',
script: './.output/server/index.mjs',
env: {
PORT: 3000,
HOST: '0.0.0.0',
}
}
]
}
pm2 start ecosystem.config.js
location / {
proxy_pass http://127.0.0.1:3000/;
proxy_set_header HOST $host;
}
七、静态资源404
location ~ .*.(ttf|woff|webp|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
expires max;
if_modified_since off;
add_header Last-Modified "";
etag off;
}
location ~* ^(?!/(_nuxt|favicon))(.+).(ttf|woff|webp|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
expires max;
if_modified_since off;
add_header Last-Modified "";
etag off;
}
References