nuxt.js框架 ---vue服务端渲染应用框架

1,116 阅读4分钟

nuxt.js框架是一个基于vue.js的通用应用框架,优点:

  • 1、资源请求量大时解决首屏加载缓慢
  • 2、有利于SEO,搜索网站抓取内容
  • 3、目录结构清晰,路由自动配置,可以只关注与功能
  • 4、默认添加webpack的配置vue-loader、file-loader、url-loader、热更新等
  • 5、默认添加eslint的配置,有利于团队合作

安装

$ npx create-nuxt-app <项目名>//创建项目

出现的报错

npm install 时出现报错,解决方案是:不要设置淘宝镜像 npm set registry https://registry.npmjs.org/

    $ npm install
    npm WARN deprecated fsevents@1.2.9: One of your dependencies needs to upgrade to fsevents v2: 1) Proper nodejs v10+ support 2) No more fetching binaries from AWS, smaller package size v2: 1) Proper nodejs v10+ support 2) No more fetching binaries from AWS, smaller package size
    npm ERR! Unexpected end of JSON input while parsing near '...y-js/-/uglify-js-3.3.'
    
    npm ERR! A complete log of this run can be found in:
    npm ERR!     C:\Users\yangxiaomei\AppData\Roaming\npm-cache\_logs\2019-11-12T10_20_23_073Z-debug.log

目录

assets

用于存放需要webpack编译的资源文件如:xx.scss,xx.less,xx.js,xx.png等

默认情况下 Nuxt 使用 vue-loader(自动使用css-loader编译模板和样式)、file-loader 以及 url-loader 这几个 Webpack 加载器来处理文件的加载和引用。对于不需要通过 Webpack 处理的静态资源文件,可以放置在 static 目录中。

nuxt通过配置webpack使用file-loader(实现增量更新和缓存策略),url-loader(根据阈值大小来判断是否转换为base64,以减少http请求数量,默认小于1kb的图片和字体转成base64来内联引用)

static

存放静态文件,Nuxt 服务器启动的时候,该目录下的文件会映射至应用的根路径 / 下

components

组件目录 components 用于组织应用的 Vue.js 组件。Nuxt.js 不会扩展增强该目录下 Vue.js 组件,即这些组件不会像页面组件那样有 asyncData(会在组件(限于页面组件)首屏加载之前被调用,之后将是客户端调用) 方法的特性。

layouts 布局组件

布局组件,模板中留有<nuxt></nuxt>(相当于vue中的slot)用于存放使用布局中的组件的template内容,如:

创建公共的布局文件

创建/layouts/our.vue

<template>
 <div>
   公共布局导航内容
   <nuxt />
 </div>
</template>
<script>
export default {

}
</script>

/pages/users.vue中引用布局

<template>
 <div>
   users vue
   <nuxt-child />
 </div>
</template>
<script>
export default {
 layout: 'our'
}
</script>

运行之后的结果为:

可定制化错误页面 /layout/error.vue

》 警告: 虽然此文件放在 layouts 文件夹中, 但应该将它看作是一个 页面(page).

这个布局文件不需要包含 标签。你可以把这个布局文件当成是显示应用错误(404,500等)的组件。

<template>
  <div class="container">
    <h1 v-if="error.statusCode === 404">页面不存在</h1>
    <h1 v-else>应用发生错误异常</h1>
    <nuxt-link to="/">首 页</nuxt-link>
  </div>
</template>

<script>
export default {
  props: ['error'],
  layout: 'blog' // 你可以为错误页面指定自定义的布局
}
</script>

middleware 中间件

路由前面的拦截器

pages 路由页面存放目录

每个vue文件会自动生成router下面的路由配置

/pages/index.vue默认根路径访问的页面
同级路由

生成的routes为:

 routes: [{
    path: "/users",
    component: _53c8fd22,
    name: "users"
  }, {
    path: "/users/detail",
    component: _84ac929e,
    name: "users-detail"
  }, {
    path: "/users/:id",
    component: _5a57e00a,
    name: "users-id"
  }, {
    path: "/",
    component: _4d741dac,
    name: "index"
  }],
嵌套路由

在文件夹同级目录创建相同名称的vue文件

注意:在该文件中需要添加,用来插入子路由的内容

生成的routes为:

routes: [{
    path: "/users",
    component: _1eafcb60,
    children: [{
      path: "",
      component: _53c8fd22,
      name: "users"
    }, {
      path: "detail",
      component: _84ac929e,
      name: "users-detail"
    }, {
      path: ":id",
      component: _5a57e00a,
      name: "users-id"
    }]
  }, {
    path: "/",
    component: _4d741dac,
    name: "index"
  }],

plugins 插件存放目录

添加插件,如: 路由守卫:/plugins/router.js:

   // 参数为对象实例
    export default ({ app }) => {
     app.router.beforeEach((to, from, next) => {
       console.log('to path', to.path)
       next()
     })
   }

添加插件文件后需要在nuxt.config.js中添加配置

 plugins: [
   '@/plugins/router.js'
 ],

拦截器:/plugins/axios.js:

   // 参数为对象实例
  export default ({ $axios }) => {
     $axios.onRequest((config) => {
       // 判断如果不是服务端,获取token
       if (!process.server) {
         config.headers.token = localStorage.getItem('token')
       }
     })
   }


添加插件文件后需要在nuxt.config.js中添加配置

 plugins: [
   '@/plugins/axios.js'
 ],

server

服务器代码,解析模板、生成路由、添加热更新的监听等

store

用于存放vuex中的文件

index.js

asyncData方法

注意事项:

  • asyncData方法会在组件(限于页面组件)每次加载之前被调用
  • asyncData可以在服务器或路由更新之前被调用
  • 第一个参数被设定为当前页面的上下文对象
  • nuxt.js会将asyncData返回的数据融合data中
  • 由于asyncData方法是在组件初始化前被调用,所以在方法内是没有办法通过this来引用组件的实例对象 刷新页面,第一次访问时,在server端调用,第二次通过路由跳转时则是在客户端调用,测试代码如:
<template>
  <div>
    用户列表页
    <div v-for="(item,index) in users" :key="index">
      {{ item.id }}--{{ item.name }}
    </div>
  </div>
</template>
<script>
function getUsers () {
  return new Promise((resolve) => {
    setTimeout(function () {
      resolve([
        { id: 1, name: 'aaa' },
        { id: 2, name: 'bbbb' }
      ])
    }, 2000)
  })
}
export default {
  async asyncData (context) {
    console.log('asyncData', process.server, process.client)
    const users = await getUsers()
    return { users }
  }
}
</script>

整合axios

npm install @nuxt/axios 配置nuxt.config.js

modules:[
    '@nuxtjs/axios'
],
axios:{
    proxy:true
},
proxy:{
    "/api":"http://localhost:3003"
}