详解webpack打包第三方类库的正确姿势


Posted in Javascript onOctober 20, 2018

webpack 的使用越来越广泛,但其中不乏很多鲜为人知的细节设置,甚至很多人会认为这是 webpack 的 bug。这次,我们就来聊一聊 webpack.optimize.CommonsChunkPlugin。

这个 plugin 我相信几乎90%的用 webpack 的都用了这个,但我同样相信几乎 90% 的用了这个 plugin 的人都没有正确的使用。

entry: {
    index: './app/main.jsx',
    vendor: ['react', 'react-dom', 'react-router', 'classnames']
  },
  output: {
    path: path.resolve(__dirname, './dist'),
    filename: "[name].[chunkHash:8].js",
    publicPath: '',
    chunkFilename: "[name].[chunkHash:8].js",
  },
  plugins: [
    new webpack.optimize.CommonsChunkPlugin({
      names: ['vendor'],
    }),
  ]

上面这个配置应该大家都不陌生吧?打包第三方 vendor。

 其实这样写是有问题的。有什么问题呢?我们根据这个配置来操作一下。

 首先,运行起来,我们会得到 vendor.js 的添加 hash 值过后的输出; 

然后,修改index入口里面的任意文件,再次编译,得到 vendor.js 的添加 hash 值过后的输出;

最后,比较 vendor.js 两次编译的hash的值,你会惊讶的发现,为什么hash值改变了?我并没有修改vendor啊。

hash值改变了,那我们打包这个vendor也就没有意义了。

置于为什么会造成这个问题,我就不班门弄斧了,想要知道的人自己去研究一下webpack的底层。

在这里,我只是抛出一个解决方案:

entry: {
    index: './app/main.jsx',
    vendor: ['react', 'react-dom', 'react-router', 'classnames']
  },
  output: {
    path: path.resolve(__dirname, './dist'),
    filename: "[name].[chunkHash:8].js",
    publicPath: '',
    chunkFilename: "[name].[chunkHash:8].js",
  },
  plugins: [
    new webpack.optimize.CommonsChunkPlugin({
      names: ['vendor', 'manifest'],
    }),
  ]

没错,就是上面这个配置,只是简单的加了 'manifest' 。

再次做我们前面的测试,你会发现多了一个manifest.js,但是vendor的hash值不再变化了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于jQuery图片平滑连续滚动插件
Apr 27 Javascript
JQuery 学习笔记 选择器之六
Jul 23 Javascript
jQuery prev ~ siblings选择器使用介绍
Aug 09 Javascript
jquery检测input checked 控件是否被选中的方法
Mar 26 Javascript
JavaScript实现16进制颜色值转RGB的方法
Feb 09 Javascript
微信内置浏览器私有接口WeixinJSBridge介绍
May 25 Javascript
浅谈javascript:两种注释,声明变量,定义函数
Sep 29 Javascript
Boostrap实现的登录界面实例代码
Oct 09 Javascript
jQuery each和js forEach用法比较
Feb 27 jQuery
ES6 Object方法扩展的应用实例分析
Jun 25 Javascript
html+vue.js 实现漂亮分页功能可兼容IE
Nov 07 Javascript
vue3中provide && inject的使用
Jul 01 Vue.js
详解ES6 Promise对象then方法链式调用
Oct 20 #Javascript
Intellij IDEA搭建vue-cli项目的方法步骤
Oct 20 #Javascript
分享5个小技巧让你写出更好的 JavaScript 条件语句
Oct 20 #Javascript
angular4 获取wifi列表中文显示乱码问题的解决
Oct 20 #Javascript
vue 项目地址去掉 #的方法
Oct 20 #Javascript
VUE-cli3使用 svg-sprite-loader
Oct 20 #Javascript
vuex2中使用mapGetters/mapActions报错的解决方法
Oct 20 #Javascript
You might like
php实现mysql同步的实现方法
2009/10/21 PHP
windows7下php开发环境搭建图文教程
2015/01/06 PHP
php根据数据id自动生成编号的实现方法
2016/10/16 PHP
JS backgroundImage控制
2009/05/19 Javascript
跨浏览器的 mouseenter mouseleave 以及 compareDocumentPosition的使用说明
2010/05/04 Javascript
javascript Array数组对象的扩展函数代码
2010/05/22 Javascript
jQuery搜索同辈元素方法
2015/02/10 Javascript
JS实现仿中关村论坛评分后弹出提示效果的方法
2015/02/23 Javascript
javascript实现简单的二级联动
2015/03/19 Javascript
用JavaScript实现对话框的教程
2015/06/04 Javascript
基于JS实现PHP的sprintf函数实例
2015/11/14 Javascript
微信开发 微信授权详解
2016/10/21 Javascript
JavaScript中的toString()和toLocaleString()方法的区别
2017/02/15 Javascript
jquery.uploadView 实现图片预览上传功能
2017/08/10 jQuery
详解Vue-cli3.X使用px2rem遇到的问题
2019/08/09 Javascript
解决新建一个vue项目过程中遇到的问题
2020/10/22 Javascript
vue render函数动态加载img的src路径操作
2020/10/26 Javascript
[01:06:30]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第二场 1月9日
2021/03/11 DOTA
由Python运算π的值深入Python中科学计算的实现
2015/04/17 Python
pycharm+django创建一个搜索网页实例代码
2018/01/24 Python
Python爬虫抓取代理IP并检验可用性的实例
2018/05/07 Python
解决python写入mysql中datetime类型遇到的问题
2018/06/21 Python
python实现电子产品商店
2019/02/26 Python
在Pytorch中计算自己模型的FLOPs方式
2019/12/30 Python
使用keras实现Precise, Recall, F1-socre方式
2020/06/15 Python
Champs Sports加拿大:北美最大的以商场为基础的专业运动鞋和服装零售商之一
2018/05/01 全球购物
Banana Republic欧盟:美国都市简约风格的代表品牌
2018/05/09 全球购物
大唐电信科技股份有限公司java工程师面试经历
2016/12/09 面试题
P/Invoke是什么
2015/07/31 面试题
Overload和Override的区别
2012/09/02 面试题
小学安全教育材料
2014/02/17 职场文书
联欢晚会主持词
2014/03/25 职场文书
合作意向书模板
2014/03/31 职场文书
向国旗敬礼活动总结范文2014
2014/09/27 职场文书
教师专业技术工作总结2015
2015/05/13 职场文书
创业计划书之青年旅馆
2019/09/23 职场文书