hunkier

学习笔记,开源代码,技术分享

Web 前端打包优化

随着前端技术的快速发展,页面的很多功能和组件都有开源的实现,只需要把对应的开源项目的依赖加入到 package.json 的 dependencies 节点,配置好坐标中的项目名称和版本,便可直接使用。

但依赖的开源项目中往往只用到了其中的少部分功能或代码,但在使用 webpack 打包时会把开源依赖包中所有的资源全打包,这时需要进行相应的优化。

一、moment.js 去除无用的语言包

moment.js 是一个时间处理的开源实现,方便将时间进行各种操作和格式化,其主包中包含了多国语言的本地化。

大部分项目都只是在国内使用,只需要简体中文即可。

安装 moment-locales-webpack-plugin 打包依赖插件:

1
npm i -D moment-locales-webpack-plugin

webpack 打包文件配置。

1
2
3
4
5
6
7
8
9
10
11
12
const MomentLocalesPlugin = require('moment-locales-webpack-plugin')
module.exports = {
configureWebpack() {
return {
plugins: [
// moment,去除国际化,只保留简体中文
new MomentLocalesPlugin({
localesToKeep: ['zh-cn'],
}),
]}
}
}

打包后的文件就只包含简体中文,减少 600k 左右大小。

二、去除 js 源码终端注释、debuggerconsole.log()

前端在开发过程中,加入注释方便理解代码,加入debuggerconsole.log()调试程序,打包时就不希望这些无用的代码占用,有时还可能会泄露信息。
只需要加入打包优化插件即可去除开发过程中的debuggerconsole.log()

安装 terser-webpack-plugin 打包依赖插件:

1
npm i -D terser-webpack-plugin@4.2.3

webpack 打包文件配置。

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
const isProduction = process.env.NODE_ENV === 'production' // 判断是否打包生成生产生产环境的包
const TerserPlugin = !isProduction ? {} : require('terser-webpack-plugin')
const minimizer = !isProduction
? []
: [
new TerserPlugin({
extractComments: false,
cache: true,
terserOptions: {
ecma: undefined,
warnings: false,
parse: {},
format: {
comments: false,
},
compress: {
drop_console: true, // 清除 console 语句
drop_debugger: true, // 清除 debugger 语句
pure_funcs: ['console.log'], // 移除console
},
},
}),
]



module.exports = {
configureWebpack() {
return {
optimization: {
// 此处添加 移除console.log 和 debugger的代码
minimizer: minimizer,
},}
},
chainWebpack(config) {
if(isProduction){
// 删除注释、debug、console.log
config.optimization.minimizer('terser').tap((args) => {
args[0].extractComments = false
args[0].cache = true
args[0].terserOptions.compress.drop_console = true
args[0].terserOptions.compress.drop_debugger = true
args[0].terserOptions.compress.pure_funcs = ['console.log']
args[0].terserOptions.output = {
comments: false,
}
return args
})
}
}
}

打包后的文件已去除 注释、debuggerconsole.log()

谢谢你请我喝牛奶

欢迎关注我的其它发布渠道