nuxt1.4.2下按需加载element-ui2.4.7

最近开始学习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来优化项目,当然不是通过这两种方式来优化就够了,具体还要根据实际情况来进行更优的优化。

优化之路,任重而道远...

1 赞
领支付红包
文章内容仅供参考!欢迎加入技术开发交流QQ群:36479297