Nuxt.js 从搭建到发布

一个基于 Vue.js的服务端渲染应用框架 ,nuxt 解决了SPA的通病(首屏白屏,SEO)

文章目录

        • 1. 搭建Nuxt
          • 1.1 快速入门
          • 1.2 资源目录
          • 1.3 生命周期
        • 2. 配置Nuxt
          • 2.1 引入UI框架
          • 2.2 引入中间件
          • 2.3 引入国际化
          • 2.4 引入第三方插件
          • 2.5 引入axios.js
          • 2.6 加载静态资源
        • 3. 开发Nuxt
        • 4. 调试Nuxt
          • 4.1 界面调试
          • 4.2 JS调试
          • 4.3 代理跨域
        • 5. 性能优化方案
          • 5.1 UI框架按需引入
          • 5.2 服务端渲染数据
          • 5.3 组件异步加载
          • 5.4 JS按需加载
          • 5.5 其它优化方案
          • 5.6 完整的nuxt.config.js
        • 6. 发布Nuxt
          • 6.1 打包
          • 6.2 发布

1. 搭建Nuxt

1.1 快速入门

​ 为了快速入门,Nuxt.js团队创建了脚手架工具 create-nuxt-app

​ 确保安装了npx(npx在NPM版本5.2.0默认安装了),详细查询官网教程

$ npx create-nuxt-app <项目名>

1.2 资源目录

项目完整资源目录

Nuxt.js 从搭建到发布_第1张图片

​ api:express 目录

​ assets:公共资源目录(.js .css .jpg)

​ components:公共组件目录

​ layouts:页面入口目录(default.vue 类似vue里的App.vue)

​ locales:国际化语言包文件目录

​ middleware:中间件目录

​ pages:页面级目录

​ plugins:公共插件目录

​ static:静态资源目录

​ store:vuex目录

​ .eslintrc.js:ESlint 代码检测工具配置文件

​ .gitignore:git上传规则配置文件

​ nuxt.config.js:nuxt 规则配置文件

​ package.json:npm 依赖包配置文件

1.3 生命周期
  • nuxt 生命周期
    Nuxt.js 从搭建到发布_第2张图片

  • nuxt context 思维导图

    Nuxt.js 从搭建到发布_第3张图片

2. 配置Nuxt

2.1 引入UI框架
  1. UI框架使用的是ant-design-vue: 支持自定义主题颜色和组件国际化等

    $ npm install --save ant-design-vue
    
  2. 创建插件目录plugins,添加antd.js:Vue全局引入ant-design-vue,开发时可直接使用框架组件

    Nuxt.js 从搭建到发布_第4张图片

    // antd.js
    import Vue from 'vue'
    import antd from 'ant-design-vue'
    
    Vue.use(antd)
    
  3. 配置nuxt.config.js:引入antd.js,可自定义ant-design-vue框架主题颜色

    // nuxt.configs.js
    module.exports = {
        /**
         * 第三方插件
         */
        plugins: [
            {src: '~/plugins/antd.js', ssr: true},
        ],
        /**
         * 编译配置
         */
        build: {
            extend (config, ctx) {
                /**
                 * 自定义 ant-design-vue 主题颜色
                 */
                config.module.rules.push({
                    test: /\.less$/,
                    use: [{
                        loader: 'less-loader',
                        options: {
                            modifyVars: {
                                'primary-color': '#2EA9DF',
                                'link-color': '#2EA9DF',
                                'border-radius-base': '4px'
                            },
                            javascriptEnabled: true
                        }
                    }]
                })
            }
        }
    }
    
    
2.2 引入中间件

中间件包含路由守卫、国际化等

  1. 创建中间件目录middleware,添加route.js

    // route.js
    export default ({req}) => {
        // 服务端渲染时
        if (process.server) {
           // 业务逻辑
        }
         // 客户端渲染时
        if (process.client) {
            // 添加路由守卫,动态改变路由的跳转
            app.router.beforeEach((to, from, next) => {
    			// 业务逻辑
            })
        }
    }
    
    
  2. 配置nuxt.config.js,引入route.js

    // nuxt.configs.js
    module.exports = {
        /**
         * 中间件拦截器
         */
        router: {
            middleware: ['route']
        }
        /**
         * 第三方插件
         */
        plugins: [
            {src: '~/plugins/antd.js', ssr: true},
        ],
        /**
         * 编译配置
         */
        build: {
            extend (config, ctx) {
                /**
                 * 自定义 ant-design-vue 主题颜色
                 */
                config.module.rules.push({
                    test: /\.less$/,
                    use: [{
                        loader: 'less-loader',
                        options: {
                            modifyVars: {
                                'primary-color': '#2EA9DF',
                                'link-color': '#2EA9DF',
                                'border-radius-base': '4px'
                            },
                            javascriptEnabled: true
                        }
                    }]
                })
            }
        }
    }
    
2.3 引入国际化

界面静态文字根据国际化动态切换语言,附上官网教程

  1. 创建目录 locales,添加index.js和需要的国际化 *.json

    Nuxt.js 从搭建到发布_第5张图片

    // index.js
    export default () => ['zh_TW', 'zh_CN', 'en_US']
    
  2. 创建目录store,添加index.js:nuxt默认集成vuex,会自动检测store是否存在

    在这里插入图片描述

    // index.js
    import Locale from '~/locales'
    
    /**
     * 全局变量
     * @returns {{locales, locale: *}}
     */
    export const state = () => ({
        locales: Locale(),
        locale: Locale()[0],
    })
    
    export const mutations = {
        /**
         * @param locale 当前选中的国际化标识
         * @constructor
         */
        SET_LANG (state, locale) {
            if (state.locales.indexOf(locale) !== -1) {
                state.locale = locale
            }
        }
    }
    
    export const actions = {
        /**
         * @param commit 国际化修改
         * @param val 国际化标识
         */
        updateLang ({commit}, val) {
            commit('SET_LANG', val)
        },
    }
    
    
  3. 添加中间件 i18n.js:校验客服端传递的国际化标识,动态渲染界面文字

    在这里插入图片描述

    // i18n.js
    import Tool from '~/assets/utils/tool'  // 服务端从request获取Cookie的工具
    export default function ({ isHMR, app, store, route, params, error, redirect, req }) {
        let cookies = Tool.getcookiesInServer(req)
        let languageCookie = cookies.language ? cookies.language : null
        const defaultLocale = app.i18n.fallbackLocale
        // If middleware is called from hot module replacement, ignore it
        if (isHMR) return
        // Get locale from params
        const locale = params.lang || defaultLocale
        if (store.state.locales.indexOf(locale) === -1) {
            return error({ message: 'This page could not be found.', statusCode: 404 })
        }
        // Set locale
        store.commit('SET_LANG', store.state.locale)
        app.i18n.locale = languageCookie || store.state.locale
        // If route is //... -> redirect to /...
        if (locale === defaultLocale && route.fullPath.indexOf('/' + defaultLocale) === 0) {
            const toReplace = '^/' + defaultLocale + (route.fullPath.indexOf('/' + defaultLocale + '/') === 0 ? '/' : '')
            const re = new RegExp(toReplace)
            return redirect(
                route.fullPath.replace(re, '/')
            )
        }
    }
    
    
    
  4. 添加插件 i18n.js:Vue全局引入i18n,可以在DOM中使用{{$t(...)}},JS中使用this.$t(...)获取国际化文字

    Nuxt.js 从搭建到发布_第6张图片

    // i18n.js
    import Vue from 'vue'
    import VueI18n from 'vue-i18n'
    import Cookie from 'js-cookie'
    
    Vue.use(VueI18n)
    
    export default ({ app, store }) => {
        let data = {}
        let Locale = store.state.locales
        for (let i = 0; i < Locale.length; i++) {
            data[Locale[i]] = require(`~/locales/${Locale[i]}.json`)
        }
        // Set i18n instance on app
        // This way we can use it in middleware and pages asyncData/fetch
        app.i18n = new VueI18n({
            locale: Cookie.get('language') || store.state.locale,
            fallbackLocale: Cookie.get('language') || store.state.locale,
            messages: data
        })
        // 自定义页面跳转方法
        app.i18n.path = (link) => {
            return `/${app.i18n.locale}/${link}`
        }
    }
    
    
    
  5. 配置Nuxt.config.js:引入插件i18n.js

    // nuxt.configs.js
    module.exports = {
        /**
         * 中间件拦截器
         */
        router: {
            middleware: ['route','i18n']
        }
        /**
         * 第三方插件
         */
        plugins: [
            {src: '~/plugins/antd.js', ssr: true},
         	{src: '~/plugins/i18n.js', ssr: true}
        ],
        /**
         * 编译配置
         */
        build: {
            extend (config, ctx) {
                /**
                 * 自定义 ant-design-vue 主题颜色
                 */
                config.module.rules.push({
                    test: /\.less$/,
                    use: [{
                        loader: 'less-loader',
                        options: {
                            modifyVars: {
                                'primary-color': '#2EA9DF',
                                'link-color': '#2EA9DF',
                                'border-radius-base': '4px'
                            },
                            javascriptEnabled: true
                        }
                    }]
                })
            }
        }
    }
    
    
2.4 引入第三方插件
  • 全局引入:配置nuxt.config.js,添加资源文件的路径

    // nuxt.config.js
    module.exports = {
      head: {
        script: [
          { src: 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js' }
        ],
          // 不对
                        
                        

你可能感兴趣的:(nuxt)