akfun 5.1.13 → 5.1.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +342 -215
- package/module/main.js +14 -1
- package/package.json +15 -15
- package/src/build.js +3 -8
- package/src/build2esm.js +13 -15
- package/src/config/babel.config.js +2 -0
- package/src/config/index.js +18 -12
- package/src/config/rollup.config.js +22 -5
- package/src/dev-server.js +3 -9
- package/src/initData/akfun-package.json +14 -10
- package/src/initData/config/babel.config.js +3 -1
- package/src/manage/ConfigManager.js +313 -0
- package/src/utils/configValidator.js +435 -0
- package/src/webpack/loaderUtils.js +30 -20
- package/src/webpack/vue-loader.conf.js +2 -12
- package/src/webpack/webpack.base.conf.js +54 -16
- package/src/webpack/webpack.dev.conf.js +8 -15
- package/src/webpack/webpack.library.conf.js +7 -14
- package/src/webpack/webpack.prod.conf.js +8 -15
package/README.md
CHANGED
|
@@ -1,341 +1,468 @@
|
|
|
1
|
-
|
|
2
|
-
AKFun 是一个基于 Webpack 与 Rollup 的多场景前端打包工具,支持 Vue、React、React+TS 技术栈,致力于提供“零配置、开箱即用”的工程能力,让开发者专注业务。
|
|
3
|
-
|
|
4
|
-
### 主要特性
|
|
5
|
-
- **零配置**: 内置默认配置,开箱即用;
|
|
6
|
-
- **多技术栈**: 支持 Vue、React、React+TS 的调试与构建;
|
|
7
|
-
- **多构建场景**: 本地开发(含热更新/代理)、生产构建、库构建(UMD/ESM);
|
|
8
|
-
- **灵活可配**: 支持入口、别名、代理、SASS 注入、ESLint/StyleLint、Babel/Loader/Plugin 扩展等配置;
|
|
9
|
-
- **样式与规范**: 集成 Autoprefixer、Sass、PostCSS、ESLint、StyleLint;
|
|
10
|
-
- **参数替换**: 支持基于 [params-replace-loader](https://www.npmjs.com/package/params-replace-loader) 的环境变量批量替换;
|
|
11
|
-
- **模板支持**: 提供完整的 Vue/React 项目模板。
|
|
1
|
+
# AKFun 前端脚手架
|
|
12
2
|
|
|
13
|
-
|
|
3
|
+
AKFun 是一个基于 Webpack 与 Rollup 的多场景前端打包工具,支持 Vue、React、React+TS 技术栈,致力于提供"零配置、开箱即用"的工程能力,让开发者专注业务。
|
|
4
|
+
|
|
5
|
+
## 目录
|
|
6
|
+
|
|
7
|
+
- [主要特性](#主要特性)
|
|
8
|
+
- [安装](#安装)
|
|
9
|
+
- [快速开始](#快速开始)
|
|
10
|
+
- [命令说明](#命令说明)
|
|
11
|
+
- [配置指南](#配置指南)
|
|
12
|
+
- [配置文件说明](#配置文件说明)
|
|
13
|
+
- [基础配置](#基础配置)
|
|
14
|
+
- [开发配置](#开发配置)
|
|
15
|
+
- [构建配置](#构建配置)
|
|
16
|
+
- [高级配置](#高级配置)
|
|
17
|
+
- [其他说明](#其他说明)
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 主要特性
|
|
22
|
+
|
|
23
|
+
- **零配置**: 内置默认配置,开箱即用
|
|
24
|
+
- **多技术栈**: 支持 Vue、React、React+TS 的调试与构建
|
|
25
|
+
- **多构建场景**: 本地开发(含热更新/代理)、生产构建、库构建(UMD/ESM)
|
|
26
|
+
- **灵活可配**: 支持入口、别名、代理、SASS 注入、ESLint/StyleLint、Babel/Loader/Plugin 扩展等配置
|
|
27
|
+
- **样式与规范**: 集成 Autoprefixer、Sass、PostCSS、ESLint、StyleLint
|
|
28
|
+
- **参数替换**: 支持基于 [params-replace-loader](https://www.npmjs.com/package/params-replace-loader) 的环境变量批量替换
|
|
29
|
+
- **模板支持**: 提供完整的 Vue/React 项目模板
|
|
30
|
+
- **内置缓存机制**: 内置缓存机制,提升二次构建速度
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 安装
|
|
35
|
+
|
|
36
|
+
### 全局安装
|
|
14
37
|
|
|
15
|
-
### 方法一:全局安装
|
|
16
|
-
1) 安装
|
|
17
38
|
```bash
|
|
18
39
|
yarn global add akfun
|
|
19
40
|
# 或
|
|
20
41
|
npm i -g akfun
|
|
21
42
|
```
|
|
22
|
-
2) 创建项目(可指定模板与目录)
|
|
23
|
-
```bash
|
|
24
|
-
akfun init -t=vue
|
|
25
|
-
# 指定目录
|
|
26
|
-
akfun init -t=vue --dir=myTest1
|
|
27
|
-
```
|
|
28
|
-
3) 运行构建(需先安装依赖)
|
|
29
|
-
```bash
|
|
30
|
-
# 本地开发调试
|
|
31
|
-
akfun dev
|
|
32
|
-
|
|
33
|
-
# 生产环境构建
|
|
34
|
-
akfun build
|
|
35
43
|
|
|
36
|
-
|
|
37
|
-
akfun build2lib
|
|
38
|
-
|
|
39
|
-
# 构建库(ESM)
|
|
40
|
-
akfun build2esm
|
|
41
|
-
```
|
|
44
|
+
### 项目内安装
|
|
42
45
|
|
|
43
|
-
### 方法二:在现有项目中使用
|
|
44
|
-
1) 安装到当前项目
|
|
45
46
|
```bash
|
|
46
47
|
yarn add akfun --dev
|
|
47
48
|
# 或
|
|
48
49
|
npm i akfun --save-dev
|
|
49
50
|
```
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
```bash
|
|
59
|
-
akfun
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## 快速开始
|
|
55
|
+
|
|
56
|
+
### 方式一:创建新项目
|
|
57
|
+
|
|
58
|
+
1. **创建项目**(可指定模板与目录)
|
|
59
|
+
```bash
|
|
60
|
+
akfun init -t=vue
|
|
61
|
+
# 指定目录
|
|
62
|
+
akfun init -t=vue --dir=myTest1
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
2. **安装依赖**
|
|
66
|
+
```bash
|
|
67
|
+
cd myTest1
|
|
68
|
+
npm install
|
|
69
|
+
# 或
|
|
70
|
+
yarn install
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
3. **开始开发**
|
|
74
|
+
```bash
|
|
75
|
+
akfun dev
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 方式二:在现有项目中使用
|
|
79
|
+
|
|
80
|
+
1. **安装依赖**(见上方安装说明)
|
|
81
|
+
|
|
82
|
+
2. **初始化配置文件**
|
|
83
|
+
```bash
|
|
84
|
+
akfun config init
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
3. **在 package.json 添加脚本**
|
|
88
|
+
```json
|
|
89
|
+
{
|
|
90
|
+
"scripts": {
|
|
91
|
+
"dev": "akfun dev",
|
|
92
|
+
"build": "akfun build",
|
|
93
|
+
"build2lib": "akfun build2lib",
|
|
94
|
+
"build2esm": "akfun build2esm"
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
4. **运行命令**
|
|
100
|
+
```bash
|
|
101
|
+
npm run dev
|
|
102
|
+
npm run build
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## 命令说明
|
|
108
|
+
|
|
109
|
+
| 命令 | 说明 |
|
|
110
|
+
|------|------|
|
|
111
|
+
| `akfun init` | 交互式创建项目,支持 `-t`(模板类型)、`--dir`(目录名)参数 |
|
|
112
|
+
| `akfun config init` | 在当前项目生成 `akfun.config.js` 配置文件 |
|
|
113
|
+
| `akfun dev` | 启动本地开发服务器(含热更新、接口代理、可选 HTTPS、可选 ESLint/StyleLint) |
|
|
114
|
+
| `akfun build` | 生产环境构建(压缩优化、可选分析) |
|
|
115
|
+
| `akfun build2lib` | 构建 UMD 格式的库产物 |
|
|
116
|
+
| `akfun build2esm` | 构建 ESM 格式的库产物 |
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## 配置指南
|
|
121
|
+
|
|
122
|
+
### 配置文件说明
|
|
123
|
+
|
|
124
|
+
AKFun 默认提供完整配置,开箱即用。如需自定义配置,执行 `akfun config init` 生成 `akfun.config.js` 文件,然后按需修改。
|
|
125
|
+
|
|
126
|
+
配置文件采用 CommonJS 格式,导出一个配置对象:
|
|
127
|
+
|
|
128
|
+
```javascript
|
|
129
|
+
module.exports = {
|
|
130
|
+
// 配置项...
|
|
131
|
+
}
|
|
67
132
|
```
|
|
68
133
|
|
|
69
|
-
|
|
70
|
-
- **akfun init**: 交互式创建项目(支持 -t、--dir)。
|
|
71
|
-
- **akfun config init**: 在当前项目生成 `akfun.config.js`。
|
|
72
|
-
- **akfun dev**: 本地开发调试(含热更新、接口代理、可选 HTTPS、可选 ESLint/StyleLint)。
|
|
73
|
-
- **akfun build**: 生产环境构建(压缩优化、可选分析)。
|
|
74
|
-
- **akfun build2lib**: 构建 UMD 库产物。
|
|
75
|
-
- **akfun build2esm**: 构建 ESM 库产物。
|
|
134
|
+
---
|
|
76
135
|
|
|
77
|
-
|
|
78
|
-
- 当 `entry` 仅配置一个且对应文件不存在时,会自动从 `src/pages` 扫描以 `.ts/.tsx/.js/.jsx` 结尾的文件作为入口,匹配同名 HTML 作为模板(对应正则 `/\.[tj]sx?$/`)。
|
|
79
|
-
- 仅 `dev` 和 `build` 使用页面模板;`build2lib` 不向页面注入打包产物。
|
|
80
|
-
- 优先使用 `./src/index.html`;不存在时使用内置默认模板。多页面时若 `pages` 下存在同名 HTML,将其作为页面模板。
|
|
136
|
+
### 基础配置
|
|
81
137
|
|
|
82
|
-
|
|
83
|
-
AKFun 默认提供完整配置;如需自定义,执行 `akfun config init` 生成 `akfun.config.js` 并按需修改。以下为常用配置。
|
|
138
|
+
#### 1. 代码规范检查
|
|
84
139
|
|
|
85
|
-
|
|
86
|
-
|
|
140
|
+
控制 ESLint 和 StyleLint 的启用与自动修复:
|
|
141
|
+
|
|
142
|
+
```javascript
|
|
87
143
|
module.exports = {
|
|
88
144
|
settings: {
|
|
89
|
-
enableESLint: true,
|
|
90
|
-
enableESLintFix: false,
|
|
91
|
-
enableStyleLint: true,
|
|
92
|
-
enableStyleLintFix: false
|
|
93
|
-
}
|
|
94
|
-
...
|
|
145
|
+
enableESLint: true, // 是否开启 ESLint,默认开启
|
|
146
|
+
enableESLintFix: false, // 是否 ESLint 自动修正代码格式
|
|
147
|
+
enableStyleLint: true, // 是否开启 StyleLint,默认开启
|
|
148
|
+
enableStyleLintFix: false // 是否 StyleLint 自动修正代码格式
|
|
149
|
+
}
|
|
95
150
|
}
|
|
96
151
|
```
|
|
97
152
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
153
|
+
#### 2. 构建入口
|
|
154
|
+
|
|
155
|
+
配置构建入口文件,支持多入口。优先级:`dev/build/build2lib.entry` > `webpack.entry`
|
|
156
|
+
|
|
157
|
+
> **提示**: 建议以 key/value(object `{ <key>: string | [string] }`)配置 entry。详情参考 [Webpack 文档](https://www.webpackjs.com/configuration/entry-context/#entry)
|
|
158
|
+
|
|
159
|
+
```javascript
|
|
101
160
|
module.exports = {
|
|
102
|
-
...
|
|
103
161
|
webpack: {
|
|
104
|
-
entry: {
|
|
162
|
+
entry: {
|
|
163
|
+
index: './src/index.js'
|
|
164
|
+
}
|
|
105
165
|
},
|
|
106
|
-
|
|
166
|
+
// 各场景可单独配置入口
|
|
107
167
|
dev: { entry: {} },
|
|
108
168
|
build: { entry: {} },
|
|
109
169
|
build2lib: { entry: {} },
|
|
110
170
|
build2esm: {
|
|
111
171
|
input: resolve('src/main.js'),
|
|
112
|
-
fileName: 'index'
|
|
113
|
-
}
|
|
114
|
-
...
|
|
172
|
+
fileName: 'index'
|
|
173
|
+
}
|
|
115
174
|
}
|
|
116
175
|
```
|
|
117
176
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
177
|
+
#### 3. 文件解析配置
|
|
178
|
+
|
|
179
|
+
配置模块解析的文件扩展名:
|
|
180
|
+
|
|
181
|
+
> 详情参考 [Webpack resolve.extensions 文档](https://www.webpackjs.com/configuration/resolve/#resolve-extensions)
|
|
182
|
+
|
|
183
|
+
```javascript
|
|
121
184
|
module.exports = {
|
|
122
|
-
...
|
|
123
185
|
webpack: {
|
|
124
186
|
resolve: {
|
|
125
|
-
extensions: ['.js', '.jsx', '.vue', 'json']
|
|
187
|
+
extensions: ['.js', '.jsx', '.vue', '.json']
|
|
126
188
|
}
|
|
127
|
-
}
|
|
128
|
-
...
|
|
189
|
+
}
|
|
129
190
|
}
|
|
130
191
|
```
|
|
131
192
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
193
|
+
#### 4. 路径别名配置
|
|
194
|
+
|
|
195
|
+
配置模块路径别名,简化导入路径:
|
|
196
|
+
|
|
197
|
+
> 详情参考 [Webpack resolve.alias 文档](https://www.webpackjs.com/configuration/resolve/#resolve-alias)
|
|
198
|
+
|
|
199
|
+
```javascript
|
|
135
200
|
module.exports = {
|
|
136
|
-
...
|
|
137
201
|
webpack: {
|
|
138
202
|
resolve: {
|
|
139
|
-
alias: {
|
|
203
|
+
alias: {
|
|
204
|
+
'@': resolve('src'),
|
|
205
|
+
'components': resolve('src/components')
|
|
206
|
+
}
|
|
140
207
|
}
|
|
141
|
-
}
|
|
142
|
-
...
|
|
208
|
+
}
|
|
143
209
|
}
|
|
144
210
|
```
|
|
145
211
|
|
|
146
|
-
|
|
147
|
-
|
|
212
|
+
#### 5. 页面模板与样式资源
|
|
213
|
+
|
|
214
|
+
```javascript
|
|
148
215
|
module.exports = {
|
|
149
|
-
...
|
|
150
216
|
webpack: {
|
|
151
|
-
template: '',
|
|
152
|
-
sassResources: [
|
|
217
|
+
template: '', // 自定义页面模板路径
|
|
218
|
+
sassResources: [ // 为每个 .scss 文件注入公共 SASS(变量、mixin、function 等)
|
|
219
|
+
resolve('src/assets/css/mixin.scss'),
|
|
220
|
+
resolve('src/assets/css/variables.scss')
|
|
221
|
+
]
|
|
153
222
|
}
|
|
154
|
-
...
|
|
155
223
|
}
|
|
156
224
|
```
|
|
157
225
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
226
|
+
#### 6. 依赖打包策略
|
|
227
|
+
|
|
228
|
+
控制是否忽略 `node_modules` 中的依赖,减少打包体积:
|
|
229
|
+
|
|
230
|
+
```javascript
|
|
161
231
|
module.exports = {
|
|
162
|
-
...
|
|
163
232
|
webpack: {
|
|
164
|
-
ignoreNodeModules: true,
|
|
165
|
-
allowList: [
|
|
233
|
+
ignoreNodeModules: true, // 是否忽略 node_modules 中的依赖文件
|
|
234
|
+
allowList: [ // 配置需要注入 bundle 的依赖包(ignoreNodeModules 为 true 时生效)
|
|
235
|
+
'lodash',
|
|
236
|
+
'axios'
|
|
237
|
+
]
|
|
166
238
|
}
|
|
167
|
-
...
|
|
168
239
|
}
|
|
169
240
|
```
|
|
170
241
|
|
|
171
|
-
|
|
172
|
-
|
|
242
|
+
#### 7. TypeScript 配置
|
|
243
|
+
|
|
244
|
+
```javascript
|
|
173
245
|
module.exports = {
|
|
174
|
-
...
|
|
175
246
|
webpack: {
|
|
176
|
-
createDeclaration: true,
|
|
177
|
-
projectDir: ['./src']
|
|
247
|
+
createDeclaration: true, // 是否生成 TypeScript 声明文件
|
|
248
|
+
projectDir: ['./src'] // 可配置多个目录,用于提升工程执行效率
|
|
178
249
|
}
|
|
179
|
-
...
|
|
180
250
|
}
|
|
181
251
|
```
|
|
182
252
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
253
|
+
#### 8. 环境变量替换
|
|
254
|
+
|
|
255
|
+
基于 [params-replace-loader](https://www.npmjs.com/package/params-replace-loader) 实现环境变量批量替换:
|
|
256
|
+
|
|
257
|
+
> 详情参考 [params-replace-loader 使用文档](https://www.npmjs.com/package/params-replace-loader)
|
|
258
|
+
|
|
259
|
+
```javascript
|
|
186
260
|
module.exports = {
|
|
187
|
-
...
|
|
188
261
|
envParams: {
|
|
189
|
-
common: {
|
|
190
|
-
'#version#': '20200810.1'
|
|
262
|
+
common: { // 通用参数
|
|
263
|
+
'#version#': '20200810.1'
|
|
191
264
|
},
|
|
192
|
-
local: {
|
|
193
|
-
'#dataApiBase#': 'http://localhost:1024',
|
|
265
|
+
local: { // 本地开发环境
|
|
266
|
+
'#dataApiBase#': 'http://localhost:1024', // 数据接口根地址
|
|
194
267
|
'#assetsPublicPath#': 'http://localhost:1024', // 静态资源根地址
|
|
195
|
-
'#routeBasePath#': '/'
|
|
196
|
-
}
|
|
268
|
+
'#routeBasePath#': '/' // 路由根地址
|
|
269
|
+
}
|
|
197
270
|
}
|
|
198
|
-
...
|
|
199
271
|
}
|
|
200
272
|
```
|
|
201
273
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
### 开发配置
|
|
277
|
+
|
|
278
|
+
#### 开发服务器配置
|
|
279
|
+
|
|
280
|
+
配置开发服务器的端口、代理、资源路径等:
|
|
281
|
+
|
|
282
|
+
> 关于 proxyTable 的配置方法,参考 [Webpack DevServer Proxy 文档](https://www.webpackjs.com/configuration/dev-server/#devserver-proxy)
|
|
283
|
+
|
|
284
|
+
```javascript
|
|
205
285
|
module.exports = {
|
|
206
|
-
...
|
|
207
286
|
dev: {
|
|
208
|
-
NODE_ENV: 'development',
|
|
209
|
-
port: 80,
|
|
210
|
-
autoOpenBrowser: true,
|
|
211
|
-
assetsPublicPath: '/',
|
|
212
|
-
assetsSubDirectory: '',
|
|
213
|
-
hostname: 'localhost',
|
|
214
|
-
proxyTable: {
|
|
287
|
+
NODE_ENV: 'development', // development 模式,不会启动 UglifyJsPlugin
|
|
288
|
+
port: 80, // 启动 server 服务的端口
|
|
289
|
+
autoOpenBrowser: true, // 是否自动打开页面
|
|
290
|
+
assetsPublicPath: '/', // 设置静态资源的引用路径(根域名+路径)
|
|
291
|
+
assetsSubDirectory: '', // 资源引用二级路径
|
|
292
|
+
hostname: 'localhost', // 自动打开的页面主机
|
|
293
|
+
proxyTable: { // 接口代理配置
|
|
215
294
|
'/apiTest': {
|
|
216
|
-
target: 'http://api-test.com.cn',
|
|
217
|
-
ws: true,
|
|
218
|
-
changeOrigin: true
|
|
295
|
+
target: 'http://api-test.com.cn', // 不支持跨域的接口根地址
|
|
296
|
+
ws: true, // 启用 WebSocket
|
|
297
|
+
changeOrigin: true // 改变请求头中的 origin
|
|
219
298
|
}
|
|
220
299
|
},
|
|
221
|
-
cssSourceMap: false,
|
|
222
|
-
|
|
223
|
-
|
|
300
|
+
cssSourceMap: false, // CSS Source Map
|
|
301
|
+
https: false // 是否启用 HTTPS(见下方 HTTPS 配置说明)
|
|
302
|
+
}
|
|
224
303
|
}
|
|
225
304
|
```
|
|
226
305
|
|
|
227
|
-
|
|
228
|
-
|
|
306
|
+
#### 本地 HTTPS
|
|
307
|
+
|
|
308
|
+
启用本地 HTTPS 开发服务:
|
|
309
|
+
|
|
310
|
+
> 使用 `https://localhost/index.html` 访问当前项目
|
|
311
|
+
|
|
312
|
+
```javascript
|
|
313
|
+
module.exports = {
|
|
314
|
+
dev: {
|
|
315
|
+
https: true // 默认不开启
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
**注意事项**: akfun 使用自签名证书开启 HTTPS 服务,浏览器会提示安全性问题。需要进行如下设置:
|
|
321
|
+
|
|
322
|
+
- **Chrome**: 浏览器打开 `chrome://flags/#allow-insecure-localhost` 后将其设置为 `Enabled`
|
|
323
|
+
- **其他浏览器**: 类似设置允许本地不安全的 localhost 连接
|
|
324
|
+
|
|
325
|
+
---
|
|
326
|
+
|
|
327
|
+
### 构建配置
|
|
328
|
+
|
|
329
|
+
#### 生产环境构建
|
|
330
|
+
|
|
331
|
+
配置生产构建的输出路径、资源路径、压缩优化等:
|
|
332
|
+
|
|
333
|
+
```javascript
|
|
229
334
|
module.exports = {
|
|
230
|
-
...
|
|
231
335
|
build: {
|
|
232
|
-
NODE_ENV: 'production',
|
|
233
|
-
assetsRoot: resolve('./dist'),
|
|
234
|
-
assetsPublicPath: '/',
|
|
235
|
-
assetsSubDirectory: '',
|
|
236
|
-
productionSourceMap: false,
|
|
237
|
-
productionGzip: false,
|
|
238
|
-
productionGzipExtensions: ['js', 'css', 'json'],
|
|
239
|
-
bundleAnalyzerReport: false
|
|
336
|
+
NODE_ENV: 'production', // production 模式,会启动 UglifyJsPlugin
|
|
337
|
+
assetsRoot: resolve('./dist'), // 打包后的文件绝对路径(物理路径)
|
|
338
|
+
assetsPublicPath: '/', // 设置静态资源的引用路径(根域名+路径)
|
|
339
|
+
assetsSubDirectory: '', // 资源引用二级路径
|
|
340
|
+
productionSourceMap: false, // 是否生成 Source Map
|
|
341
|
+
productionGzip: false, // 是否开启 Gzip 压缩
|
|
342
|
+
productionGzipExtensions: ['js', 'css', 'json'], // Gzip 识别的文件后缀
|
|
343
|
+
bundleAnalyzerReport: false // 是否开启打包分析功能
|
|
240
344
|
}
|
|
241
|
-
...
|
|
242
345
|
}
|
|
243
346
|
```
|
|
244
347
|
|
|
245
|
-
|
|
246
|
-
|
|
348
|
+
#### 库构建(UMD)
|
|
349
|
+
|
|
350
|
+
构建 UMD 格式的库,适用于通过 `<script>` 标签或 CommonJS/AMD 方式引入:
|
|
351
|
+
|
|
352
|
+
```javascript
|
|
247
353
|
module.exports = {
|
|
248
|
-
...
|
|
249
354
|
build2lib: {
|
|
250
|
-
NODE_ENV: 'production',
|
|
251
|
-
libraryName: '',
|
|
252
|
-
assetsRoot: resolve('dist'),
|
|
253
|
-
assetsPublicPath: '/',
|
|
254
|
-
assetsSubDirectory: '',
|
|
255
|
-
productionSourceMap: false,
|
|
256
|
-
productionGzip: false,
|
|
257
|
-
productionGzipExtensions: ['js', 'css', 'json'],
|
|
258
|
-
bundleAnalyzerReport: false
|
|
259
|
-
}
|
|
260
|
-
...
|
|
355
|
+
NODE_ENV: 'production', // production 模式
|
|
356
|
+
libraryName: 'MyLibrary', // 构建第三方功能包时最后导出的引用变量名
|
|
357
|
+
assetsRoot: resolve('dist'), // 编译完成的文件存放路径
|
|
358
|
+
assetsPublicPath: '/', // 设置静态资源的引用路径
|
|
359
|
+
assetsSubDirectory: '', // 资源引用二级路径
|
|
360
|
+
productionSourceMap: false, // 是否生成 Source Map
|
|
361
|
+
productionGzip: false, // 是否开启 Gzip 压缩
|
|
362
|
+
productionGzipExtensions: ['js', 'css', 'json'], // Gzip 识别的文件后缀
|
|
363
|
+
bundleAnalyzerReport: false // 是否开启打包分析功能
|
|
364
|
+
}
|
|
261
365
|
}
|
|
262
366
|
```
|
|
263
367
|
|
|
264
|
-
|
|
265
|
-
|
|
368
|
+
#### 库构建(ESM)
|
|
369
|
+
|
|
370
|
+
构建 ESM 格式的库,适用于现代模块系统:
|
|
371
|
+
|
|
372
|
+
```javascript
|
|
266
373
|
module.exports = {
|
|
267
|
-
...
|
|
268
374
|
build2esm: {
|
|
269
|
-
input: resolve('src/main.js'),
|
|
270
|
-
fileName: 'index',
|
|
271
|
-
svgDir: 'src/icons/**'
|
|
272
|
-
}
|
|
273
|
-
...
|
|
375
|
+
input: resolve('src/main.js'), // 入口文件
|
|
376
|
+
fileName: 'index', // 输出的文件名称
|
|
377
|
+
svgDir: 'src/icons/**' // 用于设置当前项目的 icon 所在目录,避免被 @rollup/plugin-image 编译成 base64 格式
|
|
378
|
+
}
|
|
274
379
|
}
|
|
275
380
|
```
|
|
276
381
|
|
|
277
|
-
|
|
278
|
-
|
|
382
|
+
---
|
|
383
|
+
|
|
384
|
+
### 高级配置
|
|
385
|
+
|
|
386
|
+
#### 自定义 Loader / Plugin / Babel Plugins
|
|
387
|
+
|
|
388
|
+
扩展 Webpack 的 Loader、Plugin 和 Babel 插件:
|
|
389
|
+
|
|
390
|
+
```javascript
|
|
279
391
|
module.exports = {
|
|
280
392
|
webpack: {
|
|
281
|
-
moduleRules: [],
|
|
282
|
-
plugins: [],
|
|
283
|
-
babelPlugins: [
|
|
393
|
+
moduleRules: [], // 用于添加自定义 loaders
|
|
394
|
+
plugins: [], // 用于添加自定义 plugins
|
|
395
|
+
babelPlugins: [ // 用于添加自定义 Babel plugins
|
|
284
396
|
[
|
|
285
397
|
'component',
|
|
286
|
-
{
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
398
|
+
{
|
|
399
|
+
libraryName: 'element-ui',
|
|
400
|
+
styleLibraryName: 'theme-chalk'
|
|
401
|
+
}
|
|
402
|
+
]
|
|
403
|
+
]
|
|
404
|
+
}
|
|
290
405
|
}
|
|
291
406
|
```
|
|
292
|
-
备注: 以上自定义 babelPlugins 用于实现 [element-ui 组件按需引入](https://element.eleme.cn/#/zh-CN/component/quickstart#an-xu-yin-ru)。
|
|
293
407
|
|
|
294
|
-
|
|
295
|
-
|
|
408
|
+
**示例**: 以上自定义 `babelPlugins` 用于实现 [element-ui 组件按需引入](https://element.eleme.cn/#/zh-CN/component/quickstart#an-xu-yin-ru)
|
|
409
|
+
|
|
410
|
+
**函数形式**: 也支持以函数形式动态调整内置 Babel Plugins:
|
|
411
|
+
|
|
412
|
+
```javascript
|
|
296
413
|
module.exports = {
|
|
297
414
|
webpack: {
|
|
298
415
|
babelPlugins: (curBabelPlugins) => {
|
|
299
416
|
curBabelPlugins.push(/* your plugin */)
|
|
300
417
|
return curBabelPlugins
|
|
301
|
-
}
|
|
302
|
-
}
|
|
418
|
+
}
|
|
419
|
+
}
|
|
303
420
|
}
|
|
304
421
|
```
|
|
305
422
|
|
|
306
|
-
|
|
307
|
-
|
|
423
|
+
#### 自定义 CSS Loader / PostCSS Loader
|
|
424
|
+
|
|
425
|
+
自定义 CSS 和 PostCSS 的处理配置:
|
|
426
|
+
|
|
427
|
+
```javascript
|
|
308
428
|
module.exports = {
|
|
309
|
-
...
|
|
310
429
|
webpack: {
|
|
311
430
|
cssLoaderOption: {
|
|
312
|
-
import: false
|
|
431
|
+
import: false // 启用/禁用 @import 解析
|
|
313
432
|
},
|
|
314
|
-
postCssLoaderOption: {
|
|
433
|
+
postCssLoaderOption: { // 自定义 postcss-loader 的配置
|
|
315
434
|
postcssOptions: {
|
|
316
435
|
plugins: [
|
|
317
|
-
require('postcss-pxtorem')({
|
|
318
|
-
rootValue: 16,
|
|
319
|
-
propList: ['*']
|
|
320
|
-
})
|
|
321
|
-
]
|
|
436
|
+
require('postcss-pxtorem')({ // 用于将 px 自动转化为 rem
|
|
437
|
+
rootValue: 16, // 1rem 等于 16px
|
|
438
|
+
propList: ['*'] // 所有属性都转换
|
|
439
|
+
})
|
|
440
|
+
]
|
|
322
441
|
}
|
|
323
442
|
}
|
|
324
443
|
}
|
|
325
|
-
...
|
|
326
444
|
}
|
|
327
445
|
```
|
|
328
446
|
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
447
|
+
---
|
|
448
|
+
|
|
449
|
+
## 其他说明
|
|
450
|
+
|
|
451
|
+
### 多页面与模板
|
|
452
|
+
|
|
453
|
+
- **自动扫描入口**: 当 `entry` 仅配置一个且对应文件不存在时,会自动从 `src/pages` 扫描以 `.ts/.tsx/.js/.jsx` 结尾的文件作为入口,匹配同名 HTML 作为模板(对应正则 `/\.[tj]sx?$/`)
|
|
454
|
+
|
|
455
|
+
- **模板使用范围**: 仅 `dev` 和 `build` 使用页面模板;`build2lib` 不向页面注入打包产物
|
|
456
|
+
|
|
457
|
+
- **模板优先级**:
|
|
458
|
+
1. 优先使用 `./src/index.html`
|
|
459
|
+
2. 不存在时使用内置默认模板
|
|
460
|
+
3. 多页面时,若 `pages` 下存在同名 HTML,将其作为页面模板
|
|
461
|
+
|
|
462
|
+
---
|
|
463
|
+
|
|
464
|
+
## 相关链接
|
|
465
|
+
|
|
466
|
+
- [Webpack 官方文档](https://webpack.js.org/)
|
|
467
|
+
- [Rollup 官方文档](https://rollupjs.org/)
|
|
468
|
+
- [params-replace-loader](https://www.npmjs.com/package/params-replace-loader)
|