文档地址: https://nuxt.com/
中文文档: https://nuxtjs.org.cn/
nuxt 是服务端 + 客户端 同时存在的项目, 大部分客户端的无需交互就可以展示的内容由服务端直接渲染来展示,因此来通过 seo 的支持
https://nuxt.com/docs/getting-started/installation
https://codeload.github.com/nuxt/starter/tar.gz/refs/heads/v3
依赖版本
npm list
devServer: {
host: "0.0.0.0",
port: 3001,
},
https://nuxt.com/modules?q=element-plus
https://nuxt.com/docs/api/components/nuxt-page
https://nuxt.com/docs/getting-started/routing
该方式可以处理用 .html 的情况
[xxx]/test.vue
definePageMeta({
path: '/index.html',
alias: '/',
})
手动编写路由: https://nuxt.com/docs/guide/recipes/custom-routing
编程式跳转: https://nuxt.com/docs/api/utils/navigate-to
其他路由操作: https://nuxt.com/docs/api/composables/use-router
在 composables 和 utils 下的方法会自动注册,其他地方可以直接调用
composables: https://nuxt.com/docs/guide/directory-structure/composables
utils: https://nuxt.com/docs/guide/directory-structure/utils
composables 下创建: test.js
export const helloTest = async (params) => {
return "hello" + params;
}
任意 .vue 文件下使用
helloTest(" 666")
定义
// 全局参数
runtimeConfig: {
// 只在服务端可获取
isServer: "true",
public: {
// 在服务端 + 客户端都能获取
baseUrl: "192.168.1.231:10008"
}
}
使用
const config =useRuntimeConfig()
config.xxx
A

B

C

if(import.meta.server){
// 服务端
}
if(import.meta.client){
// 客户端
}
我们之前定义了一个全局参数 isServer
1、如果当前代码中能获取到 isServer 的值,就说明是服务端
2、如果当前代码中不能获取到 isServer 的值,就说明是客户端
const config =useRuntimeConfig();
config.isServer
https://nuxt.com/docs/api/composables/use-state
在服务端 + 用户端可以共享数据
注意: 数据只在当前页面有效,刷新页面会丢失数据 (如: a 链接跳转地址)
定义
let res = useState("count',()=>{
return 0;
}
// 读取+操作数据, 可以使用 callOnce 调用接口来异步设置数据 (详见文档)
res.value++
注意: 这里服务端会执行一次 res.value++, 客户端也会执行一次 res.value++
pinia= 客户端全局参数
pinia文档: https://pinia.vuejs.org/core-concepts/state.html
1、安装插件
安装1: https://nuxt.com/modules?q=pinia
安装2: https://pinia.vuejs.org/ssr/nuxt.html#Installation
2、添加
composables/useStore.js
import { defineStore } from 'pinia'
export const useStore = defineStore('storeId1', {
state: () => ({
count: 0,
}),
actions: {
increment() {
this.count++
},
decrement() {
this.count--
},
},
getters: {
doubleCount: (state) => state.count * 2,
},
})
3、使用
直接使用
// 直接获取数据并操作
let count = store.count;
store.count++;
// 调用 actions 方法
useStore().increment();
useStore().decrement();
// 调用 getters 方法
useStore().getters();
注意: pinia 的数据是存储在内存中的,浏览器刷新,关闭会丢失数据, 可以在 useStore 下方法中添加把数据更新到 localStorage 或 cookie 中
https://nuxt.com/modules?q=pinia-plugin-persistedstate
initStorageListener() {
// 监听 localStorage 变化
if(import.meta.client){
window.addEventListener('storage', (event) => {
if (event.key === 'storeId1') { // storeId1是你的store标识符
const newValue = JSON.parse(event.newValue)
if (newValue && newValue.count !== undefined) {
this.count = newValue.count
}
}
})
}
},
需要更新的页面中
useStore().initStorageListener();
https://nuxt.com/docs/guide/directory-structure/plugins
https://nuxt.com/docs/api/advanced/hooks#app-hooks-runtime
插件中使用
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.hook('app:rendered', (renderContext) => {
// 在 SSR 完成后执行某些操作
console.log('服务端渲染html完成');
});
});
插件中使用
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.hook('app:mounted', () => {
// 在客户端应用挂载后执行某些操作
console.log('客户端页面加载完成');
});
});
或使用 Composition API, 当前 vue 文件中
import { onMounted } from 'vue'; // 已经全局存在了, 可以省略
onMounted(() => {
console.log("客户端页面加载完成")
})
https://nuxt.com/docs/guide/directory-structure/middleware
在 middleware 目录下创建 xxx.global.ts 会自动注册,访问路由时自动触发调用
export default defineNuxtRouteMiddleware((to, from) => {
// 后续处理页面的登录拦截
console.log("route: " + to.path)
// 判断是否是客户端
if (import.meta.client) {
// 判断是否是不需要登录的 url
let noTokenUrls = ['/login']
if (noTokenUrls.includes(to.path)) {
return;
}
if (localStorage.getItem("token")) {
// 未登录
return navigateTo('/login.html')
}
}
})