webpack打包优化

1. 包大小分析
  • 我们可以使用vue-cli本身提供的性能分析工具,对我们开发的所有功能进行打包分析,它的应用非常简单
  • npm run preview -- --report执行完这个命令,我们会看到如下的页面 (preview以package.json文件配置的命令为准;详见 如图所示,方块越大,说明该文件占用的文件越大,文件越大,对于网络带宽和访问速度的要求就越高,这也就是我们优化的方向,比如Xlsx文件就很大,而且这类插件长期不需要我们进行更新
2. 配置排除大文件打包

那些体积太大而且长期不会发生变化的包,我们可以通过webpack的配置进行排除,不打入最终的包里

  • 使用方法
  1. 先找到 vue.config.js, 在configureWebpack下添加 externalswebpack 不打包 vue xlsxelement
vue.config.js 复制代码
+ configureWebpack: {
  // 配置单页应用程序的页面的标题
  name: name,
+  externals: {
     /**
      * externals 对象属性解析:
      * '包名' : '模块内置对象'
    */
    'vue': 'Vue',
    'element-ui': 'ELEMENT',
    'xlsx': 'XLSX'
+  },
  resolve: {
    alias: {
      '@': resolve('src')
    }
  }

说明:再次运行命令,我们会发现包的大小已经大幅减小

3.CDN文件配置

没有被打包的三个模块不能就不管了,项目还是需要依赖的,它们几个我们就可以采用CDN的方式引入了

  • CDN好处:
  1. 减少应用打包出来的包体积
  2. 加快静态资源的访问
  3. 利用浏览器缓存,不会变动的文件长期缓存
  • CDN地址配置:
vue.config.js 复制代码
let externals = {}
let cdn = { css: [], js: [] }
const isProduction = process.env.NODE_ENV === 'production' // 判断是否是生产环境
if (isProduction) {
  externals = {
      'vue': 'Vue',
      'element-ui': 'ELEMENT',
      'xlsx': 'XLSX'
  }
  cdn = {
    css: [
      // element-ui css 样式表
      'https://cdn.jsdelivr.net/npm/element-ui@2.13.2/lib/theme-chalk/index.css' 
    ],
    js: [
      // vue must at first!
      'https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.min.js',
      // element-ui js
      'https://cdn.jsdelivr.net/npm/element-ui@2.13.2/lib/index.js', 
      // xlsx
      'https://cdn.jsdelivr.net/npm/xlsx@0.16.6/dist/xlsx.full.min.js'
    ]
  }
}

说明:根据环境变量动态设置配置

  • webpack配置externals配置项
vue.config.js 复制代码
configureWebpack: {
  // 配置单页应用程序的页面的标题
  name: name,
+  externals: externals,
  resolve: {
    alias: {
      '@': resolve('src')
    }
  }
}

注意⚠️:因为生产环境使用CDN方式引入Element样式,所以样式引入要在main入口排除

main.js 复制代码
import ElementUI from 'element-ui'
- import 'element-ui/lib/theme-chalk/index.css'

+ if (process.env.NODE_ENV === 'development') {
+   require('element-ui/lib/theme-chalk/index.css')
+ }
4. 注入CDN文件到页面
  1. 通过配置chainWebpack选项,借助 html-webpack-plugin注入CDN到 index.html之中:
vue.config.js 复制代码
chainWebpack(config) {
  config.plugin('preload').tap(() => [
    {
      rel: 'preload',
      fileBlacklist: [/\.map$/, /hot-update\.js$/, /runtime\..*\.js$/],
      include: 'initial'
    }
  ])
  // 注入cdn变量 (打包时会执行)
+  config.plugin('html').tap(args => {
    args[0].cdn = cdn // 配置cdn给插件
    return args
+  })
  ...
}
  1. 找到 public/index.html 通过你配置的CDN Config 依次注入 css 和 js
index.html 复制代码
<head>
  <!-- 引入样式 -->
  <% for(var css of htmlWebpackPlugin.options.cdn.css) { %>
    <link rel="stylesheet" href="<%=css%>">
  <% } %>
</head>

<body>   
<div id="app"></div>  
<!-- built files will be auto injected -->    
<!-- 引入JS -->
<% for(var js of htmlWebpackPlugin.options.cdn.js) { %>
  <script src="<%=js%>"></script>
<% } %>
  
</body>    
  1. 最后,进行打包

npm run build:prod

相关推荐
会发光的猪。17 分钟前
【 ElementUI 组件Steps 步骤条使用新手详细教程】
前端·javascript·vue.js·elementui·前端框架
我家媳妇儿萌哒哒18 分钟前
el-table合并单元格之后,再进行隔行换色的且覆盖表格行鼠标移入的背景色的实现
前端·javascript·elementui
baiduguoyun33 分钟前
react的import 导入语句中的特殊符号
前端·react.js
前端青山34 分钟前
webpack指南
开发语言·前端·javascript·webpack·前端框架
NiNg_1_2341 小时前
ECharts实现数据可视化入门详解
前端·信息可视化·echarts
励志前端小黑哥2 小时前
有了Miniconda,再也不用担心nodejs、python、go的版本问题了
前端·python
喵叔哟2 小时前
重构代码之取消临时字段
java·前端·重构
还是大剑师兰特2 小时前
D3的竞品有哪些,D3的优势,D3和echarts的对比
前端·javascript·echarts
王解2 小时前
【深度解析】CSS工程化全攻略(1)
前端·css
一只小白菜~2 小时前
web浏览器环境下使用window.open()打开PDF文件不是预览,而是下载文件?
前端·javascript·pdf·windowopen预览pdf