vue 服务端渲染 nuxt.js

Nuxt.js是Vue进行SSR的一个优选开源项目,可免去繁琐的Webpack、nodejs后台服务配置等操作,方便的搭建一个支持SSR的VUE项目,据说尤大神曾去拜访过其作者,且多次在微博提及该项目。

Nuxt.js官方提供包括中文在内的五种语言文档,安装使用也十分亲民,提供了以下四种vue-cli初始化模板:

starter: Basic Nuxt.js project template


express: Nuxt.js + Express


koa: Nuxt.js + Koa


adonuxt: Nuxt.js + AdonisJS

喜欢自己动手灵活控制的童鞋也可以直接创建package.json,然后安装nuxt

npm i nuxt --S

最后在根目录创建pages的即可自动生成路由

由于Nuxt.js官方文档目前已经覆盖了大部分常用需求,这里不多拷贝,下面说一下使用中遇到的一些官方介绍不充分的地方。

1、代理

本地开发经常api跨域,常用node提供api代理服务来绕过该问题,Nuxt.js默认模板自然也提供了该能力,在官方找github找到modules目录,下面就有提供基于axios的代理模块配置,具体参考https://github.com/nuxt-community/modules/tree/master/modules/proxy。

目前该模块只支持默认模板,不过express、koa等将Nuxt.js以中间件形式渲染视图的情况下,我们依然可以手动注册Nuxt.js中间件或者以纯express、koa应用形式配置proxy中间件。

2、第三方库引用

官方不屏蔽你正常的import,但有提供插件模式且推荐使用插件模式,比如我想把element-ui和nuxt.js结合做后台管理系统,有些欠缺,经过第三方博客等了解尝试,得出如下配置

第一步,plugins目录下创建element-ui.js(或你自己喜欢的名字,只需后续配置时对应插件名为文件名即可),写入:

import Vue from 'vue'

import Element from 'element-ui'

Vue.use(Element)

第二部,根目录找到或者创建nuxt.config.js配置文件,按照官方指引,配置plugins如下:

plugins: [{src: '~plugins/element-ui', ssr: true}]

ssr配置为true表示服务端渲染,因为Nuxt.js做到了前后端同构且首屏服务端渲染,后续客户端渲染,1.1.0之前element-ui不支持服务端渲染,需要配置ssr:false,且插件内指定只适用于客户端构建,只目前最新版已完美支持,无需关注此项

全局需要的样式也需要在nuxt.config.js配置

css: ['element-ui/lib/theme-default/index.css']

如果希望element-ui这样的第三方库打包进vendor文件,需要在build下的vendor项配置

vendor: ['element-ui']

第三部,按需加载

注释掉前面的配置,使用babel插件,在build下配置babel,安装插件babel-plugin-component

npm i babel-plugin-component -D

配置插件如下

babel: {

  plugins: [['component', [

    {

      'libraryName': 'element-ui',

      'styleLibraryName': 'theme-default'

    },

    'transform-async-to-generator',

    'transform-runtime'

  ]]],

  comments: false

}

使用时按照常规,我们根据需要导出个别组件并注册到Vue,然后正常使用即可。其他的如vux、mint-ui都可以如此配置使用,可以大大降低打包文件大小。

下面是我demo配置文件实例,贴出来以便参考

module.exports = {

  /*

  ** Headers of the page

  */

  head: {

    title: '博客',

    meta: [

      {charset: 'utf-8'},

      {name: 'viewport', content: 'width=device-width, initial-scale=1'},

      {hid: 'description', name: 'description', content: '博客'}

    ],

    link: [

      {rel: 'icon', type: 'image/x-icon', href: '/favicon.ico'}

    ]

  },

  /*

  ** Customize the progress-bar color

  */

  loading: false,

  /*

  ** Build configuration

  */

  css: ['element-ui/lib/theme-default/index.css'],

  plugins: [{src: '~plugins/element-ui', ssr: true}],

  modules: [

    // npm install @nuxtjs/proxy -D

    ['@nuxtjs/proxy']

  ],

  proxy: {

    '/api': {

      pathRewrite: {'^/api': '/api'},

      target: 'http://127.0.0.1:8080'

    }

  },

  build: {

    publicPath: '/resources/',

    filenames: {

      vendor: 'vendor.[hash].js',

      app: 'static.[chunkhash].js'

    },

    vendor: ['element-ui'],

    babel: {

      plugins: [['component', [

        {

          'libraryName': 'element-ui',

          'styleLibraryName': 'theme-default'

        },

        'transform-async-to-generator',

        'transform-runtime'

      ]]],

      comments: false

    },

    /*

    ** Run ESLINT on save

    */

    extend (config, ctx) {

      if (ctx.isClient) {

        config.module.rules.push({

          enforce: 'pre',

          test: /\.(js|vue)$/,

          loader: 'eslint-loader',

          exclude: /(node_modules)/

        })

      }

    }

  }

}

你可能感兴趣的:(vue 服务端渲染 nuxt.js)