详解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 相关文章推荐
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之三
Jan 03 Javascript
js星星评分效果
Jul 24 Javascript
jQuery中:file选择器用法实例
Jan 04 Javascript
AngularJS实现表单验证
Jan 28 Javascript
JS采用绝对定位实现回到顶部效果完整实例
Jun 20 Javascript
封装获取dom元素的简单实例
Jul 08 Javascript
JavaScript SHA1加密算法实现详细代码
Oct 06 Javascript
在JS中a标签加入单击事件屏蔽href跳转页面
Dec 16 Javascript
利用ES6语法重构React组件详解
Mar 02 Javascript
React项目动态设置title标题的方法示例
Sep 26 Javascript
JavaScript多种页面刷新方法小结
Apr 04 Javascript
js实现点击上传图片并设为模糊背景
Aug 02 Javascript
详解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连接Oracle for NT 远程数据库
2006/10/09 PHP
PHP开发中常用的三个表单验证函数使用小结
2010/03/03 PHP
php后台多用户权限组思路与实现程序代码分享
2012/02/13 PHP
幻灯片带网页设计中的20个奇妙应用示例小结
2012/05/27 Javascript
JS编程小常识很有用
2012/11/26 Javascript
window.location.reload()方法刷新页面弹出要再次显示该网页对话框
2013/04/24 Javascript
用jQuery与JSONP轻松解决跨域访问的问题
2014/02/04 Javascript
jQuery 1.9使用$.support替代$.browser的使用方法
2014/05/27 Javascript
深入分析jsonp协议原理
2015/09/26 Javascript
Bootstrap每天必学之弹出框(Popover)插件
2016/04/25 Javascript
Vue.js 和 MVVM 的注意事项
2016/11/07 Javascript
JavaScript中清空数组的三种方式
2017/03/22 Javascript
Vue 2.X的状态管理vuex记录详解
2017/03/23 Javascript
Angular实现的敏感文字自动过滤与提示功能示例
2017/12/29 Javascript
vue-cli3.0+element-ui上传组件el-upload的使用
2018/12/03 Javascript
详解如何使用node.js的开发框架express创建一个web应用
2018/12/20 Javascript
Vue使用Clipboard.JS在h5页面中复制内容实例详解
2019/09/03 Javascript
react使用CSS实现react动画功能示例
2020/05/18 Javascript
Express 配置HTML页面访问的实现
2020/11/01 Javascript
Python导入oracle数据的方法
2015/07/10 Python
Python实现多进程共享数据的方法分析
2017/12/04 Python
python输入整条数据分割存入数组的方法
2018/11/13 Python
pandas计算最大连续间隔的方法
2019/07/04 Python
利用python3 的pygame模块实现塔防游戏
2019/12/30 Python
TensorFlow通过文件名/文件夹名获取标签,并加入队列的实现
2020/02/17 Python
Python使用Socket实现简单聊天程序
2020/02/28 Python
python requests包的request()函数中的参数-params和data的区别介绍
2020/05/05 Python
Tensorflow卷积实现原理+手写python代码实现卷积教程
2020/05/22 Python
pycharm 的Structure界面设置操作
2021/02/05 Python
机械个人求职信范文
2014/01/24 职场文书
打架检讨书2000字
2014/02/22 职场文书
责任担保书范文
2014/05/21 职场文书
2014年幼儿园后勤工作总结
2014/11/10 职场文书
2015年安康杯竞赛活动总结
2015/03/26 职场文书
Django程序的优化技巧
2021/04/29 Python
JS前端使用canvas实现物体的点选示例
2022/08/05 Javascript