webpack5文档解析(下)
声明:所有的文章demo都在我的仓库里
代码分离
代码分离的有点在于:
- 切割代码,生成不同的打包文件,按需加载这些文件。
- 每个bundle的体积更小
- 控制外部资源的加载顺序
常用的方法有:
- 入口起点:使用入口
entry
手动分离 - 防止重复:使用
SplitChunksPlugin
去重和分离chunk
- 动态导入:通过模块的内联函数调用分离的代码
入口起点
新增另一个文件another-module.js
文件,并在webpack.config.js
中进行配置。
entry:{//打包入口
index:'./src/index.js',
another:'./src/another-module.js'
},
进行打包后,结果正常。
优点:常用常规的写法。
缺点:1.如果有相同的模块,不会去重,还是会在每个bundle中被重复的引用。2.不能将核心代码进行分割
防止重复
入口依赖
配置dependOn
选项,可以在多个chunk之间进行共享模块。
SplitChunkPlugin
为了解决多个bundle引入相同模块的问题,引入这个模块进行去重。
SplitChunkPlugin
将公共的模块引入到已有的入口中,或者提取到新的chunk。
相关配置如下:
//webpack.config.js
optimization:{
splitChunks:{
chunks:'all'
}
},
SplitChunkPlugin创建了新的chunk,如下图所示,shared.bundle.js。将我其他页面所使用的js引入的lodash模块引入这个文件中。
*** 以上代码在webpack-demo5
中
缓存
通常部署文件是将webpack打包出来的/dist
文件,部署到server
上,客户端通过访问server
的网站及资源。
由于客户端访问server
时,非常耗时和耗流量,于是浏览器采用缓存技术,可以直接从缓存中获取相关的内容,降低了请求的速度和流量。但是这也有一个缺点:如果文件名跟之前的一致,浏览器会认为这个文件没有做修改,还是会从缓存中获取相关内容。
我们想要的现象是:文件没做修改时,浏览器从缓存中获取,文件修改了,重新获取。
输出文件的文件名
webpack提供了一个substitution
(可替换的模版字符串)的方式,通过带括号字符串来模版化文件名。其中的[contenthash]
是根据资源内容创建唯一的hash
。当资源内容变化时,[contenthash]
也会发生变化。
相关配置如下:
entry:'./src/index.js',
output:{//打包出口
filename:"[name].[contenthash].js",//打包后的文件名称
path:path.resolve(__dirname,'dist')//路径
},
使用contenthash,将内容变化直接反应打包输出文件的变化。
文件不做修改,再次运行npm run build时,文档描述如下:
在我的实际操作中,我的打包文件是不变的。
第一次:
第二次:
可能跟webpack版本的关系所致。。。
模块的概念
runtime:每个模块的加载和模块的解析逻辑。
manifest:解析和映射模块之间的联系
提取引导模版
将runtime
代码,提取到一个单独的chunk中。optimization.runtimeChunk:'single'
表示为所有的chunk创建一个runtime bundle
。
代码如下:
optimization:{
runtimeChunk:'single'
},
将所有的第三方库,如lodash/react
等提取到单独的vendor chunk
文件中。由于这些第三方库不会去频繁的修改源代码,所以可以让更少的向server
发请求。
配置如下:
const path=require('path');
const {CleanWebpackPlugin}=require('clean-webpack-plugin')
const HtmlWebpackPlugin=require('html-webpack-plugin')
module.exports={
mode:'development',
entry:'./src/index.js',
output:{//打包出口
filename:"[name].[contenthash].js",//打包后的文件名称
path:path.resolve(__dirname,'dist')//路径
},
devtool: 'inline-source-map',
devServer:{
contentBase:'./dist'
},
optimization:{
runtimeChunk:'single',
splitChunks:{
cacheGroups:{
vendor:{
test:/[\\/]node_modules[\\/]/,
name:'vendor',
chunks:'all'
}
}
}
},
plugins:[
new CleanWebpackPlugin({
cleanStaleWebpackAssets:false
}),
new HtmlWebpackPlugin({
title:'管理输出'
})
]
}
结果会出现一个带有vendor
的文件。
在main
文件里,不再含有来自node_module
的vendor
代码,而且体积也减少了。
模块标识符
新增print模块,并在index中进行引入,最终打包的结果跟之前比较结果如下:
我本地打包只有main的文件进行了变化----符合预期
然而官网上展示的例子是不一样,引出了需要引入optimization.moduleIds:'hashed'
---苦笑不得
*** 以上代码在webpack-demo6
中
环境变量
可以在package.json
中配置相关的命令行,可以快速的执行开发环境
和生产环境
。
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack",
"start": "webpack serve --env development"
},
表示执行development
环境。
模块热替换(HMR)
模块热替换(HMR--hot module replacement):在程序运行过程中,若有替换/添加/删除模块,只更新修改的部分,不需要更新整个页面。
此功能暂不支持生产环境。
代码配置如下:
devServer:{
contentBase:'./dist',
hot:true
},
在index页面加入代码
if(module.hot){
module.hot.accept('./print.js',function(){
console.log('update the module1');
Print()
})
}
注意:执行时使用npm run start
,启动服务,可查看热更替。
*** 以上代码在webpack-demo7
中
模块热更替跟热更新是两回事。模块热更新是指修改了某个部分代码,不会刷新页面,而是在页面更新这个模块。热更新是指及时刷新页面。
Tree shaking
概念
是指在打包的时候,剔除没有用到的代码。
但是只支持ES module的import和export用法。
实践
打包过程分成3部分:
import
会被打包成/* harmony import */
做前缀,表明这段是import
进来的export
会被打包成/* harmony export */
做前缀,表明这段是export
的- 纯函数,会被打包成
/*#__PURE__*/
,表明这个函数是纯函数,可以被tree shaking
掉
代码如下:
package.json
"name": "webpack-demo8",
"sideEffects":false,
webpack.config.js
optimization:{
usedExports:true
}
*** 以上代码在webpack-demo8
中
我的仓库地址,github,欢迎star~~
(完)
webpack5文档解析(下)的更多相关文章
- webpack5文档解析(上)
webpack5 声明:所有的文章demo都在我的仓库里 webpack5 起步 概念 webpack是用于编译JavaScript模块. 一个文件依赖另一个文件,包括静态资源(图片/css等),都会 ...
- JavaScript : DOM文档解析详解
JavaScript DOM 文档解析 1.节点(node):来源于网络理论,代表网络中的一个连接点.网络是由节点构成的集合 <p title=“a gentle reminder”> ...
- Android XML文档解析(一)——SAX解析
---------------------------------------------------------------------------------------------------- ...
- iOS网络编程笔记——XML文档解析
今天利用多余时间研究了一下XML文档解析,虽然现在移动端使用的数据格式基本为JSON格式,但是XML格式毕竟多年来一直在各种计算机语言之间使用,是一种老牌的经典的灵活的数据交换格式.所以我认为还是很有 ...
- ios-XML文档解析之SAX解析
首先SAX解析xml *xml文档的格式特点是节点,大体思路是把每个最小的子节点作为对象的属性,每个最小子节点的'父'节点作为对象,将节点转化为对象,输出. 每个节点都是成对存在的,有开始有结束.有始 ...
- jsoup -- xml文档解析
jsoup -- xml文档解析 修改 https://jsoup.org/cookbook/modifying-data/set-attributes https://jsoup.org/cookb ...
- (二)发布第一个WebService服务与DSWL文档解析
1. 编写接口 package service; import javax.jws.WebService; /** * 第一个webservice服务, * @WebService注解表示这是一个we ...
- 读取EXCEL文档解析工具类
package test;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException ...
- 嵌套iframe中的HTML的文档解析类型
问题:页面整个刷新时,IE11输入框显示的宽度和高度正常,对页面中的iframe部分刷新时,IE11输入框的宽度和高度就变小了. 原因:网页的头部定义了文档类型<!DOCTYPE html> ...
随机推荐
- hystrix(5) 延时检测
hystrix在执行命令的同事,会对执行延时进行检测,如果超过设置的延时时间,那么将停止执行,并返回fallback执行结果. if (properties.executionTimeoutEnabl ...
- 利用Node实现HTML5离线存储
前言 支持离线Web应用开发是HTML5的一个重点.离线Web应用就是在设备不能上网的时候仍然可以运行的应用.开发离线Web应用需要几个步骤,其中一个就是离线下必须能访问一定的资源(图像 JS css ...
- linux学习(七)文件打包和压缩命令
一.前言 在Windows操作系统下,我们会使用WinRAR或者快压等等的压缩软件来进行压缩或者解压. 在Linux下当然也存在压缩或解压的操作,下面我们就来学习一下在Linux下是怎么压缩和解压的! ...
- linux学习(一)认识阿里云
一.简介 阿里云,全球领先的云计算服务平台,阿里巴巴集团旗下公司.致力于打造公共.开放的云计算服务平台.提供云服务器ECS.关系型数据库服务RDS.开放存储服务OSS.内容分发网络CDN.对象存储OS ...
- Android Studio 自定义字体显示英文音标
android:fontFamily="serif" 网上查了很多自定义字体的方式,或多或少都有些麻烦,最后还是尝试着认为内置字体不应该实现不了英文音标问题,就一个一个字体试了一下 ...
- 梯度下降法Gradient descent(最速下降法Steepest Descent)
最陡下降法(steepest descent method)又称梯度下降法(英语:Gradient descent)是一个一阶最优化算法. 函数值下降最快的方向是什么?沿负梯度方向 d=−gk
- 微信小程序 LBS 能力全面解析
分享之前我们先来看看地图能力在小程序架构体现中所处的位置. 小程序架构图解 如图标黄处为地图能力所处的一个位置,举个例子,比如调用定位能力获取用户当前位置的一个流程: 首先调用 JS API wx.g ...
- [VBA原创源代码] excelhome 汇总多工作表花名册
生病了,一点一滴的积累,慢慢康复,今年十月,我就 2 周岁了. 以下代码完成了excelhome中留的作业 http://club.excelhome.net/forum.php?mod=viewth ...
- Python基本数据类型详细介绍
Python提供的基本数据类型主要有:布尔类型.整型.浮点型.字符串.列表.元组.集合.字典等等 1.空(None)表示该值是一个空对象,空值是Python里一个特殊的值,用None表示.None不能 ...
- xor 和 or 有什么区别
参考:https://zhidao.baidu.com/question/67532331.html 1.定义区别: ①OR是或运算,A OR B的结果:当A.B中只要有一个或者两个都为1时,结果为1 ...