@modern-js/module-tools-docs 2.0.0-beta.4
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/LICENSE +144 -0
- package/docs/.island/config.ts +245 -0
- package/docs/.island/dist/404.html +41 -0
- package/docs/.island/dist/assets/before-getting-started.1b82b538.js +87 -0
- package/docs/.island/dist/assets/before-getting-started.582a31cc.js +87 -0
- package/docs/.island/dist/assets/build-config.72eb0918.js +804 -0
- package/docs/.island/dist/assets/build-config.d8bb1658.js +809 -0
- package/docs/.island/dist/assets/build-preset.96805d7d.js +256 -0
- package/docs/.island/dist/assets/build-preset.c20dcd40.js +256 -0
- package/docs/.island/dist/assets/build-your-ui.7f349247.js +2 -0
- package/docs/.island/dist/assets/build-your-ui.a8361604.js +2 -0
- package/docs/.island/dist/assets/command-preview.2d45fc82.js +264 -0
- package/docs/.island/dist/assets/command-preview.dc51b953.js +264 -0
- package/docs/.island/dist/assets/components.esm.03560353.js +9 -0
- package/docs/.island/dist/assets/design-system.86694ff5.js +1254 -0
- package/docs/.island/dist/assets/design-system.c4745cce.js +639 -0
- package/docs/.island/dist/assets/dev.1d326a37.js +37 -0
- package/docs/.island/dist/assets/dev.1fd06000.js +37 -0
- package/docs/.island/dist/assets/down.f35427d3.svg +1 -0
- package/docs/.island/dist/assets/extension.12299fd6.js +2 -0
- package/docs/.island/dist/assets/extension.96dc63a4.js +2 -0
- package/docs/.island/dist/assets/getting-started.40e9218d.js +117 -0
- package/docs/.island/dist/assets/getting-started.b1ed3f10.js +114 -0
- package/docs/.island/dist/assets/github.3bf8ccee.svg +1 -0
- package/docs/.island/dist/assets/index.2b2347ea.js +33 -0
- package/docs/.island/dist/assets/index.6cef6f5f.js +4 -0
- package/docs/.island/dist/assets/index.cb118238.js +36 -0
- package/docs/.island/dist/assets/index.ccb6ce27.js +4 -0
- package/docs/.island/dist/assets/island_inject.11a12ecc.js +1 -0
- package/docs/.island/dist/assets/island_inject.b13deaee.js +1 -0
- package/docs/.island/dist/assets/loading.8c9bb911.svg +1 -0
- package/docs/.island/dist/assets/modify-output-product.7f6bff35.js +100 -0
- package/docs/.island/dist/assets/modify-output-product.b91eff1f.js +100 -0
- package/docs/.island/dist/assets/moon.6b705924.svg +3 -0
- package/docs/.island/dist/assets/plugin.895932d8.js +42 -0
- package/docs/.island/dist/assets/plugin.d2fbc531.js +42 -0
- package/docs/.island/dist/assets/publish-your-project.21b8309f.js +164 -0
- package/docs/.island/dist/assets/publish-your-project.8d398b17.js +166 -0
- package/docs/.island/dist/assets/right.89674cd7.svg +1 -0
- package/docs/.island/dist/assets/search.0aea6901.svg +1 -0
- package/docs/.island/dist/assets/search.1c85d17c.js +3 -0
- package/docs/.island/dist/assets/search.484eca11.js +222 -0
- package/docs/.island/dist/assets/search.54fca8d0.js +3 -0
- package/docs/.island/dist/assets/style.09015a4b.css +1 -0
- package/docs/.island/dist/assets/style.2e5f7bc2.css +1970 -0
- package/docs/.island/dist/assets/sun.841dac10.svg +11 -0
- package/docs/.island/dist/assets/test-your-project.18bd4582.js +190 -0
- package/docs/.island/dist/assets/test-your-project.f53bebf7.js +190 -0
- package/docs/.island/dist/assets/test.0da1f99f.js +67 -0
- package/docs/.island/dist/assets/test.0e81f002.js +66 -0
- package/docs/.island/dist/assets/translator.b1077c44.svg +1 -0
- package/docs/.island/dist/assets/use-micro-generator.7d9e4016.js +60 -0
- package/docs/.island/dist/assets/use-micro-generator.db5520c1.js +60 -0
- package/docs/.island/dist/assets/using-storybook.57ea6b77.js +260 -0
- package/docs/.island/dist/assets/using-storybook.a2212f2e.js +260 -0
- package/docs/.island/dist/assets/welcome.0449a9c8.js +13 -0
- package/docs/.island/dist/assets/welcome.a8448931.js +13 -0
- package/docs/.island/dist/assets/why-module-engineering-solution.6ae8c0e3.js +26 -0
- package/docs/.island/dist/assets/why-module-engineering-solution.c9a45cbd.js +26 -0
- package/docs/.island/dist/chunk-COLCRJ2V.js +1 -0
- package/docs/.island/dist/chunk-K5FMOYDC.js +10 -0
- package/docs/.island/dist/chunk-WE42KMYS.js +26 -0
- package/docs/.island/dist/client-entry.js +3 -0
- package/docs/.island/dist/en/api/build-config.html +344 -0
- package/docs/.island/dist/en/api/build-preset.html +82 -0
- package/docs/.island/dist/en/api/design-system.html +155 -0
- package/docs/.island/dist/en/api/dev.html +45 -0
- package/docs/.island/dist/en/api/index.html +41 -0
- package/docs/.island/dist/en/api/plugin.html +48 -0
- package/docs/.island/dist/en/api/test.html +58 -0
- package/docs/.island/dist/en/guide/before-getting-started.html +127 -0
- package/docs/.island/dist/en/guide/build-your-ui.html +41 -0
- package/docs/.island/dist/en/guide/command-preview.html +100 -0
- package/docs/.island/dist/en/guide/extension.html +41 -0
- package/docs/.island/dist/en/guide/getting-started.html +76 -0
- package/docs/.island/dist/en/guide/modify-output-product.html +140 -0
- package/docs/.island/dist/en/guide/publish-your-project.html +91 -0
- package/docs/.island/dist/en/guide/test-your-project.html +72 -0
- package/docs/.island/dist/en/guide/use-micro-generator.html +65 -0
- package/docs/.island/dist/en/guide/using-storybook.html +113 -0
- package/docs/.island/dist/en/guide/welcome.html +53 -0
- package/docs/.island/dist/en/guide/why-module-engineering-solution.html +49 -0
- package/docs/.island/dist/en/index.html +42 -0
- package/docs/.island/dist/react-dom.js +1 -0
- package/docs/.island/dist/react-dom_client.js +1 -0
- package/docs/.island/dist/react.js +1 -0
- package/docs/.island/dist/react_jsx-runtime.js +10 -0
- package/docs/.island/dist/ssr-manifest.json +57 -0
- package/docs/.island/dist/test-result.png +0 -0
- package/docs/.island/dist/why-module-solution.png +0 -0
- package/docs/.island/dist/zh/api/build-config.html +347 -0
- package/docs/.island/dist/zh/api/build-preset.html +82 -0
- package/docs/.island/dist/zh/api/design-system.html +149 -0
- package/docs/.island/dist/zh/api/dev.html +46 -0
- package/docs/.island/dist/zh/api/index.html +41 -0
- package/docs/.island/dist/zh/api/plugin.html +48 -0
- package/docs/.island/dist/zh/api/test.html +59 -0
- package/docs/.island/dist/zh/guide/before-getting-started.html +127 -0
- package/docs/.island/dist/zh/guide/build-your-ui.html +41 -0
- package/docs/.island/dist/zh/guide/command-preview.html +100 -0
- package/docs/.island/dist/zh/guide/extension.html +41 -0
- package/docs/.island/dist/zh/guide/getting-started.html +79 -0
- package/docs/.island/dist/zh/guide/modify-output-product.html +140 -0
- package/docs/.island/dist/zh/guide/publish-your-project.html +92 -0
- package/docs/.island/dist/zh/guide/test-your-project.html +72 -0
- package/docs/.island/dist/zh/guide/use-micro-generator.html +65 -0
- package/docs/.island/dist/zh/guide/using-storybook.html +114 -0
- package/docs/.island/dist/zh/guide/welcome.html +53 -0
- package/docs/.island/dist/zh/guide/why-module-engineering-solution.html +49 -0
- package/docs/.island/dist/zh/index.html +42 -0
- package/docs/.island/index.html +39 -0
- package/docs/.island/styles/index.css +10 -0
- package/docs/en/api/build-config.md +501 -0
- package/docs/en/api/build-preset.md +214 -0
- package/docs/en/api/design-system.md +524 -0
- package/docs/en/api/dev.md +32 -0
- package/docs/en/api/index.md +3 -0
- package/docs/en/api/plugin.md +34 -0
- package/docs/en/api/test.md +48 -0
- package/docs/en/guide/advance/asset.mdx +132 -0
- package/docs/en/guide/advance/build-umd.mdx +241 -0
- package/docs/en/guide/advance/copy.md +235 -0
- package/docs/en/guide/advance/external-dependency.mdx +125 -0
- package/docs/en/guide/advance/in-depth-about-build.md +266 -0
- package/docs/en/guide/advance/in-depth-about-dev-command.md +22 -0
- package/docs/en/guide/basic/before-getting-started.md +187 -0
- package/docs/en/guide/basic/command-preview.md +204 -0
- package/docs/en/guide/basic/modify-output-product.md +145 -0
- package/docs/en/guide/basic/publish-your-project.md +115 -0
- package/docs/en/guide/basic/test-your-project.mdx +158 -0
- package/docs/en/guide/basic/use-micro-generator.md +35 -0
- package/docs/en/guide/basic/using-storybook.mdx +187 -0
- package/docs/en/guide/intro/getting-started.md +78 -0
- package/docs/en/guide/intro/welcome.md +14 -0
- package/docs/en/guide/intro/why-module-engineering-solution.md +17 -0
- package/docs/en/index.md +35 -0
- package/docs/public/test-result.png +0 -0
- package/docs/public/why-module-solution.png +0 -0
- package/docs/zh/api/build-config.md +570 -0
- package/docs/zh/api/build-preset.md +220 -0
- package/docs/zh/api/design-system.md +1147 -0
- package/docs/zh/api/dev.md +33 -0
- package/docs/zh/api/index.md +3 -0
- package/docs/zh/api/plugins.md +108 -0
- package/docs/zh/api/testing.md +52 -0
- package/docs/zh/guide/advance/asset.mdx +132 -0
- package/docs/zh/guide/advance/build-umd.mdx +232 -0
- package/docs/zh/guide/advance/copy.md +235 -0
- package/docs/zh/guide/advance/external-dependency.mdx +125 -0
- package/docs/zh/guide/advance/in-depth-about-build.md +267 -0
- package/docs/zh/guide/advance/in-depth-about-dev-command.md +26 -0
- package/docs/zh/guide/basic/before-getting-started.md +187 -0
- package/docs/zh/guide/basic/command-preview.md +204 -0
- package/docs/zh/guide/basic/modify-output-product.md +144 -0
- package/docs/zh/guide/basic/publish-your-project.md +112 -0
- package/docs/zh/guide/basic/test-your-project.mdx +158 -0
- package/docs/zh/guide/basic/use-micro-generator.md +35 -0
- package/docs/zh/guide/basic/using-storybook.mdx +186 -0
- package/docs/zh/guide/intro/getting-started.md +78 -0
- package/docs/zh/guide/intro/welcome.md +14 -0
- package/docs/zh/guide/intro/why-module-engineering-solution.md +17 -0
- package/docs/zh/index.md +29 -0
- package/package.json +19 -0
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
# 使用 Copy 工具
|
|
2
|
+
|
|
3
|
+
模块工程提供了 Copy 工具用于将已经存在的单个文件或整个目录复制到产物目录中。接下来我们学习如何使用它。
|
|
4
|
+
|
|
5
|
+
## 了解 Copy API
|
|
6
|
+
|
|
7
|
+
我们可以通过 [`buildConfig.copy`](/zh/api/build-config#copy) API 来使用 Copy 工具,它包含以下两个主要配置:
|
|
8
|
+
|
|
9
|
+
* [`patterns`](/zh/api/build-config#copypatterns)
|
|
10
|
+
* [`options`](/zh/api/build-config#copyoptions)
|
|
11
|
+
|
|
12
|
+
在开始学习之前可以先花一些时间了解它们。
|
|
13
|
+
|
|
14
|
+
## API 详解
|
|
15
|
+
|
|
16
|
+
`copy.patterns` 用于寻找复制的文件以及配置输出的路径。
|
|
17
|
+
|
|
18
|
+
其中 `patterns.from` 用于指定要复制的文件或者目录。它接收 Glob 形式字符串或具体路径。Glob 形式字符串是指 [fast-glob pattern-syntax](https://github.com/mrmlnc/fast-glob#pattern-syntax)。因此我们可以按照如下两种方式使用它:
|
|
19
|
+
|
|
20
|
+
``` ts
|
|
21
|
+
export default defineConfig({
|
|
22
|
+
buildConfig: {
|
|
23
|
+
copy: {
|
|
24
|
+
patterns: [
|
|
25
|
+
{ from: './index.html', to: ''},
|
|
26
|
+
{ from: './*.html', to: ''},
|
|
27
|
+
]
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
`patterns.context` 一般和 `patterns.from` 配合使用,默认情况下它的值与 [`buildConfig.sourceDir`](/zh/api/build-config#sourcedir) 相同,因此我们可以按照如下方式指定 `src/data.json` 文件为要复制的文件:
|
|
34
|
+
> 默认情况下,`buildConfig.sourceDir` 为 `src`
|
|
35
|
+
|
|
36
|
+
``` ts
|
|
37
|
+
export default defineConfig({
|
|
38
|
+
buildConfig: {
|
|
39
|
+
copy: {
|
|
40
|
+
patterns: [
|
|
41
|
+
{ from: './data.json' to: ''},
|
|
42
|
+
],
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
当指定的文件不在源码目录的时候,可以修改 `context` 配置。例如指定项目目录下的 `temp/index.html` 为要复制的文件:
|
|
49
|
+
|
|
50
|
+
```ts
|
|
51
|
+
import path from 'path';
|
|
52
|
+
|
|
53
|
+
export default defineConfig({
|
|
54
|
+
buildConfig: {
|
|
55
|
+
copy: {
|
|
56
|
+
patterns: [
|
|
57
|
+
{
|
|
58
|
+
from: './index.html',
|
|
59
|
+
context: path.join(__dirname, './temp')
|
|
60
|
+
to: '',
|
|
61
|
+
}
|
|
62
|
+
],
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
`patterns.to` 用于指定复制文件的输出路径,默认情况下它的值为 [`buildConfig.outdir`](zh/api/build-config#outdir)对应的值。因此我们按照如下方式将 `src/index.html` 复制到 `dist` 目录下:
|
|
69
|
+
|
|
70
|
+
``` ts
|
|
71
|
+
export default defineConfig({
|
|
72
|
+
buildConfig: {
|
|
73
|
+
copy: {
|
|
74
|
+
patterns: [
|
|
75
|
+
{ from: './index.html', }
|
|
76
|
+
],
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
当我们配置了 `patterns.to` 的时候:
|
|
83
|
+
|
|
84
|
+
* 如果是相对路径,则该路径会相对于 `buildConfig.outdir` 计算出复制文件输出的绝对路径。
|
|
85
|
+
* 如果是绝对路径,则会直接使用该值。
|
|
86
|
+
|
|
87
|
+
最后 `patterns.globOptions` 用于配置寻找复制文件 [globby](https://github.com/sindresorhus/globby) 对象,其配置可参考:
|
|
88
|
+
|
|
89
|
+
* [globby.options](https://github.com/sindresorhus/globby#options)
|
|
90
|
+
|
|
91
|
+
## 不同场景使用示例
|
|
92
|
+
|
|
93
|
+
### 将文件复制文件
|
|
94
|
+
|
|
95
|
+
``` ts
|
|
96
|
+
export default defineConfig({
|
|
97
|
+
buildConfig: [
|
|
98
|
+
{
|
|
99
|
+
outdir: 'dist',
|
|
100
|
+
copy: {
|
|
101
|
+
patterns: [
|
|
102
|
+
/**
|
|
103
|
+
* copy file to file
|
|
104
|
+
*/
|
|
105
|
+
{
|
|
106
|
+
from: './temp-1/a.png',
|
|
107
|
+
context: __dirname,
|
|
108
|
+
to: './temp-1/b.png',
|
|
109
|
+
},
|
|
110
|
+
],
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
]
|
|
114
|
+
});
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### 将文件复制到目录
|
|
118
|
+
|
|
119
|
+
``` ts
|
|
120
|
+
export default defineConfig({
|
|
121
|
+
buildConfig: [
|
|
122
|
+
{
|
|
123
|
+
outdir: 'dist',
|
|
124
|
+
copy: {
|
|
125
|
+
patterns: [
|
|
126
|
+
/**
|
|
127
|
+
* copy file to dir
|
|
128
|
+
*/
|
|
129
|
+
{
|
|
130
|
+
from: './temp-2/a.png',
|
|
131
|
+
context: __dirname,
|
|
132
|
+
to: './temp-2',
|
|
133
|
+
},
|
|
134
|
+
],
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
],
|
|
138
|
+
});
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### 从目录复制到目录
|
|
142
|
+
|
|
143
|
+
``` ts
|
|
144
|
+
export default defineConfig({
|
|
145
|
+
buildConfig: [
|
|
146
|
+
{
|
|
147
|
+
outdir: 'dist',
|
|
148
|
+
copy: {
|
|
149
|
+
patterns: [
|
|
150
|
+
/**
|
|
151
|
+
* copy dir to dir
|
|
152
|
+
*/
|
|
153
|
+
{
|
|
154
|
+
from: './temp-3/',
|
|
155
|
+
to: './temp-3',
|
|
156
|
+
context: __dirname,
|
|
157
|
+
},
|
|
158
|
+
],
|
|
159
|
+
options: {
|
|
160
|
+
enableCopySync: true,
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
],
|
|
165
|
+
});
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### 从目录到文件
|
|
169
|
+
|
|
170
|
+
``` ts
|
|
171
|
+
export default defineConfig({
|
|
172
|
+
buildConfig: [
|
|
173
|
+
{
|
|
174
|
+
outdir: 'dist',
|
|
175
|
+
copy: {
|
|
176
|
+
patterns: [
|
|
177
|
+
/**
|
|
178
|
+
* copy dir to file
|
|
179
|
+
*/
|
|
180
|
+
{
|
|
181
|
+
from: './temp-4/',
|
|
182
|
+
context: __dirname,
|
|
183
|
+
to: './temp-4/_index.html',
|
|
184
|
+
},
|
|
185
|
+
],
|
|
186
|
+
options: {
|
|
187
|
+
enableCopySync: true,
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
],
|
|
192
|
+
});
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### 使用 Glob
|
|
196
|
+
|
|
197
|
+
``` ts
|
|
198
|
+
export default defineConfig({
|
|
199
|
+
buildConfig: [
|
|
200
|
+
{
|
|
201
|
+
outdir: 'dist',
|
|
202
|
+
copy: {
|
|
203
|
+
patterns: [
|
|
204
|
+
/**
|
|
205
|
+
* copy glob to dir
|
|
206
|
+
*/
|
|
207
|
+
{
|
|
208
|
+
from: './*.html',
|
|
209
|
+
to: './temp-5',
|
|
210
|
+
},
|
|
211
|
+
],
|
|
212
|
+
options: {
|
|
213
|
+
enableCopySync: true,
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
copy: {
|
|
219
|
+
patterns: [
|
|
220
|
+
/**
|
|
221
|
+
* copy glob to file
|
|
222
|
+
*/
|
|
223
|
+
{
|
|
224
|
+
from: './*.html',
|
|
225
|
+
to: './temp-6/index.html',
|
|
226
|
+
},
|
|
227
|
+
],
|
|
228
|
+
options: {
|
|
229
|
+
enableCopySync: true,
|
|
230
|
+
},
|
|
231
|
+
},
|
|
232
|
+
},
|
|
233
|
+
],
|
|
234
|
+
});
|
|
235
|
+
```
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# 如何处理第三方依赖
|
|
2
|
+
|
|
3
|
+
一般来说,项目所需要的第三方依赖可以通过包管理器的 `install` 命令安装,在安装第三方依赖成功后,这些第三方依赖一般会出现在项目 `package.json` 的 `dependencies` 和 `devDependencies` 下。
|
|
4
|
+
|
|
5
|
+
``` json pacakge.json
|
|
6
|
+
{
|
|
7
|
+
"dependencies": {},
|
|
8
|
+
"devDependencies": {}
|
|
9
|
+
}
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
而 `"dependencies"` 下的依赖通常来说是和项目代码以及构建相关的,如果这些第三方依赖声明在 `"devDependencies"` 下,那么在生产环境下就会出现缺失依赖的问题。
|
|
13
|
+
|
|
14
|
+
除了 `"dependencies"` 以外,[`"peerDependencies"`](/zh/guide/basic/before-getting-started#peerdependencies) 也可以声明在生产环境下需要的依赖,不过它更强调项目在运行环境下存在 `"peerDependencies"` 声明的这些依赖,这类似于插件这样的机制。
|
|
15
|
+
|
|
16
|
+
## 第三方依赖的默认处理
|
|
17
|
+
|
|
18
|
+
在模块工程里,**默认情况下不会对`"dependencies"` 以及 `"peerDependencies"` 下的第三方依赖进行打包处理**,因此:
|
|
19
|
+
|
|
20
|
+
<CH.Spotlight>
|
|
21
|
+
|
|
22
|
+
```json ./v1/package.json
|
|
23
|
+
{
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"react": "^17"
|
|
26
|
+
},
|
|
27
|
+
// or
|
|
28
|
+
"peerDependencies": {
|
|
29
|
+
"react": "^17"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
如果项目依赖了 `react`。
|
|
37
|
+
|
|
38
|
+
```json ./v1/package.json
|
|
39
|
+
{
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"react": "^17"
|
|
42
|
+
},
|
|
43
|
+
// or
|
|
44
|
+
"peerDependencies": {
|
|
45
|
+
"react": "^17"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
当源码中使用了 `react` 依赖。
|
|
53
|
+
|
|
54
|
+
``` tsx src/index.ts
|
|
55
|
+
import React from "react";
|
|
56
|
+
console.info(React);
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
此时产物中不会将 `react` 代码打包到产物中。
|
|
62
|
+
|
|
63
|
+
``` js dist/index.js
|
|
64
|
+
import React from "react";
|
|
65
|
+
console.info(React);
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
</CH.Spotlight>
|
|
69
|
+
|
|
70
|
+
## 打包第三方依赖
|
|
71
|
+
|
|
72
|
+
不过也有一些情况希望将这些第三方依赖打包到产物。将第三方依赖打包到产物的好处是:**减少下载第三方依赖所花费的时间**。
|
|
73
|
+
|
|
74
|
+
这种处理第三方依赖的方式一般在开发命令行工具中比较常见,这可以提升命令行工具的加载速度,给使用者带来更好的使用体验。
|
|
75
|
+
|
|
76
|
+
那么如何在模块工程中开启对于第三方依赖的打包处理呢?
|
|
77
|
+
|
|
78
|
+
在构建配置中提供了以下 API 来处理第三方依赖:
|
|
79
|
+
|
|
80
|
+
* [`buildConfig.autoExternal`](/zh/api/build-config#autoexternal)
|
|
81
|
+
* [`buildConfig.externals`](/zh/api/build-config#externals)
|
|
82
|
+
|
|
83
|
+
### 关闭默认行为
|
|
84
|
+
|
|
85
|
+
当我们希望关闭对于第三方依赖的默认处理行为时候,可以通过以下方式来实现:
|
|
86
|
+
|
|
87
|
+
``` ts
|
|
88
|
+
export default defineConfig({
|
|
89
|
+
buildConfig: {
|
|
90
|
+
autoExternal: false,
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
这样对于 `"dependencies"` 和 `"peerDependencies"` 下面的依赖都会进行打包处理。如果只想要关闭其中某个下面的依赖处理,则可以使用
|
|
96
|
+
`buildConfig.autoExternal` 的对象形式:
|
|
97
|
+
|
|
98
|
+
``` ts
|
|
99
|
+
export default defineConfig({
|
|
100
|
+
buildConfig: {
|
|
101
|
+
autoExternal: {
|
|
102
|
+
dependencies: false,
|
|
103
|
+
peerDependencies: false,
|
|
104
|
+
},
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 排除指定第三方依赖
|
|
110
|
+
|
|
111
|
+
而除了 `buildConfig.autoExternal` API以外,`buildConfig.externals` 也可以控制哪些第三方依赖要进行处理。我们可以组合这两个
|
|
112
|
+
API 对项目的依赖进行更细微的处理。
|
|
113
|
+
|
|
114
|
+
例如当我们需要仅对某些依赖不进行打包处理的时候,可以按照如下方式进行配置:
|
|
115
|
+
|
|
116
|
+
> 一般这种情况,可能是某些依赖不适合进行打包处理。如果遇到这种情况,则可以按照下面的方式进行处理。
|
|
117
|
+
|
|
118
|
+
``` ts
|
|
119
|
+
epxort default defineConfig({
|
|
120
|
+
buildConfig: {
|
|
121
|
+
autoExternal: false,
|
|
122
|
+
externals: ['pkg-1', /pkg-2/],
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
```
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
# 深入理解构建
|
|
2
|
+
|
|
3
|
+
在【基础使用】的部分,我们已经知道可以通过 `buildConfig` 配置对项目的输出产物进行修改。`buildConfig` 不仅描述了产物的一些特性,同时还为构建产物提供了一些功能。
|
|
4
|
+
|
|
5
|
+
:::tip{title=注意}
|
|
6
|
+
如果你还不清楚 `buildConfig` 是什么,建议花一些时间通过下面的链接了解一下:
|
|
7
|
+
|
|
8
|
+
* 【[修改输出产物](/zh/guide/modify-output-product)】
|
|
9
|
+
:::
|
|
10
|
+
|
|
11
|
+
而在本章里我们将要深入理解某些构建配置的使用以及了解执行 `modern build` 命令的时候发生了什么。
|
|
12
|
+
|
|
13
|
+
## 深入理解 `buildConfig`
|
|
14
|
+
|
|
15
|
+
### Bundle 和 Bundleless
|
|
16
|
+
|
|
17
|
+
那么首先我们来了解一下 Bundle 和 Bundleless。
|
|
18
|
+
|
|
19
|
+
所谓 Bundle 是指对构建产物进行打包,构建产物可能是一个文件,也有可能是基于一定的[代码拆分策略](https://esbuild.github.io/api/#splitting)得到的多个文件。
|
|
20
|
+
|
|
21
|
+
而 Bundleless 则是指对每个源文件单独进行编译构建,但是并不将它们打包在一起。每一个产物文件都可以找到与之相对应的源码文件。**Bundleless 构建的过程,也可以理解为仅对源文件进行代码转换的过程**。
|
|
22
|
+
|
|
23
|
+
在 `buildConfig` 中可以通过 [`buildConfig.buildType`](/zh/api/build-config#buildtype) 来指定当前构建任务是 Bundle 还是 Bundleless。
|
|
24
|
+
|
|
25
|
+
### `input` 与 `sourceDir` 的关系
|
|
26
|
+
|
|
27
|
+
[`buildConfig.input`](/zh/api/build-config#input) 用于指定读取源码的文件路径或者目录路径,其默认值在 Bundle 和 Bundleless 构建过程中有所不同:
|
|
28
|
+
|
|
29
|
+
* 当 `buildType: 'bundle'` 的时候,`input` 默认值为 `['src/index.ts']`
|
|
30
|
+
* 当 `buildType: 'bundleless'` 的时候,`input` 默认值为 `['src']`
|
|
31
|
+
> 实际上,在 `buildType: 'bundle'` 的时候,构建工具会检测是否存在符合 `src/index.(j|t)sx?` 这个名称规则的文件,并将其作为入口文件。
|
|
32
|
+
|
|
33
|
+
:::warn{title=注意}
|
|
34
|
+
建议不要在 Bundleless 构建过程中指定多个源码文件目录,可能出现不符合预期的结果。目前多个源码目录的 Bundleless 构建还处于不稳定阶段。
|
|
35
|
+
:::
|
|
36
|
+
|
|
37
|
+
从默认值上我们可以知道:**Bundle 构建一般可以指定文件路径作为构建的入口,而 Bundleless 构建则更期望使用目录路径寻找源文件**。
|
|
38
|
+
|
|
39
|
+
#### `input` 的对象模式
|
|
40
|
+
|
|
41
|
+
在 Bundle 构建过程中,除了将 `input` 设置为一个数组,也可以将它设置为一个对象。**通过使用对象的形式,我们可以修改构建产物输出的文件名称**。那么对于下面的例子,`./src/index.ts` 对应的构建产物文件路径为 `./dist/main.js`。
|
|
42
|
+
|
|
43
|
+
``` tsx modern.config.ts
|
|
44
|
+
import { defineConfig } from '@modern-js/module-tools';
|
|
45
|
+
|
|
46
|
+
export default defineConfig({
|
|
47
|
+
buildConfig: {
|
|
48
|
+
input: {
|
|
49
|
+
main: ['./src/index.ts'],
|
|
50
|
+
},
|
|
51
|
+
outdir: './dist',
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
而在 Bundleless 构建过程中,虽然同样支持这样的使用方式,但是并不推荐。
|
|
57
|
+
|
|
58
|
+
#### `sourceDir`
|
|
59
|
+
|
|
60
|
+
[`sourceDir`](/zh/api/build-config#sourcedir) 用于指定源码目录,它主要与以下两个内容有关系:
|
|
61
|
+
|
|
62
|
+
* 类型文件生成
|
|
63
|
+
* 指定构建过程中的 [`outbase`](https://esbuild.github.io/api/#outbase)
|
|
64
|
+
|
|
65
|
+
一般来说:
|
|
66
|
+
|
|
67
|
+
* **在 Bundleless 构建过程中,`sourceDir` 与 `input` 的值要保持一致,它们的默认值都是 `src`**。
|
|
68
|
+
* 在 Bundle 构建过程中,很少需要使用 `sourceDir`。
|
|
69
|
+
|
|
70
|
+
### 类型文件
|
|
71
|
+
|
|
72
|
+
[`buildConfig.dts`](/zh/api/build-config#dts) 配置主要用于类型文件的生成。
|
|
73
|
+
|
|
74
|
+
#### 关闭类型生成
|
|
75
|
+
|
|
76
|
+
默认情况下类型生成功能是开启的,如果需要关闭的话,可以按照如下配置:
|
|
77
|
+
|
|
78
|
+
```ts ./modern.config.ts
|
|
79
|
+
import { defineConfig } from '@modern-js/module-tools';
|
|
80
|
+
|
|
81
|
+
export default defineConfig({
|
|
82
|
+
buildConfig: {
|
|
83
|
+
dts: false
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
:::tip
|
|
89
|
+
关闭类型文件后,一般来说构建速度会有所提升。
|
|
90
|
+
:::
|
|
91
|
+
|
|
92
|
+
#### 打包类型文件
|
|
93
|
+
|
|
94
|
+
在 `buildType: 'bundleless'` 的时候,类型文件的生成是使用项目的 `tsc` 命令来完成生产。
|
|
95
|
+
|
|
96
|
+
**模块工程解决方案同时还支持对类型文件进行打包**,不过使用该功能的时候需要注意:
|
|
97
|
+
|
|
98
|
+
* 一些第三方依赖存在错误的语法会导致打包过程失败。因此对于这种情况,需要手动通过 [`buildConfig.externals`](/zh/api/build-config#externals) 将这类第三方包排除。
|
|
99
|
+
* 对于第三方依赖的类型文件指向的是一个 `.ts` 文件的情况,目前无法处理。比如第三方依赖的 `package.json` 中存在这样的内容: `{"types": "./src/index.ts"}`。
|
|
100
|
+
|
|
101
|
+
#### 别名转换
|
|
102
|
+
|
|
103
|
+
在 Bundleless 构建过程中,如果源代码中出现了别名,例如:
|
|
104
|
+
|
|
105
|
+
```ts ./src/index.ts
|
|
106
|
+
import utils from '@common/utils';
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
正常来说,使用 `tsc` 生成的产物类型文件也会包含这些别名。不过 Module Tools 会对 `tsc` 生成的类型文件里的别名进行转换处理:
|
|
110
|
+
|
|
111
|
+
* 对于类似 `import '@common/utils'` 或者 `import utils from '@common/utils'` 这样形式的代码可以进行别名转换。
|
|
112
|
+
* 对于类似 `export { utils } from '@common/utils'` 这样形式的代码可以进行别名转换。
|
|
113
|
+
|
|
114
|
+
然而也存在一些情况,目前还无法处理:
|
|
115
|
+
|
|
116
|
+
* 对于类似 `Promise<import('@common/utils')>` 这样形式的输出类型目前无法进行转换。
|
|
117
|
+
|
|
118
|
+
#### 一些 `dts` 的使用示例
|
|
119
|
+
|
|
120
|
+
一般使用方式:
|
|
121
|
+
|
|
122
|
+
``` ts
|
|
123
|
+
import { defineConfig } from '@modern-js/module-tools';
|
|
124
|
+
|
|
125
|
+
export default defineConfig({
|
|
126
|
+
// 此时打包的类型文件输出路径为 `./dist/types`
|
|
127
|
+
buildConfig: {
|
|
128
|
+
buildType: 'bundle',
|
|
129
|
+
dts: {
|
|
130
|
+
tsconfigPath: './other-tsconfig.json',
|
|
131
|
+
distPath: './types',
|
|
132
|
+
},
|
|
133
|
+
outdir: './dist',
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
使用 `dts.only` 的情况:
|
|
139
|
+
|
|
140
|
+
``` ts
|
|
141
|
+
import { defineConfig } from '@modern-js/module-tools';
|
|
142
|
+
|
|
143
|
+
export default defineConfig({
|
|
144
|
+
// 此时类型文件没有进行打包,输出路径为 `./dist/types`
|
|
145
|
+
buildConfig: [
|
|
146
|
+
{
|
|
147
|
+
buildType: 'bundle',
|
|
148
|
+
dts: false,
|
|
149
|
+
outdir: './dist',
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
buildType: 'bundleless',
|
|
153
|
+
dts: {
|
|
154
|
+
only: true,
|
|
155
|
+
},
|
|
156
|
+
outdir: './dist/types',
|
|
157
|
+
}
|
|
158
|
+
]
|
|
159
|
+
});
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### `buildConfig.define` 不同场景的使用方式
|
|
163
|
+
|
|
164
|
+
[`buildConfig.define`](/zh/api/build-config#define) 功能有些类似 [`webpack.DefinePlugin`](https://webpack.js.org/plugins/define-plugin/)。这里介绍几个使用场景:
|
|
165
|
+
|
|
166
|
+
#### 环境变量替换
|
|
167
|
+
|
|
168
|
+
``` ts
|
|
169
|
+
import { defineConfig } from '@modern-js/module-tools';
|
|
170
|
+
export default defineConfig({
|
|
171
|
+
buildConfig: {
|
|
172
|
+
define: {
|
|
173
|
+
'process.env.VERSION': JSON.stringify(process.env.VERSION || '0.0.0')
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
通过上面的配置,我们就可以将下面这段代码:
|
|
180
|
+
|
|
181
|
+
```
|
|
182
|
+
// 编译前代码
|
|
183
|
+
console.log(process.env.VERSION);
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
在执行 `VERSION=1.0.0 modern build` 的时候,转换为:
|
|
187
|
+
|
|
188
|
+
```
|
|
189
|
+
// 编译后代码
|
|
190
|
+
console.log('1.0.0');
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
#### 全局变量替换
|
|
194
|
+
|
|
195
|
+
``` ts
|
|
196
|
+
import { defineConfig } from '@modern-js/module-tools';
|
|
197
|
+
export default defineConfig({
|
|
198
|
+
buildConfig: {
|
|
199
|
+
define: {
|
|
200
|
+
'VERSION': JSON.stringify(require('./package.json').version || '0.0.0')
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
通过上面的配置,我们就可以将下面这段代码:
|
|
207
|
+
|
|
208
|
+
```
|
|
209
|
+
// 编译前代码
|
|
210
|
+
console.log(VERSION);
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
转换为:
|
|
214
|
+
|
|
215
|
+
```
|
|
216
|
+
// 编译后代码
|
|
217
|
+
console.log('1.0.0');
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
不过要注意:如果项目是一个 TypeScript 项目,那么你可能需要在项目源代码目录下的 `.d.ts` 文件里增加以下内容:
|
|
221
|
+
> 如果不存在 `d.ts` 文件,则可以手动创建。
|
|
222
|
+
|
|
223
|
+
``` ts env.d.ts
|
|
224
|
+
declare const YOUR_ADD_GLOBAL_VAR;
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
## 构建过程
|
|
229
|
+
|
|
230
|
+
当执行 `modern build` 命令的时候,会发生
|
|
231
|
+
|
|
232
|
+
* 根据 `buildConfig.outdir` 清理产物目录。
|
|
233
|
+
* 编译 `js/ts` 源代码生成 Bundle/Bundleless 的 JS 构建产物。
|
|
234
|
+
* 使用 `tsc` 生成 Bundle/Bundleless 的类型文件。
|
|
235
|
+
* 处理 Copy 任务。
|
|
236
|
+
|
|
237
|
+
## 构建报错
|
|
238
|
+
|
|
239
|
+
当发生构建报错的时候,基于以上了解到的信息,可以很容易的明白在终端出现的报错内容:
|
|
240
|
+
|
|
241
|
+
**js 或者 ts 构建的报错:**
|
|
242
|
+
``` bash
|
|
243
|
+
error ModuleBuildError:
|
|
244
|
+
|
|
245
|
+
╭───────────────────────╮
|
|
246
|
+
│ bundle failed: │
|
|
247
|
+
│ - format is "cjs" │
|
|
248
|
+
│ - target is "esnext" │
|
|
249
|
+
╰───────────────────────╯
|
|
250
|
+
|
|
251
|
+
Detailed Information:
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
**类型文件生成过程的报错:**
|
|
255
|
+
|
|
256
|
+
``` bash
|
|
257
|
+
error ModuleBuildError:
|
|
258
|
+
|
|
259
|
+
bundle DTS failed:
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
对于 `js/ts` 构建错误,我们可以从报错信息中知道:
|
|
263
|
+
|
|
264
|
+
* 通过 `'bundle failed:'` 来判断报错的是 Bundle 构建还是 Bundleless 构建?
|
|
265
|
+
* 构建过程的 `format` 是什么?
|
|
266
|
+
* 构建过程的 `target` 是什么?
|
|
267
|
+
* 具体的报错信息。
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# 深入理解构建
|
|
2
|
+
|
|
3
|
+
在【基础使用】的部分,我们已经知道可以通过 `buildConfig` 配置对项目的输出产物进行修改。`buildConfig` 不仅描述了产物的一些特性,同时还为构建产物提供了一些功能。
|
|
4
|
+
|
|
5
|
+
:::tip{title=注意}
|
|
6
|
+
如果你还不清楚 `buildConfig` 是什么,建议花一些时间通过下面的链接了解一下:
|
|
7
|
+
|
|
8
|
+
* 【[修改输出产物](/zh/guide/modify-output-product)】
|
|
9
|
+
:::
|
|
10
|
+
|
|
11
|
+
而在本章里我们将要深入理解某些构建配置的使用以及了解执行 `modern build` 命令的时候发生了什么。
|
|
12
|
+
|
|
13
|
+
## 深入理解 `buildConfig`
|
|
14
|
+
|
|
15
|
+
### Bundle 和 Bundleless
|
|
16
|
+
|
|
17
|
+
那么首先我们来理解一下 Bundle 和 Bundleless。
|
|
18
|
+
|
|
19
|
+
所谓 Bundle 是指对构建产物进行打包,构建产物可能是一个文件,也有可能是基于一定的[代码拆分策略](https://esbuild.github.io/api/#splitting)得到的多个文件。
|
|
20
|
+
|
|
21
|
+
而 Bundleless 则是指对每个源文件进行编译构建,但是并不将它们打包在一起。每一个产物文件都可以找到与之相对应的源码文件。
|
|
22
|
+
|
|
23
|
+
### input 与 sourceDir 的关系
|
|
24
|
+
|
|
25
|
+
## 构建过程
|
|
26
|
+
|