//直接引入会导致loadsh整体打包
//import {cloneDeep, debounce} from 'lodash';
//指定cloneDeep引入,具体文件目录可以在lodash源码中查看
import cloneDeep from 'lodash/cloneDeep';
import debounce from 'lodash/debounce';
import Vue from 'vue';
import { Button } from 'vant';
Vue.use(Button);
//注意:配置按需加载后,不允许全量引入vant
//import Vant from 'vant';
//import 'vant/lib/index.css';
//Vue.use(vant);
五、首屏优化
图片懒加载
使用 vant 的核心依赖 vue-lazyload,实现组件懒加载:
// plugins\plugin\main.js
import { Lazyload, Image as VantImage } from 'vant';
Vue.use(Toast).use(Dialog).use(VantImage).use(Lazyload, {
lazyComponent: true
});
目录
一、增加打包命令,根据参数切换测试生产环境
原 package.json 中一般有 dev 和 generate 两个命令,现增加 serve 命令,修改如下:
对应开发环、测试和生产环境打包命令分别为 serve、dev 和 generate,配置完成后测试环境需要在jenkins 下打包,打包命令选择 npm run dev
特殊的,对于采用 Git子模块方式引用的,打包命令需修改为 sh build.sh [dev|generate]
build.sh 也需要做如下更改:
在 nuxt.config.js 中增加环境参数配置:
在项目代码中直接使用 process.env.PATH_TYPE 直接获取环境参数,例如根据环境参数切换接口 baseUrl
二、静态资源切换 CDN category
目前仅生产环境有 cdn 域名,所以配置中需要区分测试和生产环境,nuxt.config.js 增加如下配置
配置完成后,使用 npm run generate 打包,项目 dist 目录下查看 index.html,静态资源已经切换为//cdn.xx.cn 域名
不参与打包的静态资源切换 cdn(如 static 下的 js)
三、自定义 html 模板
在项目根目录下新建 app.html,将 meta 和 rem.js 直接写到 head 中,保持原有{{HEAD}}和{{APP}}不动
新建完成后,可以删除 nuxt.config.js 中 head 属性下静态 meta 和 icon 的配置
四、优化打包体积
如果项目安装了 nuxt-common 依赖,则去除重复打包依赖 bn.js 和加密库 crypto-js 只引入 AES 加密相关可以参照外部引入 vue、encrypt、vue-awesome-swiper 配置
按需引入 lodash 可以参照按需引入 vant 配置重要,使用 npm 包引入 node-rsa 会引入 es6,导致低版本浏览器加载异常,若不单独做 babel 处理,强烈推荐使用 cdn 引入 encrypt;在 IE 9 浏览器中可以模拟验证
查看打包体积需要依赖 webpack-bundle-analyzer 插件,nuxt 集成了该插件,在 nuxt.config.js 做如下配置:
然后
npm run build --analyze
或npm run build -a
,等待打包完毕后,在自动打开的网页中可以查看打包情况(或手动打开/.nuxt/stats/client.html)去除重复打包依赖 bn.js(废弃)
多个库都依赖了 bn.js,会导致重复打包,nuxt.config.js 中加入如下配置:
查看打包结果,如下左图为添加配置前,bn.js 被多次打包,添加配置后,只会打包一次依赖
加密库 crypto-js 只引入 AES 加密相关(废弃)
加密库 crypto-js 提供多种加密方式,项目中仅用到 AES 加密,在 api.js 中单独引入相关模块,代码如下:
仅修改引入方式,加密代码不用做更改。
按需引入 lodash(废弃)
项目中多处引用 loadsh,直接使用引入会导致库文件整体打包,体积庞大。可以指定具体引用 js 文件按需加载,如:
如果项目中引入 loadsh 的地方过多,不好更改,可以使用 lodash-webpack-plugin 插件自动按需加载 lodash,配置方式如下:
外部引入 vue、encrypt、vue-awesome-swiper
多个产品里面都用到相同版本的 vue、node-rsa、crypto-js、swiper。不通过外部引入会打包到项目文件中去,导致产品切换的时候都要重新下载一次这些公共文件。通过外部引入的方式,在第一个产品加载后,访问后面的产品就不需要再下
(1)使用 swiper 组件的方式可选加载方式
(2)使用 v-swiper 指令的方式使用 swiper(注意:一定要在使用 v-swiper 之前,执行 Vue.use(window.VueAwesomeSwiper))
按需引入 vant、lodash
项目中使用 vant,如果直接全量引入,会导致打包体积过大,可以使用 babel-plugin-import 实现按需引入,在 nuxt.config.js 中做如下配置:
配置完成后,在项目中正常引入 vant 即可
五、首屏优化
图片懒加载
使用 vant 的核心依赖 vue-lazyload,实现组件懒加载:
注册 Lazyload 可配置的其他常用参数:
懒加载代码例子
关于 谷歌浏览器勾选 disable cache 图片加载两次的问题(暂不用考虑,以下项目也有出现)
css 优先加载,JS 后置
默认情况下,打包 css 和 js 都会位于 head 中,js 会减慢页面渲染速度,在 nuxt.config.js 中做如下配置:
配置完成后,打包页面主体结构如下:
六、其他优化
node-sass 更换为 sass
主要 npm 包 替换:
接下来搜索全局搜索 \deep\ 替换 为 ::v-deep。(注意:如果使用了 nuxt-common 子模块,不需要更改该子模块下的 \deep)。最后重新启动项目,启动成功,则修改完毕!