Vue提供了服务端渲染及还能支撑spa单页功能的框架。Nuxt.js 主要关注的是应⽤的 UI渲染。功能强大,方便我们快速上手。开箱即用。特点:
官网
安装: Nuxt模板项目 官方推荐 npx 这样会安装最新模板。然后进入项目。运行
npx create-nuxt-app <项目名>
cd <项目名>
npm run dev
然后选择你自己需要的插件依赖,不知道可以一直选默认;
整体项目目录结构
page 文件中的路由 .vue 文件。可以自动生成以文件名为路由名生成。特高效率
page/user.vue => http://localhost:3000/user 则生成这样目录
检查生成的路由配置,在.next 文件中 router.js。
Nuxt 中在page目录下得出现 .vue 同名的文件才能出发嵌套利用。不然你在 page中创建其他文件,在文件中创建其他 .vue 文件事,只能生成路径的嵌套。
错误示范:目录:/page/user/getUserInfo.vue => http://localhost:3000/user/getUserInfo
路径看上去可以,可是去路由配置看发现getUserInfo路由和user是同级路由。
正确写法:
nuxt-child
标签。他类似 router-view文件中可以继续创建文件,继续多级嵌套路由。方法同理
路由传参
路径跳转给下一个页面传递参数。
_id.vue {{ $route.parmas.id }} =》 /user/99 则99就是id参数
_id.vue
和 _name.vue
都可以使用 $route.parmas 查看参数了路由跳转
nuxt-link 标签. 和roter-link 用法一样。指定的页面 默认预加载。提供良好的体验
如果不想预加载 销毁第一资源,可以使用 no-prefetch 取消。点击页面才去加载。
自定义路由配置
如果Nuxt默认生成利用方式 不满足自己开发。那么你可以在 nuxt.config.js 中修改。如替换默认别名。参数,传参方式等等…
//router 自定义路由配置 满足自己需要
router: {
extendRoutes(routes, resolve) {
routes.push({
path: '/foo', //替换默认 也可访问foo,就可以访问hzfFoo.vue
component: resolve(__dirname, 'pages/hzfFoo.vue');
})
},
},
Nuxt默认布局是 default.vue。如果你希望你的登录注册也,和后台页区分开,可以自己定义登录布局
欢迎登录 登录
export default {
layout: 'login',
...
}
捕获错误布局页
在layout中定义 error.vue
页面不存在
应用发生错误异常
{{error}}
首 页
Nuxt生成的页面不在是以前那样只有一个index.html。现在是多个页面。那么可以通过head() 方法,给页面自定义头部信息
export default {
head() {
return {
title: '个人主页大全',
// vue-meta利用hid确定要更新meta 判断是否和首页一样,一样就给替换
meta: [
{
name: "description", hid: "description",
content: "这个网页主要展示你的个人用户信息,爱好,性别,年龄等..."
}
],
link: [{ rel: "icon", href: "https://img.kaikeba.com/kkb_portal_icon.ico" }]
}
},
}
当我需要请求接口数据,就需要异步处理。Nuxt提供了专门的函数。
asyncDate()
该方法可以让我设置组件数据之前。获得异步数据或者处理数据.
async asyncData({ $axios, params, error })
案例演示-步骤:
安装axios npm install @nuxtjs/axios -S
配置axios 在nuxt.config.js
modules: [
'@nuxtjs/axios',
],
axios: {
proxy: true
},
proxy: {
// 饿了么
"/restapi": "https://h5.ele.me"
},
asyncData调用axios , 修改配置文件记得重启;
async asyncData({ $axios, params, error }) {
// 这个方法执行时间很早,没有this。所以不能用this.route.params
//const data = await $axios.get('/xxx');
// $get 直接只返回data 不用开发者自己去点出来
const data = await $axios.$get('/restapi/bgs/poi/search_poi_nearby_alipay?keyword=广州&offset=0&limit=20');
console.log(data);
if (Array.isArray(data) && data.length > 0) {
// asyncData 返回对象 会和data中的对象合并,
return { list: data }
}
error({ statusCode: 400, message: '失败--'})
}
很类似于路由守卫,可以全局,也可以局部到某个页面。页面每次切换都会执行,可以做一些权限的判断
在 middleware
文件中定义 例如:auth.js
export default function ({ route, redirect, store }) {
console.log(route); //路由
console.log(redirect); // 路由跳转回调
console.log(store); // vuex
//redirect('/login')
}
全局 在nuxt.config.js 中
module.expors = {
router: {
middleware: ['auth']
}
}
局部
export default {
// 局部中间件
middleware: ["auth"]
}
Nuxt和常规Vue页面配置中,出现了很多变化。比如: anyncData() 函数比创建之前还早执行的。或者fecth函数,这些都是为开发者提供更多开发体验。
nuxtServerInit
Nuxt 也提供了Vuex的状态树管理嵌入在其中,不用安装即可使用,可在根目录 store
文件夹中定义
演示案例:
在 stroe
中创建user.js 管理用户数据状态
export const state = () => ({
token: 'null token'
});
export const mutations = {
init(state, token) {
state.token = token;
}
};
export const getters = {
isLogin(state) {
return !!state.token;
}
};
export const actions = {
// 异步登录
login({ commit, getters }, params) {
Promise.resolve().then(() => {
commit("init", params);
return getters.isLogin;
})
}
};
在login.vue 中使用它:注意。dispatch调用指定名称
onLogin() {
//调用store/user.js 下的 login 异步方法
this.$store.dispatch("user/login", 'toKen sxw*&s1n76%$').then(red => {
console.log(red);
const redirect = this.$route.query.redirect || '/';
this.$router.push(redirect)
})
}
有时候当我刷新页面。发现保存后台的数据状态就没有了,这个时候我们可以使用 nuxtServerInit
函数解决。页面重新刷新[首屏] 时候,可以执行,拿到服务端数据,然后在保存当我们状态中
演示: 在store 文件中创建 index.js 注意:nuxtServerInit
只能用 store/index.js 中,且在服务端执行
export const actions = {
// 参数1: 组件上下文
// 参数2: 服务端事例
nuxtServerInit({ commit }, { app }) {
console.log('我在服务端执行了');
// 重新给用户存值
commit('user/init', 'store index token: 12345')
}
};
plugins 可谓是nuxt必备必会的。**他和中间件有些类似,但是逻辑不通,他只会在事例创建之前执行一次。而中间每次路由切换都会执行;**开发中会经常涉及一下初始化工作,例如:安装插件,elementUI, 以及他的语言。或者设置axios 请求头携带took,或者给给她注入方法
在plugins 文件夹中 创建 api-inject.js
/*
* 参数1: 是vue上下文,我们可以结构取值想要的对象或属性。
* 参数2: 注入函数
* */
export default ({ $axios }, inject) => {
// 在这里注入一个全局方法 , 那么以后我们在vue实例中即可用 this.$getCity 函数
// 参数 【函数名称, 接受参数】
inject("getCity", potions => {
console.log(potions);
const url = "https://shadow.elemecdn.com/lib/[email protected]/city_list.json"
return $axios.$get(url);
});
};
在nuxt.config.js 中配置
module.exports = {
...
plugins: [
"@/plugins/api-inject"
],
}
可以在全局使用它:
methods: {
onGetCity() {
this.$getCity('深圳').then(res => {
this.list = res
})
}
}
在plugins 文件中创建 interceptor.js 然后在 nuxt.config.js 配置
// 1 interceptor.js中定义函数
export default function({ $axios, store }) {
// onRequest 是请求之前执行函数 详细文档: @nuxt-axios
$axios.onRequest(config => {
if (store.state.user.token) {
console.log('请求之前 token:', store.state.user.token);
// config.headers.Authorization = "Bearer " + store.state.user.token;
}
return config;
});
// 请求响应
$axios.onResponse(config=>{
//判断请求回来的code
....
return config;
})
}
// 2 nuxt.config
plugins: [
"@/plugins/api-inject",
"@/plugins/interceptor",
],
当我项目完成时候,需要打包上线。发布到外网。nuxt提供2中方式打包。
服务端渲染应用部署
他会以往vue打包部署很相似。打包后生成的文件在 .next/dist 目录中
npm run build
npm start
如何你电脑就是服务器 那么使用nginx 代理端口后,执行完事。外网可以访问了,提前你服务器装node
静态应⽤部署
这种方式会每个页面都打包出一和html页面。提前是 渲染和接⼝服务器都需要处于启动状态 这样打包的话效率很好,因为服务端已经渲染过浏览器不用重新渲染。 生成文件在 根目录/dist 中
npm run generate
导报出来的文件,就和我们Jquery时代的目录差不多了,都是html页面