声明:所有的文章demo都在我的仓库

代码分离

代码分离的有点在于:

  1. 切割代码,生成不同的打包文件,按需加载这些文件。
  2. 每个bundle的体积更小
  3. 控制外部资源的加载顺序

常用的方法有:

  1. 入口起点:使用入口entry手动分离
  2. 防止重复:使用SplitChunksPlugin去重和分离chunk
  3. 动态导入:通过模块的内联函数调用分离的代码

入口起点

新增另一个文件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_modulevendor代码,而且体积也减少了。

模块标识符

新增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部分:

  1. import会被打包成/* harmony import */做前缀,表明这段是import进来的
  2. export会被打包成/* harmony export */做前缀,表明这段是export
  3. 纯函数,会被打包成/*#__PURE__*/,表明这个函数是纯函数,可以被tree shaking

代码如下:

package.json

"name": "webpack-demo8",
"sideEffects":false,

webpack.config.js

optimization:{
usedExports:true
}

*** 以上代码在webpack-demo8

我的仓库地址,github,欢迎star~~

(完)

webpack5文档解析(下)的更多相关文章

  1. webpack5文档解析(上)

    webpack5 声明:所有的文章demo都在我的仓库里 webpack5 起步 概念 webpack是用于编译JavaScript模块. 一个文件依赖另一个文件,包括静态资源(图片/css等),都会 ...

  2. JavaScript : DOM文档解析详解

    JavaScript DOM  文档解析 1.节点(node):来源于网络理论,代表网络中的一个连接点.网络是由节点构成的集合 <p title=“a gentle reminder”> ...

  3. Android XML文档解析(一)——SAX解析

    ---------------------------------------------------------------------------------------------------- ...

  4. iOS网络编程笔记——XML文档解析

    今天利用多余时间研究了一下XML文档解析,虽然现在移动端使用的数据格式基本为JSON格式,但是XML格式毕竟多年来一直在各种计算机语言之间使用,是一种老牌的经典的灵活的数据交换格式.所以我认为还是很有 ...

  5. ios-XML文档解析之SAX解析

    首先SAX解析xml *xml文档的格式特点是节点,大体思路是把每个最小的子节点作为对象的属性,每个最小子节点的'父'节点作为对象,将节点转化为对象,输出. 每个节点都是成对存在的,有开始有结束.有始 ...

  6. jsoup -- xml文档解析

    jsoup -- xml文档解析 修改 https://jsoup.org/cookbook/modifying-data/set-attributes https://jsoup.org/cookb ...

  7. (二)发布第一个WebService服务与DSWL文档解析

    1. 编写接口 package service; import javax.jws.WebService; /** * 第一个webservice服务, * @WebService注解表示这是一个we ...

  8. 读取EXCEL文档解析工具类

    package test;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException ...

  9. 嵌套iframe中的HTML的文档解析类型

    问题:页面整个刷新时,IE11输入框显示的宽度和高度正常,对页面中的iframe部分刷新时,IE11输入框的宽度和高度就变小了. 原因:网页的头部定义了文档类型<!DOCTYPE html> ...

随机推荐

  1. Windows下使用Nginx+Tomact做负载均衡

    前言 今天,王子与大家闲谈一下如何在Windows下使用Nginx+Tomcat做负载均衡的完整步骤,小伙伴们可以试着自己动手实践一下哦. 另外说明一点,本篇文章是纯实操文章,不涉及太多原理的解读,后 ...

  2. 分布式系统监视zabbix讲解二之邮件报警通知

    概述 在上一篇博客<分布式系统监视zabbix讲解一技术流ken>中已经详细讲解了如何安装zabbix,本篇博客将详细讲解如何使用zabbix监控另外一台主机,并实现email报警通知机制 ...

  3. spring mvc(1) 为什么要使用mvc

    在使用spring mvc之前,我们首先要理解我们为什么要使用spring mvc.关于这个问题我们可以看一下java web的简单发展过程. 1. servlet 开发阶段 上世纪90年代,随着In ...

  4. Bottleneck靶机渗透

    Bottleneck 端口扫描,主机发现. 敏感目录为:http://192.168.114.165/image_gallery.php 在该目录下发现:http://192.168.114.165/ ...

  5. DC 1-3 靶机渗透

    DC-1靶机 端口加内网主机探测,发现192.168.114.146这台主机,并且开放了有22,80,111以及48683这几个端口. 发现是Drupal框架. 进行目录的扫描: 发现admin被禁止 ...

  6. java.lang.UnsupportedOperationException: A TupleBackedMap cannot be modified.解决以及探究

    java.lang.UnsupportedOperationException: A TupleBackedMap cannot be modified. at org.springframework ...

  7. JavaScript,你好!(二)

    操作BOM对象 浏览器介绍 JavaScript和浏览器的关系? JavaScrpit诞生就是为了能够让它在浏览器中运行! BOM:浏览器对象模型 IE 6~11 Chrome Safari Fire ...

  8. 关于Xilinx PCIE DMA的问答

    关于Xilinx PCIE DMA的问答 很久没上博客园了,但由于之前在博客园写了几篇关于PCIE DMA的文章,很多同学给我发消息询问相关知识点,之前有空的时候都是语音一小时跟人细讲,最近由于工作繁 ...

  9. P2783 有机化学之神偶尔也会作弊 题解

    题面 前言 这道题以前还是道(水)黑题,现在怎么降紫了???? 前置芝士 tarjain 缩点 倍增求LCA或树剖求LCA 脑子... 题意 给你一个无向图,要求你把所有的环缩成一个点.在新得到的图上 ...

  10. JVM 常见线上问题 → CPU 100%、内存泄露 问题排查

    开心一刻 明明是个小 bug,但就是死活修不好,我特么心态崩了...... 前言 后文会从 Windows.Linux 两个系统来做示例展示,有人会有疑问了:为什么要说 Windows 版的 ? 目前 ...