webpack打包分离第三方库和业务代码

使用webpack打包工程,通常会需要分离第三方类库和应用本身的代码,因为第三方类库更新频率不高,这样浏览器可以直接从缓存读,不需要项目每次上线再获取一次。

以react为例,正常情况下,最初是这么配置的:

 1 module.exports = {
 2     entry: {
 3         app: "./src/App.js",
 4         vendor: ["react", "react-dom"]
 5     },
 6     output: {
 7         path: __dirname + "/dist",
 8         filename: "[name].[chunkhash:8].js",
 9         publicPath: "/dist/"
10     },
11     ...
12     plugins: [
13         ...
14         new webpack.optimize.CommonsChunkPlugin({
15             names: ["vendor"]
16         })
17     ]
18 };

然后我们会发现,一旦应用代码发生变化,重新打包后app.js和vendor.js的hash值都会发生变化,具体原因大致就是由于app.js变了,webpack会生成一段runtime注入vendor.js,导致vendor.js也变了(因为两者有关联)。

解决方法目前我知道二种比较好。

第一种是利用webpack.DllPlugin,具体使用方法网上很多,配置稍微有点复杂,这里不列举了。

第二种方法是利用CommonsChunkPlugin生成一个专门跟踪vendor.js变化的js文件,一般可以取名manifest.js,具体配置如下:

 1 module.exports = {
 2     entry: {
 3         app: "./src/App.js",
 4         vendor: ["react", "react-dom"]
 5     },
 6     output: {
 7         path: __dirname + "/dist",
 8         filename: "[name].[chunkhash:8].js",
 9         publicPath: "/dist/"
10     },
11     ...
12     plugins: [
13         ...
14         new webpack.optimize.CommonsChunkPlugin({
15             names: ["vendor", "manifest"]
16         })
17     ]
18 };

其中CommonsChunkPlugin的配置还能这么配:

 1 module.exports = {
 2     ...
 3     plugins: [
 4         ...
 5         new webpack.optimize.CommonsChunkPlugin({
 6             names: ["vendor"]
 7         }),
 8         new webpack.optimize.CommonsChunkPlugin({
 9             names: ["manifest"],
10             chunks: ["vendor"]
11         })
12     ]
13 };

完成后我们修改应用代码,再重新打包,结果vendor.js的hash值不再发生变化。

我看过的网上的教程,基本上都到这里就结束了。然而当我运行代码,想查看效果,结果却是空白页,chrome下有报错:

???

当时真是一下就懵了。google、stackoverflow搜了好久都没找到满意的答案(可能是搜商比较低)。

后来我无意中去看生成的index.html,发现里面插入的js顺序是这样的:

然后再打开chrome里的第一行报错:

发现报错是从app.js开始的。正常情况下应该是app.js引用vendor.js中的方法,即app.js的加载顺序应该在vendor.js之后,但现在顺序却颠倒了,会不会是这个原因造成的?

于是我们手动修改index.html,交换一下app.js和vendor.js的加载顺序。再重新运行代码,结果显示正确了。

看来是chunks注入顺序混乱导致的,那有没有方法按照正确的引用顺序注入呢?这就要看html-webpack-plugin插件了。

原本关于html-webpack-plugin插件我们是这么配的:

 1 module.exports = {
 2     ...
 3     plugins: [
 4         ...
 5         new HtmlPlugin({
 6             filename: "../index.html",
 7             template: __dirname + "/src/templates/index.html"
 8         })
 9     ]
10 };

而html-webpack-plugin中有个配置项叫chunksSortMode,它可以指定chunks注入的顺序,其可以配置为:"none" | "auto" | "dependency" | {function}。默认配置是"auto"。

现在我们加上这个配置项,并配置为"dependency":

 1 module.exports = {
 2     ...
 3     plugins: [
 4         ...
 5         new HtmlPlugin({
 6             filename: "../index.html",
 7             template: __dirname + "/src/templates/index.html",
 8             chunksSortMode: "dependency"
 9         })
10     ]
11 };

然后再重新打包,再看index.html,发现这下app.js在vendor.js后面了,最后运行程序也能正常显示了。

原文地址:https://www.cnblogs.com/lcosima/p/8909986.html

时间: 2024-10-10 00:33:58

webpack打包分离第三方库和业务代码的相关文章

关于使用第三方库masonry的代码实例

今天用自动布局纯代码的方式,并且引用第三方库写了一个微博界面的案例,其中的每个约束之间都是相互联 系的,例如label 和 text 不能设置宽度和高度的具体数值,一旦固定下来,可能会出现错误,例如不会 换行,文字显示不全等等一些列问题, 一个技巧,手动布局时,最好从一侧开始进行约束,一般推荐上面和左侧,进行约束,约束时,一定要找一个 固定的控件进行参考,在执行约束,否则,因为优先级的缘故,可能被优先级高的一方拽走,这里是要注意的 地方,下面是截取的一段实例进行了简要的说明,也对自动布局的理解做

webpack window 添加第三方库

有的时候还想来点jquery,moment,undersocre之类的库,webpack可以非常容易的做到这一点,有谣言说Bower即将停止开发了, 作者推荐都使用npm来管理依赖.那么我们现在安装在我们的app中添加jquery和moment的支持. npm install jquery moment --save-dev 注释掉之前的index.js的代码,在index.js中加上 var sub = require('./sub'); var $ = require('jquery');

Uiautomator打包使用第三方库,报错的解决方案

问题引源: 在做自动化过程中,想在用例执行完毕后,自动生成该用例测试报告: 报告定义为Excel格式文件,且在用例执行过程中生成. 所以我在Uiautomator工程中引用了jxl.jar,用以处理Excel文件 写好无误后,出现打包错误,如下图: 1. 将jar包的路径,放到compile下 通过修改uibuild.xml(文件路径:${sdk.dir}/tools/ant/uibuild.xml) 2. 把class的路径加入到classes.dex文件中       3.    可以看到,

高稳定、低延时、高并发RTMP播放器流媒体音视频播放器EasyPlayer-RTMP-iOS器如何将核心代码打包成静态库

背景分析 RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写.该协议基于TCP,是一个协议族,包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种.RTMP是一种设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信.支持该协议的软件包括Adobe Media Server/Ultrant Media Server/red5等. EasyPlayer-RTMP

webpack打包体积优化

webpack打包的体积越小,对于部署应用的网站来说,性能越好,加载速度越快. 1. 分析打包文件 1. 生成统计信息文件 首先需要通过webpack命令生成统计信息的文件.在package.json的脚本中添加命令 "scripts": { "stats": "webpack --config webpack.prod.js --profile --json > stats.json", //... } 上面的命令会在根目录下生成一个st

Python之常用第三方库总结

在使用python进行开发的时候,经常我们需要借助一些第三方库,进行日常代码的开发工作.这里总结一些常用的类库 1. requests Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库.它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求.Requests 的哲学是以 PEP 20 的习语为中心开发的,所以它比 urllib 更加 Pythoner.更重要的一点是它支持 Python3

webpack 的第三方库分离并持久化缓存

我们常常需要在浏览器缓存一些稳定的资源,如第三方库等.要达到这个目标,只需要两步: 1.提取出"稳定的资源": 2.提供稳定的文件hash . webpack中提取公共模块一般使用 webpack 内置的  CommonsChunkPlugin 插件,他可以提取出 入口chunk中 的公共模块: 1.minChunks 参数 是指  至少有minChunks个入口引用的模块才会提取出来,infinity等于入口数量,即所有入口都引用的模块才会提取出来: 上面的例子是一个SPA,入口是m

Webpack 4.X 从入门到精通 - 第三方库(六)

在开发的时候会时常用到第三方的库或者框架,比如耳熟能详的jquery.借助它们能提高开发效率,但是如何在webpack中使用呢.这篇文章介绍两个东西,如何使用第三方库以及如何提取第三方库. 使用第三方库 1.在入口文件当中直接导入 安装jQuery npm i jquery -S 目录结构如图: package.json内容如下: { "name": "webpack-demo", "version": "1.0.0", &q

前端项目模块化的实践2:使用 Webpack 打包基础设施代码

以下是关于前端项目模块化的实践,包含以下内容: 搭建 NPM 私有仓库管理源码及依赖: 使用 Webpack 打包基础设施代码: 使用 TypeScript 编写可靠类库 (实现中) 本文是关于前端项目模板化的第2部分 现状 实际项目远远比示例使用的 myGreeting 复杂,比如 为了提高可维护性我们将项目折成了许多功能模板: 我们希望使用 Promise 等语法等,但是顾忌目标环境的支持能力: 可能依赖了多个第三方类库: 为了提高加载速度我们打包时需要进行很多额外工作: 代码压缩: Tre