详解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 相关文章推荐
如何实现iframe(嵌入式帧)的自适应高度
Jul 26 Javascript
js 图片轮播(5张图片)
Dec 30 Javascript
将jQuery应用于login页面的问题及解决
Oct 17 Javascript
ECMAScript 创建自己的js类库
Nov 22 Javascript
javascript实现分栏显示小技巧附图
Oct 13 Javascript
深入浅析javascript立即执行函数
Oct 23 Javascript
JavaScript基础篇(6)之函数表达式闭包
Dec 11 Javascript
jQuery基本选择器(实例及表单域value的获取方法)
May 20 Javascript
node.js中cluster的使用教程
Jun 09 Javascript
微信小程序 页面跳转传值实现代码
Jul 27 Javascript
Angular.js中上传指令ng-upload的基本使用教程
Jul 30 Javascript
JS多个异步请求 按顺序执行next实现解析
Sep 16 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
DOTA2 探索永无止境 玩家自创强悍插眼攻略
2020/04/20 DOTA
历史证明,懒惰才是推动科学发展技术进步的动力
2021/03/02 无线电
php文件缓存类用法实例分析
2015/04/22 PHP
基于laravel制作APP接口(API)
2016/03/15 PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
2016/10/31 PHP
详谈phpAdmin修改密码后拒绝访问的问题
2017/04/03 PHP
可兼容php5与php7的cURL文件上传功能实例分析
2018/05/11 PHP
表单提交时自动复制内容到剪贴板的js代码
2007/03/16 Javascript
我的javascript 函数链之演变
2011/04/07 Javascript
jquery的相对父元素和相对文档定位示例代码
2013/08/02 Javascript
利用JQuery和Servlet实现跨域提交请求示例分享
2014/02/12 Javascript
Bootstrap每天必学之按钮(一)
2015/11/24 Javascript
vue 自定义全局方法,在组件里面的使用介绍
2018/02/28 Javascript
浅谈React之状态(State)
2018/09/19 Javascript
jQuery实现高度灵活的表单验证功能示例【无UI】
2020/04/30 jQuery
微信小程序连接服务器展示MQTT数据信息的实现
2020/07/14 Javascript
jQuery中getJSON跨域原理的深入讲解
2020/09/02 jQuery
Python语言编写电脑时间自动同步小工具
2013/03/08 Python
pygame游戏之旅 如何制作游戏障碍
2018/11/20 Python
Python 类,property属性(简化属性的操作),@property,property()用法示例
2019/10/12 Python
详解在python操作数据库中游标的使用方法
2019/11/12 Python
增大python字体的方法步骤
2020/07/05 Python
Html5移动端弹幕动画实现示例代码
2018/08/27 HTML / CSS
使用javascript和HTML5 Canvas画的四渐变色播放按钮效果
2014/04/10 HTML / CSS
详解html5 canvas常用api总结(二)--绘图API
2016/12/14 HTML / CSS
eBay法国购物网站:eBay.fr
2017/10/21 全球购物
世界上最好的精品店:Shoptiques
2018/02/05 全球购物
威尔逊皮革:Wilsons Leather
2018/12/07 全球购物
The Kooples美国官方网站:为情侣提供的法国当代时尚品牌
2019/01/03 全球购物
Doyoueven官网:澳大利亚健身服饰和配饰品牌
2019/03/24 全球购物
大学生学习生活的自我评价
2013/11/01 职场文书
就业自荐书
2013/12/05 职场文书
煤矿安全知识竞赛活动总结
2014/07/07 职场文书
学校教师安全责任书
2014/07/23 职场文书
2016寒假社会实践心得体会范文
2015/10/09 职场文书
Python MNIST手写体识别详解与试练
2021/11/07 Python