Webpack的dll功能的使用

这篇文章主要介绍了webpack的dll功能使用,内容挺不错,现在分享给大家,也给大家做个参考。

最近使用Webpack遇到了一个坑。

我们构建前端项目的时候,往往希望第三方库(vendors)和自己写的代码可以分开打包,因为第三方库往往不需要经常打包更新。对此Webpack的文档建议用CommonsChunkPlugin来单独打包第三方库。

entry: { vendor: ["jquery", "other-lib"], app: "./entry"}new CommonsChunkPlugin({ name: "vendor", // filename: "vendor.js" // (Give the chunk a different name) minChunks: Infinity, // (with more entries, this ensures that no other module // goes into the vendor chunk)})

登录后复制

通常为了对抗缓存,我们会给售出文件的文件名中加入hash的后缀——但是——我们编辑了app部分的代码后,重新打包,发现vendor的hash也变化了!

Webpack的dll功能的使用

这么一来,意味着每次发布版本的时候,vendor代码都要刷新,即使我并没有修改其中的代码。这样并不符合我们分开打包的初衷。

带着问题我浏览了Github上的讨论,发现了一个神器:dll。

Dll是Webpack最近新加的功能,我在网上并没有找到什么中文的介绍,所以在这里我就简单介绍一下。

Dll这个概念应该是借鉴了Windows系统的dll。一个dll包,就是一个纯纯的依赖库,它本身不能运行,是用来给你的app引用的。

打包dll的时候,Webpack会将所有包含的库做一个索引,写在一个manifest文件中,而引用dll的代码(dll user)在打包的时候,只需要读取这个manifest文件,就可以了。

这么一来有几个好处:

Dll打包以后是独立存在的,只要其包含的库没有增减、升级,hash也不会变化,因此线上的dll代码不需要随着版本发布频繁更新。

App部分代码修改后,只需要编译app部分的代码,dll部分,只要包含的库没有增减、升级,就不需要重新打包。这样也大大提高了每次编译的速度。

假设你有多个项目,使用了相同的一些依赖库,它们就可以共用一个dll。

如何使用呢?

首先要先建立一个dll的配置文件,entry只包含第三方库:

const webpack = require('webpack');const vendors = [ 'antd', 'isomorphic-fetch', 'react', 'react-dom', 'react-redux', 'react-router', 'redux', 'redux-promise-middleware', 'redux-thunk', 'superagent',];module.exports = { output: {  path: 'build',  filename: '[name].[chunkhash].js',  library: '[name]_[chunkhash]', }, entry: {  vendor: vendors, }, plugins: [  new webpack.DllPlugin({   path: 'manifest.json',   name: '[name]_[chunkhash]',   context: __dirname,  }), ],};

登录后复制

webpack.DllPlugin的选项中,path是manifest文件的输出路径;name是dll暴露的对象名,要跟output.library保持一致;context是解析包路径的上下文,这个要跟接下来配置的dll user一致。

运行Webpack,会输出两个文件一个是打包好的vendor.js,一个就是manifest.json,长这样:

{ "name": "vendor_ac51ba426d4f259b8b18", "content": {  "./node_modules/antd/dist/antd.js": 1,  "./node_modules/react/react.js": 2,  "./node_modules/react/lib/React.js": 3,  "./node_modules/react/node_modules/object-assign/index.js": 4,  "./node_modules/react/lib/ReactChildren.js": 5,  "./node_modules/react/lib/PooledClass.js": 6,  "./node_modules/react/lib/reactProdInvariant.js": 7,  "./node_modules/fbjs/lib/invariant.js": 8,  "./node_modules/react/lib/ReactElement.js": 9,    ............

登录后复制

Webpack将每个库都进行了编号索引,之后的dll user可以读取这个文件,直接用id来引用。

Dll user的配置:

const webpack = require('webpack');module.exports = { output: {  path: 'build',  filename: '[name].[chunkhash].js', }, entry: {  app: './src/index.js', }, plugins: [  new webpack.DllReferencePlugin({   context: __dirname,   manifest: require('./manifest.json'),  }), ],};

登录后复制

DllReferencePlugin的选项中,context需要跟之前保持一致,这个用来指导Webpack匹配manifest中库的路径;manifest用来引入刚才输出的manifest文件。

运行Webpack之后,结果如下:

Webpack的dll功能的使用

对比一下不做分离的情况下打包的结果:

Webpack的dll功能的使用

速度快了,文件也小了。

平时开发的时候,修改代码后重新编译的速度会大大减少,节省时间。

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

SpringBoot和Vue.js实现前后端分离的文件上传功能

如何安装angular6.0框架的教程

以上就是Webpack的dll功能的使用的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2747922.html

(0)
上一篇 2025年3月8日 04:32:27
下一篇 2025年2月26日 05:44:12

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论