最近开始学习nuxt.js,做个练习Demo。在集成element-ui插件时,打包会提示vendor.xxxxx.js文件超过300kB的警告,如下图:

版本信息:
1、nuxt 1.4.2
2、element-ui 2.4.7
3、webpack 4.7.0
主要配置如下:
a) package.json
{
"name": "Demo",
"scripts": {
"dev": "nuxt",
"build": "nuxt build",
"start": "nuxt start"
},
"dependencies": {
"element-ui": "^2.4.7",
"nuxt": "^1.4.2"
}
}b) nuxt.config.js
module.exports = {
css: [
// 公共 CSS 文件
'~/assets/css/common.css'
// 第三方插件 CSS 文件
{src: 'element-ui/lib/theme-chalk/index.css'},
],
build: {
vendor: ['element-ui']
},
plugins: [
{ src: '~/plugins/element-ui', ssr: true }
]
}c) plugins/element-ui.js
import Vue from 'vue' import ElementUi from 'element-ui' Vue.use(ElementUi)
一、分析打包情况:
Nuxt.js 可以使用 webpack-bundle-analyzer 来分析打包的文件,你可以基于分析结果来决定如何优化它。参考官网文档:https://nuxtjs.org/api/configuration-build 的analyze配置。
nuxt.config.js中analyze的配置如下:
module.exports = {
css: [
// 自定义公共 CSS 文件
'~/assets/css/common.css',
// 第三方插件 CSS 文件
{src: 'element-ui/lib/theme-chalk/index.css'}
],
build: {
analyze: true,
vendor: ['element-ui']
},
plugins: [
{ src: '~/plugins/element-ui', ssr: true }
]
}命令行运行npm run build --analyze进行打包操作后,浏览器会自动打开http://127.0.0.1:8888,页面会展示分析结果,如下图:

可以看的出项目打包是nuxt.config.js中vendor的配置项:element-ui以及项目依赖的vue等js库都打包到vendor.xxxxx.js文件中了,随着引用的库越多,vendor.xxxxx.js文件肯定就是越大。
二、优化方案:
1、maxChunkSize分割文件大小
nuxt.js 在1.2.0版本后提供maxChunkSize配置项来优化控制文件大小。【注意:maxChunkSize有可能会依赖webpack4,这里我没有验证其他webpack版本是否有效。】
nuxt.config.js中maxChunkSize的配置如下:
module.exports = {
css: [
// 自定义公共 CSS 文件
'~/assets/css/common.css',
// 第三方插件 CSS 文件
{src: 'element-ui/lib/theme-chalk/index.css'}
],
build: {
analyze: true,
vendor: ['element-ui'],
maxChunkSize: 300000
},
plugins: [
{ src: '~/plugins/element-ui', ssr: true }
]
}打包效果如下图:


当然这只能尽可能根据maxChunkSize来控制文件大小,例如element-ui/lib/element-ui.common.js文件大小453kB是超过maxChunkSize的,这里就单独保存在文件 6.19067215299cc39d8260.js 内。
2、按需加载
单单使用maxChunkSize来优化还是不够的,例如使用element-ui,其中只用到了Carousel走马灯功能,没有必要全库引用,这个时候可以通过按需加载来使用element-ui的组件。
a) 先本地安装按需加载插件babel-plugin-component(已安装的忽略次步骤)
npm install babel-plugin-component -D
安装好后package.json如下:
{
"name": "Demo",
"scripts": {
"dev": "nuxt",
"build": "nuxt build",
"start": "nuxt start"
},
"dependencies": {
"element-ui": "^2.4.7",
"nuxt": "^1.4.2"
},
"devDependencies": {
"babel-plugin-component": "^1.1.1"
}
}b) 修改nuxt.config.js:
module.exports = {
css: [
// 自定义公共 CSS 文件
'~/assets/css/common.css'
],
build: {
analyze: true,
vendor: [],
maxChunkSize: 300000,
babel: {
plugins: [
[
'component',
{
'libraryName': 'element-ui',
'styleLibraryName': 'theme-chalk'
}
]
]
}
},
plugins: [
{ src: '~/plugins/element-ui', ssr: true }
]
}c) 修改plugins/element-ui.js:
import Vue from 'vue'
import {Carousel, CarouselItem} from 'element-ui'
Vue.use(Carousel)
Vue.use(CarouselItem)打包效果如下图:


三、总结:
nuxt.js中可以使用maxChunkSize配置和按需加载插件babel-plugin-component来优化项目,当然不是通过这两种方式来优化就够了,具体还要根据实际情况来进行更优的优化。
优化之路,任重而道远...