当前位置:   article > 正文

Vue服务端渲染之Nuxt.js上手

Vue服务端渲染之Nuxt.js上手

说在前头:本文主要简书Nuxt.js框架的基本使用,该框架集成度比较高,但文档比较全,主要参考官方文档

安装

使用官方提供的脚手架。按照官方文档,使用npx命令安装。什么,你还不知到npx?

npx create-nuxt-app <项目名>

然后进行一些选择,比如选择什么服务端框架,这里我选了Koa

还会让你选择UI框架,这里我选了Element

其余的都是常见的一些选项。

 

nuxt.config.js配置

Nuxt.js 默认的配置涵盖了大部分使用情形,可通过 nuxt.config.js 来覆盖默认的配置。

举例:配置全局css,在 Nuxtjs 里配置全局的 CSS 文件、模块、库。 (每个页面都会被引入)

使用sass

npm install node-sass sass-loader --save-dev

nuxt.conf.js中添加css资源

  1. module.exports = {
  2. css: [
  3. // 直接加载一个 Node.js 模块。(在这里它是一个 Sass 文件)
  4. 'bulma'
  5. // 项目里要用的 CSS 文件
  6. '@/assets/css/main.css',
  7. // 项目里要使用的 SCSS 文件
  8. '@/assets/css/main.scss'
  9. ]
  10. }

assets/css/main.scss

  1. $baseColor : skyblue;
  2. body{
  3. background: $baseColor;
  4. }

这是页面背景变成天蓝色,配置全局css成功。

 

路由

跟普通Vue项目区别较大Nuxt.js 依据 pages 目录结构自动生成 vue-router 模块的路由配置。意思是说,nuxt.js中可以不用写router规则,只需按规则在pages目录下创建文件即可。

Nuxt.js中使用<nuxt-link>替代普通Vue项目中的<router-link>,使用<nuxt/>替代<router-view>

基础路由

layouts/default.vue

  1. <template>
  2. <div>
  3. <nuxt-link to="/news">全部新闻</nuxt-link>
  4. <nuxt-link to="/news/sport">体育新闻</nuxt-link>
  5. <nuxt/>
  6. </div>
  7. </template>

pages目录

那么,Nuxt.js 自动生成的路由配置如下:

  1. router: {
  2. routes: [
  3. {
  4. name: 'index',
  5. path: '/',
  6. component: 'pages/index.vue'
  7. },
  8. {
  9. name: 'news',
  10. path: '/news',
  11. component: 'pages/news/index.vue'
  12. },
  13. {
  14. name: 'news-sport',
  15. path: '/news/sport',
  16. component: 'pages/news/sport.vue'
  17. }
  18. ]
  19. }
'
运行

效果

动态路由

在 Nuxt.js 里面定义带参数的动态路由,需要创建对应的以下划线作为前缀的 Vue 文件 或 目录。

pages目录

那么,Nuxt.js 自动生成的路由配置如下:

  1. router: {
  2. routes: [
  3. {
  4. name: 'index',
  5. path: '/',
  6. component: 'pages/index.vue'
  7. },
  8. {...news},
  9. {
  10. name: 'users-id',
  11. path: '/users/:id?',
  12. component: 'pages/users/_id.vue'
  13. }
  14. ]
  15. }

页面获取参数方式没变,还是$route.parms.xx

你会发现名称为 users-id 的路由路径带有 :id? 参数,表示该路由是可选的。如果你想将它设置为必选的路由,需要在 users/_id 目录内创建一个 index.vue 文件。

路由参数校验

Nuxt.js 可以让你在动态路由组件中定义参数校验方法。

举例:pages/users/_id.vue页面中

  1. export default {
  2. validate ({ params }) {
  3. // 必须是number类型
  4. return /^\d+$/.test(params.id)
  5. }
  6. }

如果校验方法返回的值不为 truePromise中resolve 解析为false或抛出Error , Nuxt.js 将自动加载显示 404 错误页面或 500 错误页面。

下面是动态路由与路由参数校验的效果

嵌套路由

创建内嵌子路由,你需要添加一个 Vue 文件,同时添加一个与该文件同名的目录用来存放子视图组件

官方文档例子:

pages目录

  1. pages/
  2. --| users/
  3. -----| _id.vue
  4. -----| index.vue
  5. --| users.vue

Nuxt.js 自动生成的路由配置如下:

  1. router: {
  2. routes: [
  3. {
  4. path: '/users',
  5. component: 'pages/users.vue',
  6. children: [
  7. {
  8. path: '',
  9. component: 'pages/users/index.vue',
  10. name: 'users'
  11. },
  12. {
  13. path: ':id',
  14. component: 'pages/users/_id.vue',
  15. name: 'users-id'
  16. }
  17. ]
  18. }
  19. ]
  20. }
'
运行

过度动画

Nuxt.js 默认使用的过渡效果名称为 page

我们可以在公共样式表中加入样式,比如

assets/css/main.scss

  1. .page-enter-active, .page-leave-active {
  2. transition: all .5s;
  3. }
  4. .page-enter, .page-leave-to {
  5. opacity: 0;
  6. }
  7. .page-enter{
  8. transform: translateX(0);
  9. }
  10. .page-leave-to{
  11. transform: translateX(200px)
  12. }

如果想给某个页面自定义过渡特效的话,只要在该页面组件中配置 transition 字段即可:比如

sport.vue

  1. export default {
  2. transition: 'sport'
  3. }

再在assets/css/main.scss添加

  1. .sport-enter-active, .sport-leave-active {
  2. transition: all .5s;
  3. }
  4. .sport-enter, .sport-leave-to {
  5. opacity: 0;
  6. }
  7. .sport-enter{
  8. transform: translateX(0);
  9. }
  10. .sport-leave-to{
  11. transform: translateY(200px)
  12. }

最后效果

中间件(路由钩子)

中间件允许您定义一个自定义函数运行在一个页面或一组页面渲染之前。每一个中间件应放置在 middleware/ 目录。一个中间件接收 context 作为第一个参数。

举例:在middleware目录下创建auth.js文件

auth.js

  1. export default function(context){
  2. console.log('进入到auth中间件')
  3. //获取客户端设备信息
  4. context.userAgent = process.server ? context.req.headers['user-agent'] : navigator.userAgent
  5. console.log(context.userAgent)
  6. }

然后在 nuxt.config.js 中加入配置项

  1. router: {
  2. middleware: 'auth'
  3. }

中间件实现拦截权限判断

更详细的路由配置请看官方文档

 

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号