webpack4.15.1 学习笔记(六) — 代码拆分(Code Splitting)
代码拆分能够将代码分离到不同的 bundle 中,然后可以按需加载或并行加载这些文件。代码拆分可以用于获取更小的 bundle,以及控制资源加载优先级,会影响加载时间。
常用的代码拆分方法:
- 入口起点:使用
entry配置手动地分离代码。 - 防止重复:使用
CommonsChunkPlugin去重和分离 chunk。 - 动态导入:通过模块的内联函数调用来分离代码。
入口起点
最简单、最直观的分离代码的方式。但手动配置较多,并有一些陷阱。
const path = require('path');
module.exports = {
entry: {
index: './src/index.js',
print: './src/print.js'
},
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist')
}
};
构建结果会生成 index.bundle.js 和 print.bundle.js :
- 入口 chunks 之间包含的重复的模块,都会被引入到各个 bundle 中。
- 该方法不够灵活,且不能将核心应用程序逻辑进行动态拆分代码。
防止重复
SplitChunksPlugin插件可以将公共的依赖模块提取到已有的入口 chunk 中,或者提取到一个新生成的 chunk:
CommonsChunkPlugin在 webpack v4 中删除。RemovedPluginError: webpack.optimize.CommonsChunkPlugin has been removed, please use config.optimization.splitChunks instead.
// ./src/index.js
import _ from 'lodash';
console.log(
_.join(['index', 'module', 'loaded!'], ' ')
);
// ./src/print.js
import _ from 'lodash';
console.log(
_.join(['print', 'module', 'loaded!'], ' ')
);
const path = require('path');
module.exports = {
entry: {
index: './src/index.js',
print: './src/print.js'
},
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist')
},
optimization: {
splitChunks: {
chunks: 'all',
name:'common'
},
},
};
构建结果会生成 index.bundle.js 、 print.bundle.js 及common.bundle.js, 将 lodash 分离到单独的 chunk,并且将其从主包中移除,减轻了大小。
动态导入(dynamic imports)
使用符合 ECMAScript 提案的 import() 语法。import() 调用会在内部用到 promises。如果在旧版本浏览器中使用,需要使用 polyfill 库(如 es6-promise或 promise-polyfill)。
const path = require('path');
const HTMLWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: {
index: './src/index.js'
},
plugins: [
new HTMLWebpackPlugin({
title: 'Code Splitting'
})
],
output: {
filename: '[name].bundle.js',
chunkFilename: '[name].bundle.js', // 决定非入口 chunk 的名称
path: path.resolve(__dirname, 'dist')
}
};
== ./src/index.js==:注释中使用了 webpackChunkName。这样做 bundle 被命名为 lodash.bundle.js
vendors 缓存组的配置可以检测第三方模块是否在 node_modules 中,如果存在则该 splitChunks 生效,将会分离到
vendors~...这样的文件中,因此此处我生成的文件名 为vendors~lodash.bundle.js
function getComponent() {
return import( /* webpackChunkName: "lodash" */ 'lodash').then( _ => {
var element = document.createElement('div');
element.innerHTML = _.join(['Hello', 'webpack'], ' ');
return element;
}).catch(error => 'An error occurred while loading the component');
}
getComponent().then(component => {
document.body.appendChild(component);
})
webpack4.15.1 学习笔记(六) — 代码拆分(Code Splitting)的更多相关文章
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- # go微服务框架kratos学习笔记六(kratos 服务发现 discovery)
目录 go微服务框架kratos学习笔记六(kratos 服务发现 discovery) http api register 服务注册 fetch 获取实例 fetchs 批量获取实例 polls 批 ...
- Typescript 学习笔记六:接口
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- python3.4学习笔记(六) 常用快捷键使用技巧,持续更新
python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ...
- Go语言学习笔记六: 循环语句
Go语言学习笔记六: 循环语句 今天学了一个格式化代码的命令:gofmt -w chapter6.go for循环 for循环有3种形式: for init; condition; increment ...
- 【opencv学习笔记六】图像的ROI区域选择与复制
图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...
- Linux学习笔记(六) 进程管理
1.进程基础 当输入一个命令时,shell 会同时启动一个进程,这种任务与进程分离的方式是 Linux 系统上重要的概念 每个执行的任务都称为进程,在每个进程启动时,系统都会给它指定一个唯一的 ID, ...
- Spring Boot 学习笔记(六) 整合 RESTful 参数传递
Spring Boot 学习笔记 源码地址 Spring Boot 学习笔记(一) hello world Spring Boot 学习笔记(二) 整合 log4j2 Spring Boot 学习笔记 ...
- Java IO学习笔记六:NIO到多路复用
作者:Grey 原文地址:Java IO学习笔记六:NIO到多路复用 虽然NIO性能上比BIO要好,参考:Java IO学习笔记五:BIO到NIO 但是NIO也有问题,NIO服务端的示例代码中往往会包 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
随机推荐
- layui 新增行
layui表格新增行目前只在从内存加载数据的情况下可行! 在多方查找数据与实验后,我发现layui确实只能在直接赋值数据(从内存加载数据)的情况下新增行,即首次渲染表格时使用内存数据给表格的data参 ...
- sass @extend(继承)指令详解
在设计网页的时候常常遇到这种情况:一个元素使用的样式与另一个元素完全相同,但又添加了额外的样式. 通常会在 HTML 中给元素定义两个 class,一个通用样式,一个特殊样式. 普通CSS的实现 接下 ...
- OpenCV笔记(5) Rect类
看项目代码时,发现了Rect的神奇用法,rect = rect + point.于是了解了一下Rect类. 1. 构造函数 public Rect(Point location, Size size) ...
- Java中try catch finally 关键字
异常处理中的几个常用关键字(try catch finally throw throws) 异常处理 java中提供一套异常处理机制,在程序发生异常时,可以执行预先设定好的处理程序, 执行完成后,程序 ...
- ConfigurationManager 读取的不是最新值
用 ConfigurationManager 修改配置后,ConfigurationManager 读取的不是最新值. 解决方法: 第一种: ConfigurationManager.RefreshS ...
- win11 恢复Win10右键菜单的方法
1.Win+R运行CMD 2.输入:reg add HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocS ...
- 如何使用JavaScript实现在线Excel附件的上传与下载?
前言 在本地使用Excel时,经常会有需要在Excel中添加一些附件文件的需求,例如在Excel中附带一些Word,CAD图等等.同样的,类比到Web端,现在很多人用的在线Excel是否也可以像本地一 ...
- Docker安装mysql配置my.cnf并挂载到外部机器
1.环境准备,创建外部挂载文件夹conf,data,log mkdir -p /data/dockerdata/mysql3306/{conf,data,log} 2.在/data/dockerdat ...
- 5分钟了解LangChain的路由链
上上篇文章<5分钟理透LangChain的Chain>里用到了顺序链SequentialChain,它可以将多个链按顺序串起来.本文介绍LangChain里的另外1个重要的链:路由链. 1 ...
- Linux增加系统调用(亲测成功)
我使用的操作系统是CentOS,其他的操作系统类似. 相关软件和Linux的基础操作这里不再赘述. 实验环境 VMWare Workstation.CentOS-7 实验步骤 ...