Jimliu


一只刚上路的前端程序猿


webpack优化打包速度

新搭了一套前端开发代码框架,使用Typescript。

webpack相关配置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
test: /\.(j|t)sx?$/,
loader: 'ts-loader',
include: SRC_PATH,
options: {
transpileOnly: true, //只转译,不检查
getCustomTransformers: () => ({
//获取或者说定义自定义的转换器
before: [
tsImportPluginFactory({
libraryName: 'antd', //对哪个模块进行按需加载
libraryDirectory: 'es', //按需加载的模块,如果实现按需加载,必须是ES Modules
style: 'css' //自动引入它对应的CSS
})
]
}),
compilerOptions: {
module: 'es2015'
}
}
}

使用ts-loader来进行ts的相关编译工作。

然后打包的时候我疯了。。

webpack

现在代码量并不大,只是引了一个我们自己的组件库 47638ms有些太夸张。必须进行优化!

1.使用babel-loader替代ts-loader

babel7中有包来解析ts,安装

1
"@babel/preset-typescript": "^7.9.0",

使用的.babelrc如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
"presets": [
[
"@babel/preset-env",
{
"corejs": 3,
"useBuiltIns": "usage"
}
],
"@babel/preset-typescript", //解析ts
"@babel/preset-react"
],
"plugins": [
"@babel/plugin-transform-runtime",
[
"@babel/plugin-proposal-decorators",
{
"legacy": true
}
],
[
"@babel/plugin-proposal-class-properties",
{
"loose": true
}
],
"@babel/plugin-syntax-dynamic-import",
]
}

webpack配置 修改为

1
2
3
4
5
{
test: /\.(j|t)sx?$/,
include: SRC_PATH,
loader: 'babel-loader'
},

img

打包时间降为15015ms,打包速度加快了70%.

2.使用happypack

Webpack是允许在NodeJS中的,它是单线程模型的,因此webpack在构建文件时,比如js,css,图片及字体时,它需要一个一个去解析和编译,不能同时处理多个任务。特别当文件数量变多后,webpack构建慢的问题会显得更为严重。因此HappyPack出现了,它能让webpack同时处理多个任务,它将任务分解给多个子进程去并发执行,子进程处理完成后再将结果发送给主进程中。

HappyPack的基本原理:在webpack构建过程中,我们需要使用Loader对js,css,图片,字体等文件做转换操作,并且转换的文件数据量也是非常大的,且这些转换操作不能并发处理文件,而是需要一个个文件进行处理,HappyPack的基本原理是将这部分任务分解到多个子进程中去并行处理,子进程处理完成后把结果发送到主进程中,从而减少总的构建时间。

安装

1
"happypack": "^5.0.1"

webpack相关配置

引入

1
2
3
const HappyPack = require('happypack');

const happyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length });

1
2
3
4
5
6
rules:
{
test: /\.(j|t)sx?$/,
include: SRC_PATH,
use: ['happypack/loader?id=babel'] //id为plugin中配置的 HappyPack的id
},
1
2
3
4
5
6
7
8
plugin: 
new HappyPack({
id: 'babel',
loaders: [{
loader: 'babel-loader?cacheDirectory'
}],
threadPool: happyThreadPool
}),

img

打包时间减少了1s左右,优化的不是那么明显,因为项目中现在文件数量还较少。

参考Bumblebee-react

持续更新,未完待续。。。

最近的文章

关于项目的一些总结(一)

在公司工作3年有余,主导经历的项目大大小小也有十几个,挑一些有代表性的项目来做一些总结。 酒店收益–预测分析平台先上一个数据的流程图: 数据来源系统数据来源有两个: 酒店订房系统(PMS)直连数据 酒店用户上传数据 因为与我们合作的PMS服务商数量有限,一部分使用我们系统的酒店用户采用的是其他 …

于  js, node 继续阅读
更早的文章

cookie SameSite

背景1.我们业务系统有被第三方系统嵌套使用,通过Node端下发cookie来实现一键登录。 2.Chrome 80.0中将SameSite的默认值设为Lax。 解释SameSite详解SameSite Cookie,防止 CSRF 攻击因为 HTTP 协议是无状态的,所以很久以前的网站是没有登录这个 …

于  chrome, js 继续阅读