webpack4 code splitting
demo 代码点此,webpack4 进行 code splitting 使用 split-chunks-plugin, 开始前先做点准备工作。
start
安装:
npm i -D webpack webpack-cli
npm i -S lodash
创建 webpack.config.js 进行配置:
const path = require('path');
module.exports = {
mode: 'development',
entry: {
main: './index.js',
},
optimization: {
// code splitting settings
splitChunks: {
chunks: 'all',
cacheGroups: {
vendors: {
// 仅将 node_modules 下的代码打包进 vendors.js
test: /[\\/]node_modules[\\/]/,
priority: -10,
filename: 'vendors.js',
},
},
},
},
// 出口
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist'),
},
}
创建 index.js :
// 引入 lodash
import _ from 'lodash';
console.log(_.chunk(['a', 'b', 'c', 'd'], 2));
打包终端执行 npx webpack进行打包,打开 dist 目录,可以看见 bundle.js 和 vendors.js,引入的 lodash 被打包到 vendors 中。
公共模块
如果 index.js 引入了公共模块,则可以将此模块进行打包。
修改配置:
// webpack.config.js
const path = require('path');
module.exports = {
mode: 'development',
entry: {
main: './index.js',
},
optimization: {
splitChunks: {
chunks: 'all',
// 代码文件大于 0kb 就进行打包
+ minSize: 0,
cacheGroups: {
vendors: {
test: /[\\/]node_modules[\\/]/,
priority: -10,
filename: 'vendors.js',
},
+ default: {
+ // 公共模块仅引用 1 次也打包进 common.js
+ minChunks: 1,
+ priority: -20,
+ reuseExistingChunk: true,
+ filename: 'common.js',
+ }
}
}
},
// 出口
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist'),
},
}
然后创建一个 math.js:
// math.js
export default function add (x, y) {
return x + y;
}
接着修改 index.js:
// inddex.js
import add from './math';
console.log(add(1, 2));
执行npx webpack进行打包,打开 dist 目录,可以看见 math.js 被打包进 common.js 中了。
异步代码
打包异步代码需要使用 import(...)语法,所以需要配置一下 babel。
安装:
npm i -D babel-loader @babel/core babel-plugin-dynamic-import-webpack
配置一下 webpack.config.js:
const path = require('path');
module.exports = {
mode: 'development',
entry: {
main: './index.js',
},
module: {
rules: [{
test: /\.js/,
use: [{
loader: 'babel-loader',
options: {
"babelrc": false,
"plugins": [
"dynamic-import-webpack"
]
}
}]
}]
},
optimization: {
splitChunks: {
chunks: 'all',
minSize: 0,
cacheGroups: {
vendors: {
test: /[\\/]node_modules[\\/]/,
priority: -10,
// filename: 'vendors.js',
},
default: {
minChunks: 1,
priority: -20,
reuseExistingChunk: true,
// filename: 'common.js',
}
}
}
},,
output: {...},
}
修改 index.js:
// index.js
async function getComponent() {
const { default: _ } = await import('lodash');
const element = document.createElement('div');
element.innerHTML = _.join(['hello', 'world'], '-');
return element;
}
getComponent().then(element => {
document.body.appendChild(element);
})
执行打包,可以看见 import(...) 异步加载的 lodash 被打包成 0.bundle.js。
webpack4 code splitting的更多相关文章
- [Webpack 2] Maintain sane file sizes with webpack code splitting
As a Single Page Application grows in size, the size of the payload can become a real problem for pe ...
- webpack优化之code splitting
作为当前风头正盛的打包工具,webpack风靡前端界.确实作为引领了一个时代的打包工具,很多方面都带来了颠覆性的改进,让我们更加的感受到自动化的快感.不过最为大家诟病的一点就是用起来太难了. 要想愉快 ...
- webpack Code Splitting浅析
Code Splitting是webpack的一个重要特性,他允许你将代码打包生成多个bundle.对多页应用来说,它是必须的,因为必须要配置多个入口生成多个bundle:对于单页应用来说,如果只打包 ...
- [转] react-router4 + webpack Code Splitting
项目升级为react-router4后,就尝试着根据官方文档进行代码分割.https://reacttraining.com/react-router/web/guides/code-splittin ...
- react-router4 + webpack Code Splitting
项目升级为react-router4后,就尝试着根据官方文档进行代码分割.https://reacttraining.com/react-router/web/guides/code-splittin ...
- webpack 利用Code Splitting 分批打包、按需下载
webpack中的解决方案——Code Splitting,简单来说就是按需加载(下载),如果是requireJS对应的AMD的方案中这本是在正常不过了.但是在webpack中All in one的思 ...
- 借助Code Splitting 提升单页面应用性能
近日的工作集中于一个单页面应用(Single-page application),在项目中尝试了闻名已久的Code splitting,收获极大,特此分享. Why we need code spli ...
- webpack 和 code splitting
Code Splitting指的是代码分割,那么什么是代码分割,webpack和code splitting又有什么样的联系呢? 使用npm run dev:"webpack-dev-ser ...
- webpack async load modules & dynamic code splitting
webpack async load modules & dynamic code splitting webpack 按需/异步加载/Code Splitting webpack loade ...
随机推荐
- logstash收集系统日志配置
查看官方文档 https://www.elastic.co/guide/en/logstash/current/plugins-inputs-file.html 找个路径 /home/data/log ...
- liteos分散加载(十四)
1. 概述 1.1 基本概念 分散加载是一种实现特定代码快速启动的技术,通过优先加载特定代码到内存,达到缩短从系统开机到特定代码执行的时间.可被应用来实现关键业务的快速启动. 嵌入式系统通过uboot ...
- Lnmp架构部署动态网站环境.2019-7-2-1.1
一.Mysql简介 Mysql数据库: 1.社区版 2.商业版 3.cluster集群 Mysql安装方式 1.编译安装 2.yum/rpm 3.二进制包,直接解压,无需编译 二.Mysql安装部署 ...
- python3.5.3rc1学习八:文件打包
from cx_Freeze import setup, Executable setup(name='test to exe', version = '0.1', description='test ...
- Python学习笔记4 高级特性_20170618
# 切片(获取list / tuple / 字符串 中指定的元素) l = list(range(10)) l[0:3] l[:3] # 0可以省略 l[:] # 全部 l[3:] # 最后的可以省略 ...
- 20191004 「HZOJ NOIP2019 Round #9」20191004模拟
综述 第一次 rk1 ,激动. 题目是 COCI 18/19 Round #1 的三至五题. 得分 \(100+100+20\) \(\mathrm{cipele}\) 问题描述 HZOJ1313 题 ...
- luoguP4097 [HEOI2013]Segment
题意 李超树板子题. 对每个区间维护该区间中点\(mid\)的最优线段. 插入一个线段: 求出这个线段的斜率和截距,注意特判无斜率的情况,得到\(y=kx+b\). 之后开始在线段树上插入,假设当前节 ...
- 【未完成】【oracle】存储过程按日期循环
............. DECLARE V_IMPORT_DATE DATE; V_BUSI_DATE DATE; OUT_RET NUMBER; - ...
- 【day02】Xhtml
一.HTML实体(HTML Entites) 1.HTML实体:W3C规定在浏览器看到的特殊符号必须用HTML实体 单引号(') ===== ' 双引号(") ===== " ...
- github上计算String相似度好的项目
项目中包含了杰卡德NGram.cosin夹角.最长公共子序列.边际距离等常用的相似度算法. https://github.com/tdebatty/java-string-similarity