使用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 newwebpack.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 newwebpack.optimize.CommonsChunkPlugin({

15 names: ["vendor", "manifest"]

16 })

17 ]

18 };

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

1 module.exports ={

2 ...

3 plugins: [

4 ...

5 newwebpack.optimize.CommonsChunkPlugin({

6 names: ["vendor"]

7 }),

8 newwebpack.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 newHtmlPlugin({

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 newHtmlPlugin({

6 filename: "../index.html",

7 template: __dirname + "/src/templates/index.html",

8 chunksSortMode: "dependency"

9 })

10 ]

11 };

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

webpack 打包第三方库_webpack打包分离第三方库和业务代码相关推荐

  1. webpack打包路径更改_webpack打包教程

    创建package.json文件 命令:npm init 安装webpack npm install --save-dev webpack npm install --save-dev webpack ...

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

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

  3. webpack 打包第三方库_Webpack 打包第三方代码库

    共四篇文章都是在总结 Webpack.其中,[译]为什么要 Webpack 写了使用 Webpack 的动机和它的显著特征.其余三篇,主要是围绕怎么解决 Webpack 构建出来的文件太大展开,分别是 ...

  4. webpack打开项目命令_webpack打包好的页面在项目中怎么运行?

    使用webpack打包好了页面和相关的js文件,然后命令输入webpack-dev-server,再浏览器中输入: http://localhost:9090/WebRoot... 打开页面能正常的加 ...

  5. 【Linux】动态库与静态库,如何打包库,如何使用第三方库

    文章目录 回顾基础 学会打包自己的库并使用 静态库 打包库 第三方库的使用 动态库 打包库 第三方库的使用 动态库加载以及周边问题 回顾基础 这篇文章主要对动静态库进行进一步的学习,关于动静态库的一些 ...

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

    在开发的时候会时常用到第三方的库或者框架,比如耳熟能详的jquery.借助它们能提高开发效率,但是如何在webpack中使用呢.这篇文章介绍两个东西,如何使用第三方库以及如何提取第三方库. 使用第三方 ...

  7. webpack 原理图_webpack打包原理

    展开全部 将根据文件间32313133353236313431303231363533e78988e69d8331333433643638的依赖关系对其进行静态分析,然后将这些模块按指定规则生成静态资 ...

  8. pom 的第三方jar报错_01_maven-将第三方jar包一起打包到项目 jar 包中

    前言:maven-将依赖的 jar包一起打包到项目 jar 包中 有时候在项目开发中,需要很多依赖的 jar 包,其中依赖的 jar 包也会依赖其他的 jar 包,导致jar 包的管理很容易不全. 如 ...

  9. SpringBoot引入第三方SDK以及打包

    SpringBoot引入第三方SDK以及打包 首先在自己工程引入jar包 pom文件引入 首先在自己工程引入jar包 项目结构如下 引入完成以后就可以在自己pom文件引入了 pom文件引入 <d ...

最新文章

  1. 爬虫获取html页面,页面爬虫(获取其他页面HTML)加载到自己页面示例
  2. 可心耳语-属于网络工程师的人声电台(第一期)
  3. 012_CSS相邻兄弟选择器
  4. Guice系列之用户指南(十)
  5. 广播系统android安全:flag FLAG_RECEIVER_REGISTERED_ONLY的意义
  6. MR21批量修改物料价格-BDC
  7. 一个简单的c++/cli中委托与事件的处理模型
  8. c语言程序设计7.4思考题答案,C语言程序设计习题集及答案(7)
  9. 命令行开发、编译、打包Android应用程序
  10. 分析思维模型:SPACE 矩阵
  11. NCRE一到四级的刷题软件
  12. 比较motif和一条长序列的相似性
  13. 006 研究生学信网的电子注册备案表在哪里弄
  14. 多兴趣模型实践ComiRec代码解读
  15. 如何在iPhone/iPad上录屏
  16. 深度学习: ground truth 解释
  17. 模电学习02:晶体三极管
  18. java中的repo什么意思_java – Spring数据jpa repo,为什么需要接口服务和服务实现
  19. 基于qt和opencv3人脸检测
  20. 纯CSS画的基本图形(矩形、圆形、三角形、多边形、爱心、八卦等)

热门文章

  1. 使用pagination分页插件实现Ajax动态分页
  2. Min_25筛学习Tip+链接
  3. 缓冲区溢出漏洞攻击演示实验(CProxy 6.2缓冲区溢出漏洞)
  4. apr_pool -- 内存池
  5. C++ STL : 模拟实现STL中的容器适配器stack和queue
  6. 为什么字节跳动选择使用 Go 语言?
  7. 容器与Pod到底有什么区别和联系?
  8. 漫画TCP——一个悲伤的故事
  9. 不是keys,记一次因 redis 使用不当导致应用卡死 的过程
  10. C++中的继承(一)