手头做的项目开发得差不多了,而打包配置是一开始粗略配置的,不大的项目打包出来得6MB+,所以现在必须进行优化。

打包结果分析

执行命令 webpack --profile --json > stats.json ,可以将打包过程的详细信息以 json 格式记录到文件中。依据该文件,webpack-bundle-analyzer、Webpack Chart 等分析工具会以可视化的形式展示打包过程和结果。

如果不想用这些额外工具,通过命令 webpack --display-modules --sort-modules-by size ,webpack 会在日志中按大小排序显示所有模块。

我在项目中,将第三方库基本都集中打包到一个 chunk (vendors),业务逻辑单独一个 chunk (app)。打包总体积的大头来自 vendors,其中antd占据大头(3MB+)、moment占据约500KB、提取的 css 约300KB、react-dom也是500KB+,出乎意料的是 lodash 也是500KB+。

逐个击破

设置环境变量 NODE_ENVproduction

不少库会按开发环境(development)和生产环境(production)提供不同的文件,主要是为了开发模式下的调试,也会因此有文件体积上的差别。用于生产环境的打包,设置其为production后,这些库会提供最小体积的文件。

plugins: [// ...new webpack.DefinePlugin({'process.env': {NODE_ENV: JSON.stringify('production')}}),// ...
]

css-loader

css-loader 在 webpack 默认不开启压缩,需要设置 css-loader?minimize

module: {// ...{test: /\.css$/,use: ExtractTextPlugin.extract({fallback: 'style-loader',use: 'css-loader?minimize'})}// ...
}

大头——antd (ant design)

因为并没有使用 antd 的所有组件,所以按需加载是必需的。根据其文档(按需加载 - Ant Design),需要安装 bable 插件 babel-plugin-import ,并在 babel 配置中添加:

{// ..."plugins": [["import", { "libraryName": "antd", "libraryDirectory": "es", "style": "css" }],// ...]
}

在我配置过程中,libraryDirectory 配置的不同也会有较大影响,但按目前文档来看貌似没有影响,待我确认后再做记录。

=== 2018-02-23 更新 ===

看来bable-plugin-import这几天有更新,现在配置项 libraryDirectory 的默认值时 lib,即使用通过 require (commonjs) 引用模块的文件。而先前我在配置的时候并没有默认值,如果没有显示配置 libraryDirectory,打包结果会出现重复的内容。

采用了 es6 module 的项目建议配置 libraryDirectoryes,即使用通过 import (es6 module) 引用模块的文件。这种情况打包后的体积要更小一些。

=== end ===

这里还有很重要一点,babel-plugin-import 要求 antd 不能被提取为公共模块 vendors,否则就无法实现按需加载。尚不清楚是 babel 插件的原因,还是这个插件单独的原因。

moment

moment 库的体积开销主要是 i18n 文件,配置 webpack 将用不到 i18n 文件不打包即可。

plugins: [new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /zh-cn/),
]

看上去很轻量的 lodash

lodash看上去就是一些工具函数,应该是很轻量的,然而一次全部加载下来要达到500KB,因此也需要按需加载。它的按需加载还比较麻烦。

lodash为每个方法单独提供了库,但这种方式在实际使用中并不灵活,所以这种最「干净」的方法不建议使用。

像 antd 一样,lodash 也有 babel 插件用于按需加载——babel-plugin-lodash

{// ..."plugins": ["lodash",// ...]
}

同样,lodash 就不能提取到公共模块了。

最后

打包结果的体积开销主要就是以上几项。经过优化后,体积下降至1.5MB以内,还是很客观的。不过 antd 依然占据大头,后续会考虑把 antd 替换掉,毕竟用到的组件不多。

记一次 webpack 打包体积优化相关推荐

  1. webstrom中打包的详细_webpack打包体积优化

    webpack webpack打包体积优化 webpack官方定义 webpack 是一个模块打包器.webpack 的主要目标是将 JavaScript 文件打包在一起,打包后的文件用于在浏览器中使 ...

  2. 小程序打包体积优化策略

    背景 我们都知道微信小程序有包体积限制,整个小程序所有分包大小不超过 20M,单个分包/主包大小不能超过 2M.然而面对业务的不断更新迭代,代码和资源会越来越多,如果不尽早规划包体积的治理,势必有一天 ...

  3. Webpack打包和优化

    webpack打包优化分为两部分,一部分是大小优化,另一部分是速度优化. 大小优化 1.CommonsChunk 前端构建项目中,为了提高打包效率,往往将第三库与业务逻辑代码分开打包,因为第三方库往往 ...

  4. 解决webpack打包体积过大的问题

    项目中引用了vue.vue-router.axios.element-ui.qs等第三方库,导致打包后文件体积过大. 1 通过cdn引入第三方库. 1.1 在/build/webpack.base.c ...

  5. vant 引进单个样式_记一次webpack打包样式加载问题

    今天是周六. 我过来加班了. 是因为一个属性问题. 俗话说一杯茶一包烟一个bug改一天 感觉这句话就是特意为我准备的(我加班的时候喝奶茶,抽烟,而且就一个bug.哈哈哈哈哈哈哈哈哈哈或或或或或或或或或 ...

  6. webpack 打包编译优化之路

    一.摘要 从最初的html css js 混合编程,到分离编程.再到用上各种框架 react vue angular , 伴随着框架和模块化的概念铺开,打包编译工具渐渐浮出水面.从2013年开始使用打 ...

  7. webpack打包优化(webpack打包优化 文件大小)

    webpack 打包怎么优化的 解决webpack打包的文件体积过大的问题: 确实,每次打包从入口开始,会parse所有的依赖,多的时候竟然打包一次要2秒多,简直不能忍.然而,有几个解决方案,最有效的 ...

  8. 移动spa商城优化记(一)---首屏优化篇

    背景 随着公司业务的不断壮大,最近老是有用户反应公司APP内的商城打开比较慢,这可不行啊,慢了容易流失用户,流失用户减少公司业绩,公司业绩少我的年终奖就少----,所以为了公司,也为了自己,开始优化之 ...

  9. webpack系列之优化策略

    1.打包速度优化 1.1.速度监控插件-speedMeasureWebpackPlugin speed-measure-webpack-plugin是一款能检测Loader和Plugin耗时的插件,具 ...

最新文章

  1. 新冠最凶变种出现!突变量德尔塔两倍,专家称感染率超原毒株500%,引发全球股市震荡...
  2. c语言程序开发过程上机步骤,C语言程序上机步骤2010.doc
  3. Excel 2010单元格中设置表头
  4. 收藏 | 49 个 Python 学习资源
  5. C# foreach迭代器
  6. qemu+linux+x86+64,kvm 内部错误:无法找到适合 x86_64 的模拟器
  7. Java内存区域(运行时数据区域)和内存模型(JMM)
  8. RabbitMQ消息幂等性问题
  9. Linux引导流程(第二版)
  10. heartbeat与keepalived对比
  11. 【BZOJ1040】【codevs1423】骑士,第一次的基环外向树DP
  12. Spring-context-ConfigurationClassBeanDefinitionReader类
  13. 微型计算机8位数据总线,微机原理答案1
  14. STM32固件库编成基础教程
  15. su vary注册机_vray for sketchup2018下载
  16. ubuntu16.04下安装wine及TIM
  17. 怎么做国外的问卷调查
  18. 8款网页瀑布流布局插件(很不错的效果)
  19. 马科维茨均值方差模型
  20. 分布式系统-共识协议

热门文章

  1. LLBL Gen Pro 设计器使用指南
  2. 推荐一款UI设计软件Balsamiq Mockups
  3. webService 使用CXF 实现简单的helloworld
  4. 暴雪还不赶快?劳拉与光之守护者PC平台登陆
  5. android 粘性service,Android服务1 Service
  6. jar包导出无法显示图片或者音乐_音乐曲谱软件-Guitar Pro 7 for Mac
  7. 目标检测--边界框(bounding box)解析
  8. Allegro如何导入导出DXF
  9. 用shp制作geoJson格式地图数据(shp convert to geoJson)
  10. 如何让服务器端持续监听客户端的请求?