工作需要, 要对这样的组合文件进行优化, 最终目的: 减少打包体积 & 优化打包速度

为什么这样做?

知其然, 而知其所以然, 带着这样的疑惑, 开始这个「组合」的调研

Gulp: A toolkit to automate & enhance your workflow | Gulp: 用自动化构建工具增强你的工作流程

前端代码构建工具,「task runner」, 实现自动化的工具, node 的最佳实践, 几乎可以做到所有 node 可以做的事情, 不仅限于打包, 一行 gulp 就可以按顺序执行所有预先定义(自己写)好的任务

Webpack: bundle your xxx | Webpack: 构建你的 xxx

前端资源模块化管理 & 打包工具,「module bundler」, 其主要功能就是对文件进行打包处理, 从一或多个文件为入口, 根据文件间引用关系, 找到所有相关文件, 把它们打到若干个包文件中

所以两个组合可以认为是各取所长, 使用 webpack 将模块、依赖等打包, 再用 gulp 任务去做压缩; so, 优化点也明确下来

  1. 减少打包体积: webpack
  2. 优化打包速度: gulp & webpack

目的 I: 减少打包体积

webpack 4.x 减少打包体积主要有以下几种方式

目的 II: 优化打包速度(bonus)

实践

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
const path = require("path");
// const fs = require("fs");
const gulp = require("gulp");
const webpack = require('webpack');
// const HappyPack = require('happypack');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
const browserSync = require("browser-sync").create();
const reload = browserSync.reload;
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;

const webpackConfig = {
module: {
rules: [
{
test: /\.tsx?$/,
use: [{
loader: 'ts-loader',
options: { transpileOnly: true }
}],
exclude: /node_modules/,
},
{ test: /\.tsx?$/, use: ['babel-loader', 'awesome-typescript-loader'] },
{ test: /\.jsx?$/, use: ["babel-loader"], exclude: /node_modules/ },
{ test: /\.less$/, use: ['style-loader', 'css-loader', "less-loader"] },
{
test: /\.css$/,
use: ['style-loader', { loader: 'css-loader', options: { importLoaders: 1 } }],
},
{ test: /\.svg$/, use: "babel!svg2react" },
{ test: /\.json$/, use: 'json-loader' }
],
optimization: {
splitChunks: {
// include all types of chunks
chunks: 'all',
cacheGroups: {
commons: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
chunks: 'all'
}
}
}
}
},
externals: {},
resolve: {
extensions: ['.tsx', '.ts', '.jsx', '.js', '.less'],
},
plugins: [
new BundleAnalyzerPlugin({ analyzerPort: 4000 }),
]
};

function pack(config, callback, packOptions = {}) {
const options = Object.assign({}, webpackConfig, config);

if (packOptions.disableSourceMap) {
options.module.preLoaders = [];
}

return webpack(options, callback);
}

function buildProject(callback, needServe, outputPath) {
let inited;
pack({
watch: true,
mode: 'production',
entry: "./src/index",
output: {
path: outputPath || path.resolve(__dirname, "pub"),
filename: "~index.js",
sourceMapFilename: "[file].map"
},
devtool: 'eval-source-map',
plugins: [
new UglifyJsPlugin({
cache: true,
sourceMap: true,
uglifyOptions: {
output: {
comments: false,
beautify: true
},
},
}),
new BundleAnalyzerPlugin({ analyzerPort: 4040 }),
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)
]
}, function (err, stats) {
if (err) {
throw new err;
}

console.log("[webpack]", stats.toString({
colors: true,
hash: false,
chunks: false
}));

if (needServe) {
if (inited) {
reload();
} else {
inited = true;
browserSync.init({
server: {
baseDir: './',
index: './index.html'
},
open: '127.0.0.1',
port: 3000,
cors: true,
online: true
});
}
} else {
process.exit()
}
});

needServe && browserSync.watch('index.html').on('change', reload);
}

gulp.task("watch", ["server"]);
gulp.task("server", [], (c) => buildProject(c, true));

Reference

Webpack打包优化
webpack优化解决项目体积大、打包时间长、刷新时间长问题!
webpack - caching
Webpack 打包优化之体积篇
Webpack 打包优化之速度篇
JS/CSS 体积减少了 67%,我们是如何做到的?
重构之路:webpack打包体积优化(超详细)
前端项目gulp编译工具打包慢怎么办?
gulp打包编译速度优化
gulp+webpack配置
Gulp & webpack 配置详解