webpack5.js
4.94 KB
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
128
129
130
131
132
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
function _react() {
const data = _interopRequireDefault(require("react"));
_react = function _react() {
return data;
};
return data;
}
function _path() {
const data = require("path");
_path = function _path() {
return data;
};
return data;
}
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var _default = api => {
api.describe({
key: 'webpack5',
enableBy() {
var _api$userConfig$mfsu;
return (// 需要和 USE_WEBPACK_5 区分开,因为有 mfsu 配置不一定开启 webpack 5
process.env.ENABLE_WEBPACK_5 || api.userConfig.webpack5 || api.env === 'development' && api.userConfig.mfsu || api.env === 'production' && ((_api$userConfig$mfsu = api.userConfig.mfsu) === null || _api$userConfig$mfsu === void 0 ? void 0 : _api$userConfig$mfsu.production)
);
},
config: {
schema(joi) {
return joi.object().keys({
// Ref: https://webpack.js.org/configuration/experiments/#experimentslazycompilation
lazyCompilation: joi.object().keys({
entries: joi.boolean(),
imports: joi.boolean(),
test: joi.any()
})
});
}
}
});
api.onPluginReady(() => {
const command = process.argv[2];
if (['dev', 'build'].includes(command)) {
console.log('Bundle with webpack 5...');
}
process.env.USE_WEBPACK_5 = '1'; // 开启 persistent caching 后,不再需要 babel cache 了
// 只要不禁用物理缓存,就禁用 babel 缓存
if (process.env.WEBPACK_FS_CACHE !== 'none') {
process.env.BABEL_CACHE = 'none';
}
});
api.modifyBundleConfig(memo => {
var _api$config$webpack;
// lazy compilation
// @ts-ignore
if (api.env === 'development' && ((_api$config$webpack = api.config.webpack5) === null || _api$config$webpack === void 0 ? void 0 : _api$config$webpack.lazyCompilation)) {
// @ts-ignore
memo.experiments = _objectSpread(_objectSpread({}, memo.experiments), {}, {
lazyCompilation: _objectSpread({
// client: require.resolve(
// '@umijs/deps/compiled/webpack/5/lazy-compilation-web.js',
// ),
backend: require('@umijs/deps/compiled/webpack/5/lazyCompilationBackend.js'),
entries: false
}, api.config.webpack5.lazyCompilation)
});
} // 缓存默认开启,可通过环境变量关闭
if (process.env.WEBPACK_FS_CACHE !== 'none') {
const configFile = api.service.configInstance.configFile;
memo.cache = {
type: 'filesystem',
// using umi version as `cache.version`
version: process.env.UMI_VERSION,
buildDependencies: {
config: [(0, _path().join)(api.cwd, 'package.json'), api.config.webpack5 && configFile ? (0, _path().join)(api.cwd, configFile) : undefined].filter(Boolean)
},
cacheDirectory: (0, _path().join)(api.paths.absTmpPath, '.cache', 'webpack')
}; // tnpm 安装依赖的情况 webpack 默认的 managedPaths 不生效
// 使用 immutablePaths 避免 node_modules 的内容被写入缓存
// tnpm 安装的依赖路径中同时包含包名和版本号,满足 immutablePaths 使用的条件
// ref: smallfish
if (
/*isTnpm*/
require('react-router/package').__npminstall_done) {
// @ts-ignore
memo.snapshot = _objectSpread(_objectSpread({}, memo.snapshot || {}), {}, {
immutablePaths: [api.paths.absNodeModulesPath]
});
} // 缓存失效会有日志,这里清除下日志
// @ts-ignore
memo.infrastructureLogging = _objectSpread({
level: 'error'
}, process.env.WEBPACK_FS_CACHE_DEBUG ? {
debug: /webpack\.cache/
} : {});
}
return memo;
});
};
exports.default = _default;