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

相关推荐
Myli_ing42 分钟前
HTML的自动定义倒计时,这个配色存一下
前端·javascript·html
dr李四维1 小时前
iOS构建版本以及Hbuilder打iOS的ipa包全流程
前端·笔记·ios·产品运营·产品经理·xcode
雯0609~1 小时前
网页F12:缓存的使用(设值、取值、删除)
前端·缓存
℘团子এ1 小时前
vue3中如何上传文件到腾讯云的桶(cosbrowser)
前端·javascript·腾讯云
学习前端的小z1 小时前
【前端】深入理解 JavaScript 逻辑运算符的优先级与短路求值机制
开发语言·前端·javascript
彭世瑜2 小时前
ts: TypeScript跳过检查/忽略类型检查
前端·javascript·typescript
FØund4042 小时前
antd form.setFieldsValue问题总结
前端·react.js·typescript·html
Backstroke fish2 小时前
Token刷新机制
前端·javascript·vue.js·typescript·vue
小五Five2 小时前
TypeScript项目中Axios的封装
开发语言·前端·javascript
小曲程序2 小时前
vue3 封装request请求
java·前端·typescript·vue