| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> JavaScript知识库 -> webpack--打包优化 -> 正文阅读 |
|
[JavaScript知识库]webpack--打包优化 |
一、HappyPack HappyPack是一个通过多线程来提升webpack打包速度的工具。
(1)在打包过程中有一项非常耗时的工作,就是使用loader将各种资源进行转译处理。最常见的包括使用babel-loader转移ES6+语法和ts-loader转移TS。
(2)webpack是单线程的。虽然这些转译任务彼此之间没有任何依赖关系,却必须串行地执行。HappyPack恰恰以此为切入点,它的核心特性是可以开启多个线程,并行地对不同模块进行转译,这样就可以充分利用本地地计算资源来提升打包速度。 (3)HappyPack适用于那些转译任务比较重地工程,如babel-loader和ts-loader。
?要用HappyPack提供的loader来替换原有的loader,并将原有的哪个通过HappyPack插件传进去
需要为每个loader配置一个id,否则?HappyPack 无法知道rules与plugins如何一一对应。
二、缩小打包作用域?(1)exclude和include (2)noParse 有些库希望webpack完全不要去解析,即不希望应用任何loader规则,库的内部也不会有对其他模块的依赖,此时可以用noParse对其进行忽略。
webpack3后还支持完整的路径匹配?
?(3)IgnorePlugin (1)它可以完全排除一些模块,被排除的模块即便被引用了也不会被打包进资源文件中。 (2)这对于排除一些库相关文件非常有用。一些库产生的额外资源我们用不到但又无法去掉,因为引用的语句处于库文件的内部。(如Mommen.js,为了做本地化它会加载很多语言包,对于我们来说一般用不到其他地区的语言包,但他会占很多体积,这时就可以用IgnorePlugin来去掉)
(4)Cache 1、有些loader会有一个cache配置项,用来在编译代码后同时保存一份缓存,在执行下一次编译前会先检查源码文件是否有变化,如果没有就直接采用缓存,也就是上次编译的结果。这样相当于实际编译的只有变化了的文件,整体速度上会有一定提升。 ?2、webpack5中添加了一个新的配置项“cache:{type : "filesSystem" }”,它会在全局启用一个文件缓存(实验阶段,并且无法自动检测到缓存已过期,目前解决方法:更改后手动修改cache.version来让缓存过期) ?三、动态链接库与DllPlugin(1)动态链接库是早期windows系统由于受限于当时计算机内存空间较小的问题而出现的一种内存优化方法。当一段时间的子流程被多个程序调用时,为了减少内存消耗,可以将这段子程序存储为一个可执行文件,当被多个程序调用时只在内存中生成和使用同一个实例。 (2)DllPlugin借鉴了动态链接库的这种思路,对于第三方模块或者一些不常变化的模块,可以将它们预先编译和打包,然后再项目实际构建过程中直接取用即可。 (3)再打包vendor的时候还会附加生成一份vendor的模块清单,这份清单将会在工程业务模块打包时起到链接和索引的作用。 (4)DllPlugin和代码分片有点类似,都可以用来提取公共模块,但本质上有一些区别。
(1)需要单独创建一个webpack配置文件,如webpack.vendor.config.js。
?entry:指定了把那些模块打包为vendor
(1)在package.js中配置一条npm script
?(2)运行npm ruqianzn dll 后会生成一个dll目录,里面有vendor.js和manifest.json,前者包含了库的代码,后者是资源清单。
(1)DllReferencePlugin 它起到一个索引和链接的作用。
1、当页面执行到vendor.js时,会声明DllExample全局变量。 2、manifest相当于我们注入app.js的资源地图,app.js会先通过name字段找到名为DllExample的library,再进一步获取其内部模块。
1、manifest.json中每个模块都有一个id,其值是按数字顺序递增的。加入一个模块可能会导致id变化。id变化会导致hash变化,导致缓存失效。 2、解决:配置 HashedModuleIdsPlugin
四、tree-shaking(1)作用 1、可以再打包过程中帮助我们检测工程中没有被引用过的模块,这部分代码将永远无法被执行到,因此成为“死代码”。 2、webpack会对这部分代码进行标记,并在资源压缩时将它们从最终的bundle中去掉。 ?(2)前提条件 1、只能对ES6 Module生效。 2、如果我们在工程中使用了babel-loader,那么一定要通过配置来禁用它的模块依赖解析。因为如果有babel-loader来做依赖解析,webpack接收到的就都是转化过的CommonJS形式的模块,无法进行tree-shaking。
3、使用压缩工具去除死代码 tree-shaking本身只是为死代码加上标记,真正去除死代码的是通过压缩工具来进行的。 |
|
JavaScript知识库 最新文章 |
ES6的相关知识点 |
react 函数式组件 & react其他一些总结 |
Vue基础超详细 |
前端JS也可以连点成线(Vue中运用 AntVG6) |
Vue事件处理的基本使用 |
Vue后台项目的记录 (一) |
前后端分离vue跨域,devServer配置proxy代理 |
TypeScript |
初识vuex |
vue项目安装包指令收集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 23:04:44- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |