@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,33 @@
|
|
|
1
|
+
# Dev
|
|
2
|
+
本章描述了调试相关的配置
|
|
3
|
+
## storybook
|
|
4
|
+
|
|
5
|
+
Storybook 配置请查看:[Storybook 配置](https://storybook.js.org/docs/react/configure/overview)
|
|
6
|
+
|
|
7
|
+
:::info
|
|
8
|
+
使用 Storybook 进行调试需要提前在项目下执行 new 命令启用「Visual Testing (Storybook)」模式功能。
|
|
9
|
+
:::
|
|
10
|
+
|
|
11
|
+
```ts modern.config.ts
|
|
12
|
+
import { defineConfig } from '@modern-js/module-tools';
|
|
13
|
+
|
|
14
|
+
export default defineConfig({
|
|
15
|
+
dev: {
|
|
16
|
+
storybook: {
|
|
17
|
+
addons: ['@storybook/addon-essentials'],
|
|
18
|
+
babel: async (options) => ({
|
|
19
|
+
// Update your babel configuration here
|
|
20
|
+
...options,
|
|
21
|
+
}),
|
|
22
|
+
framework: '@storybook/react',
|
|
23
|
+
stories: ['../src/**/*.stories.@(js|mdx)'],
|
|
24
|
+
webpackFinal: async (config, { configType }) => {
|
|
25
|
+
// Make whatever fine-grained changes you need
|
|
26
|
+
// Return the altered config
|
|
27
|
+
return config;
|
|
28
|
+
},
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
```
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# Plugins
|
|
2
|
+
本章介绍插件相关的 API,包括插件的基本用法,插件的钩子,插件的配置等。
|
|
3
|
+
|
|
4
|
+
Modern.js的插件系统借鉴了[follow-pipeline](https://github.com/farrow-js/farrow/tree/master/packages/farrow-pipeline),你可以通过hooks介入到各个流程中。
|
|
5
|
+
|
|
6
|
+
## Basic Usage
|
|
7
|
+
|
|
8
|
+
- type: `CliPlugin<ModuleToolsHooks>[]`
|
|
9
|
+
- default: `[]`
|
|
10
|
+
|
|
11
|
+
```ts modern.config.ts
|
|
12
|
+
import { defineConfig } from '@modern-js/module-tools';
|
|
13
|
+
import myPlugin from '.';
|
|
14
|
+
|
|
15
|
+
export default defineConfig({
|
|
16
|
+
plugins: [myPlugin()]
|
|
17
|
+
});
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
一个插件的基本结构如下:
|
|
21
|
+
```ts myPlugin.ts
|
|
22
|
+
export default (): CliPlugin<ModuleToolsHooks> => {
|
|
23
|
+
return {
|
|
24
|
+
name: 'dev-plugin-example',
|
|
25
|
+
setup: () => {
|
|
26
|
+
return {
|
|
27
|
+
registerDev() {
|
|
28
|
+
return {
|
|
29
|
+
name: 'plugin-example',
|
|
30
|
+
menuItem: {
|
|
31
|
+
name: 'dev-example',
|
|
32
|
+
value: 'dev-example',
|
|
33
|
+
},
|
|
34
|
+
action() {
|
|
35
|
+
console.info('running dev-example');
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
## Hooks
|
|
47
|
+
|
|
48
|
+
### Types
|
|
49
|
+
Module tools主要使用到了两种类型的钩子,分别是 `ParallelWorkflow` 和 `AsyncPipeline` 。
|
|
50
|
+
- `ParallelWorkflow` 是一个并行的钩子,可以同时执行多个钩子,但是不会等待钩子执行完毕,而是立即返回。
|
|
51
|
+
- `AsyncPipeline` 是一个串行的钩子,会等待上一个钩子执行完毕后再执行下一个钩子。
|
|
52
|
+
创建钩子时,需要指定钩子的输入和输出类型,例如 `createParallelWorkflow<void, void>` ,表明这个钩子没有输入,也没有输出。
|
|
53
|
+
|
|
54
|
+
### Dev Hooks
|
|
55
|
+
|
|
56
|
+
#### registerDev
|
|
57
|
+
- type: `ParallelWorkflow<void, DevToolData>`
|
|
58
|
+
- 注册dev任务,storybook 就是通过这个hooks注册的
|
|
59
|
+
|
|
60
|
+
#### beforeDev
|
|
61
|
+
- type: `ParallelWorkflow<DevToolData[], void>`
|
|
62
|
+
- 在dev任务执行之前执行
|
|
63
|
+
|
|
64
|
+
#### afterDev
|
|
65
|
+
- type: `ParallelWorkflow<void, void>`
|
|
66
|
+
- 在dev任务执行之后执行
|
|
67
|
+
|
|
68
|
+
#### beforeDevMenu
|
|
69
|
+
- type: `ParallelWorkflow<QuestionCollection, QuestionCollection | void>`
|
|
70
|
+
- 在选择dev任务菜单执行之前执行
|
|
71
|
+
|
|
72
|
+
#### afterDevMenu
|
|
73
|
+
- type: `ParallelWorkflow<{ result: PromptResult; devTools: DevToolData[] }, void>`
|
|
74
|
+
- 在选择dev任务菜单执行之后执行
|
|
75
|
+
|
|
76
|
+
#### beforeDevTask
|
|
77
|
+
- type: `ParallelWorkflow<DevToolData, void>`
|
|
78
|
+
- 在执行每一项dev任务前执行
|
|
79
|
+
|
|
80
|
+
### BuildHooks
|
|
81
|
+
|
|
82
|
+
#### beforeBuild
|
|
83
|
+
- type: `ParallelWorkflow<{ config: BuildConfig; options: BuildCommandOptions }, BuildConfig>`
|
|
84
|
+
- 在所有的构建任务执行之前执行
|
|
85
|
+
|
|
86
|
+
#### afterBuild
|
|
87
|
+
- type: `ParallelWorkflow<BuildResult, void>`
|
|
88
|
+
- 在所有的构建任务执行完后执行
|
|
89
|
+
|
|
90
|
+
#### beforeBuildTask
|
|
91
|
+
- type: `ParallelWorkflow<{ config: BaseBuildConfig; options: BuildCommandOptions }, BaseBuildConfig>`
|
|
92
|
+
- 在每一项构建任务执行之前执行,
|
|
93
|
+
|
|
94
|
+
#### afterBuildTask
|
|
95
|
+
- type: `ParallelWorkflow<BuildTaskResult, void>`
|
|
96
|
+
- 在每一项构建任务执行完后执行
|
|
97
|
+
|
|
98
|
+
#### registerBuildPlatform
|
|
99
|
+
- type: `ParallelWorkflow<void, RegisterBuildPlatformResult>`
|
|
100
|
+
- 注册构建平台, storybook 的构建就是通过这个hooks注册的
|
|
101
|
+
|
|
102
|
+
#### beforeBuildPlatform
|
|
103
|
+
- type: `ParallelWorkflow<RegisterBuildPlatformResult[], void>`
|
|
104
|
+
- 在构建平台之前执行
|
|
105
|
+
|
|
106
|
+
#### afterBuildPlatform
|
|
107
|
+
- type: `ParallelWorkflow<void, BuildPlatformResult>`
|
|
108
|
+
- 在构建平台完后执行
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Testing
|
|
2
|
+
本章描述了测试相关的配置
|
|
3
|
+
:::tips
|
|
4
|
+
需要先通过 `pnpm run new` 启用 单元测试 功能。
|
|
5
|
+
:::
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
## jest
|
|
9
|
+
* 类型: `Object | Function`
|
|
10
|
+
* 默认值:`{}`
|
|
11
|
+
|
|
12
|
+
对应 [Jest](https://jestjs.io/docs/configuration) 的配置,当为 `Object` 类型时,可以配置 Jest 所支持的所有底层配置 。
|
|
13
|
+
|
|
14
|
+
```js title=modern.config.ts
|
|
15
|
+
import { defineConfig } from '@modern-js/module-tools';
|
|
16
|
+
|
|
17
|
+
export default defineConfig({
|
|
18
|
+
testing: {
|
|
19
|
+
jest: {
|
|
20
|
+
testTimeout: 10000
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
值为 `Function` 类型时,默认配置作为第一个参数传入,需要返回新的 Jest 配置对象。
|
|
27
|
+
|
|
28
|
+
```js title=modern.config.ts
|
|
29
|
+
import { defineConfig } from '@modern-js/module-tools';
|
|
30
|
+
|
|
31
|
+
export default defineConfig({
|
|
32
|
+
testing: {
|
|
33
|
+
jest: options => {
|
|
34
|
+
return {
|
|
35
|
+
...options,
|
|
36
|
+
testTimeout: 10000
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## transformer
|
|
44
|
+
|
|
45
|
+
- 类型:`'babel-jest' | 'ts-jest'`
|
|
46
|
+
- 默认值:`babel-jest`
|
|
47
|
+
|
|
48
|
+
配置执行测试的时候对于源码的编译工具: [babel-jest](https://www.npmjs.com/package/babel-jest) 或 [ts-jest](https://github.com/kulshekhar/ts-jest)。默认使用 `babel-jest`。
|
|
49
|
+
|
|
50
|
+
:::info
|
|
51
|
+
`babel-jest` 也可以编译 TS 文件,但不会类型报错,如果你需要跑测试的时候对 TS 类型进行校验,那么请使用 `ts-jest`。
|
|
52
|
+
:::
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# 处理静态资源文件
|
|
2
|
+
|
|
3
|
+
模块工程会对代码中使用的静态资源进行处理。如果需要配置,则可以使用 [`buildConfig.asset`](/zh/api/build-config#asset) API。
|
|
4
|
+
|
|
5
|
+
## 默认行为
|
|
6
|
+
|
|
7
|
+
默认情况下,模块工程对于以下静态资源会进行处理:
|
|
8
|
+
|
|
9
|
+
* `'.svg'`、`'.png'`、`'.jpg'`、`'.jpeg'`、`'.gif'`、`'.webp'`
|
|
10
|
+
* `'.ttf'`、`'.otf'`、`'.woff'`、`'.woff2'`、`'.eot'`
|
|
11
|
+
* `'.mp3'`、`'.mp4'`、`'.webm'`、`'.ogg'`、`'.wav'`、`'.flac'`、`'.aac'`、`'.mov'`
|
|
12
|
+
|
|
13
|
+
对于静态文件的处理,模块工程目前支持的功能有:
|
|
14
|
+
|
|
15
|
+
* 设置静态资源路径为 `./assets`。
|
|
16
|
+
* 对于超过 **10kb** 的文件会内联到代码中。
|
|
17
|
+
* 对于 `.svg` 后缀的文件使用 [SVGR](https://react-svgr.com/)。
|
|
18
|
+
|
|
19
|
+
让我们看下面的例子:
|
|
20
|
+
|
|
21
|
+
<CH.Spotlight>
|
|
22
|
+
|
|
23
|
+
``` ts ./src/asset.ts
|
|
24
|
+
import img from './bg.png';
|
|
25
|
+
//...
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
项目源代码。
|
|
30
|
+
|
|
31
|
+
``` ts ./src/asset.ts
|
|
32
|
+
import img from './bg.png';
|
|
33
|
+
//...
|
|
34
|
+
```
|
|
35
|
+
---
|
|
36
|
+
如果 `bg.png` 的大小小于 10 kb,则此时产物目录结构和产物内容为。
|
|
37
|
+
|
|
38
|
+
<CH.Code>
|
|
39
|
+
|
|
40
|
+
``` bash
|
|
41
|
+
./dist
|
|
42
|
+
└── asset.js
|
|
43
|
+
```
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
``` js ./dist/asset.js
|
|
47
|
+
var bg_default = "data:image/png;base64,";
|
|
48
|
+
console.info(bg_default);
|
|
49
|
+
```
|
|
50
|
+
</CH.Code>
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
如果 `bg.png` 的大小大于 10 kb,则此时产物目录结构和产物内容为。
|
|
54
|
+
|
|
55
|
+
<CH.Code>
|
|
56
|
+
|
|
57
|
+
``` bash
|
|
58
|
+
./dist
|
|
59
|
+
├── asset.js
|
|
60
|
+
└── assets
|
|
61
|
+
└── bg.13e2aba2.png
|
|
62
|
+
```
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
``` js ./dist/asset.js
|
|
66
|
+
var bg_default = "assets/bg.13e2aba2.png";
|
|
67
|
+
console.info(bg_default);
|
|
68
|
+
```
|
|
69
|
+
</CH.Code>
|
|
70
|
+
|
|
71
|
+
</CH.Spotlight>
|
|
72
|
+
|
|
73
|
+
当想要修改默认行为的时候,可以使用以下 API:
|
|
74
|
+
|
|
75
|
+
* `asset.path`:修改静态资源文件输出路径。
|
|
76
|
+
* `asset.limit`:修改内联静态资源文件的阈值。
|
|
77
|
+
|
|
78
|
+
## 设置 CDN 前缀
|
|
79
|
+
|
|
80
|
+
如果项目运行的环境是在浏览器下,我们有可能需要静态资源托管至 CDN,然后在生产环境使用。
|
|
81
|
+
|
|
82
|
+
那么此时默认生成的构建产物中,我们需要在静态资源文件的路径前面增加 CDN 的基础路径。还是看一个例子:
|
|
83
|
+
|
|
84
|
+
<CH.Spotlight>
|
|
85
|
+
|
|
86
|
+
``` ts ./src/asset.ts
|
|
87
|
+
import img from './bg.png';
|
|
88
|
+
//...
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
项目源代码。
|
|
93
|
+
|
|
94
|
+
``` ts ./src/asset.ts
|
|
95
|
+
```
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
`modern.config` 配置为。
|
|
99
|
+
|
|
100
|
+
``` ts ./modern.config.ts
|
|
101
|
+
export default defineConfig({
|
|
102
|
+
buildConfig: {
|
|
103
|
+
format: 'umd',
|
|
104
|
+
asset: {
|
|
105
|
+
publicPath: 'https://cdn/',
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
如果 `bg.png` 的大小大于 10 kb,则此时产物内容为。
|
|
114
|
+
|
|
115
|
+
``` js ./dist/asset.js focus=7:7
|
|
116
|
+
(function(global, factory) {
|
|
117
|
+
if (typeof module === "object" && typeof module.exports === "object") factory();
|
|
118
|
+
else if (typeof define === "function" && define.amd) define([], factory);
|
|
119
|
+
else if (global = typeof globalThis !== "undefined" ? globalThis : global || self) factory();
|
|
120
|
+
})(this, function() {
|
|
121
|
+
"use strict";
|
|
122
|
+
var bg_default = "http://cdn/assets/bg.13e2aba2.png";
|
|
123
|
+
// src/asset.tsx
|
|
124
|
+
console.info(bg_default);
|
|
125
|
+
});
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
</CH.Spotlight>
|
|
129
|
+
|
|
130
|
+
## SVGR
|
|
131
|
+
|
|
132
|
+
WIP
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
# 构建 umd 产物
|
|
2
|
+
|
|
3
|
+
umd 全称为 **Universal Module Definition**,这种格式的 JS 文件可以运行在多个运行环境:
|
|
4
|
+
|
|
5
|
+
* 浏览器环境:基于 AMD 规范进行模块加载
|
|
6
|
+
* Node.js 环境:基于 CommonJS 进行模块加载
|
|
7
|
+
* 其他情况:将模块挂载在全局对象上。
|
|
8
|
+
|
|
9
|
+
因此我们可以通过下面的方式,将项目的构建产物指定为 umd 产物:
|
|
10
|
+
|
|
11
|
+
``` ts
|
|
12
|
+
export default defineConfig({
|
|
13
|
+
buildConfig: {
|
|
14
|
+
format: 'umd',
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## umd 产物的第三方依赖处理
|
|
20
|
+
|
|
21
|
+
在 [【如何处理第三方依赖】](/zh/guide/advance/external-dependency) 章节中,我们知道可以通过 [`autoExternals`](/zh/api/build-config#autoexternal) 和 [`externals`](/zh/api/build-config#externals) API 来控制项目是否对第三方依赖打包。
|
|
22
|
+
因此在构建 umd 产物的过程中,我们也可以这样使用:
|
|
23
|
+
|
|
24
|
+
<CH.Spotlight>
|
|
25
|
+
|
|
26
|
+
```json package.json
|
|
27
|
+
{
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"react": "^17"
|
|
30
|
+
//...other dependencies
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
如果项目依赖了 `react`。
|
|
38
|
+
|
|
39
|
+
```json package.json
|
|
40
|
+
{
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"react": "^17"
|
|
43
|
+
//...other dependencies
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
`modern.config.ts` 配置。
|
|
51
|
+
|
|
52
|
+
``` ts
|
|
53
|
+
export default defineConfig({
|
|
54
|
+
buildConfig: {
|
|
55
|
+
format: 'umd',
|
|
56
|
+
autoExternal: false,
|
|
57
|
+
externals: ['react'],
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
当源码中使用了 `react` 依赖。
|
|
65
|
+
|
|
66
|
+
``` tsx src/index.ts
|
|
67
|
+
import React from "react";
|
|
68
|
+
console.info(React);
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
此时产物中不会将 `react` 代码打包到产物中。
|
|
74
|
+
|
|
75
|
+
``` js dist/index.js focus=1:7
|
|
76
|
+
(function(global, factory) {
|
|
77
|
+
if (typeof module === "object" && typeof module.exports === "object") factory(exports, require("react"));
|
|
78
|
+
else if (typeof define === "function" && define.amd) define([
|
|
79
|
+
"exports",
|
|
80
|
+
"react"
|
|
81
|
+
], factory);
|
|
82
|
+
else if (global = typeof globalThis !== "undefined" ? globalThis : global || self) factory(global.index = {}, global.react);
|
|
83
|
+
})(this, function(exports, _react) {
|
|
84
|
+
"use strict";
|
|
85
|
+
Object.defineProperty(exports, "__esModule", {
|
|
86
|
+
value: true
|
|
87
|
+
});
|
|
88
|
+
_react = /*#__PURE__*/ _interopRequireDefault(_react);
|
|
89
|
+
function _interopRequireDefault(obj) {
|
|
90
|
+
return obj && obj.__esModule ? obj : {
|
|
91
|
+
default: obj
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
console.info(_react.default);
|
|
95
|
+
});
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
</CH.Spotlight>
|
|
99
|
+
|
|
100
|
+
通过上面的例子我们知道,当使用 `autoExternal` 和 `externals` API 后:
|
|
101
|
+
|
|
102
|
+
* 在 Node.js 环境下,可以通过 `require('react')` 获取 react 依赖。
|
|
103
|
+
* 在 浏览器环境下,可以通过 `global.react` 获取 react 依赖。
|
|
104
|
+
|
|
105
|
+
然而在浏览器环境下,获取第三方依赖的时候,**全局变量名称不一定与依赖名称完全相同**,此时就要使用 [`buildConfig.umdGlobals`](/zh/api/build-config#umdglobals) API。
|
|
106
|
+
|
|
107
|
+
还是使用之前的例子,当 `react` 依赖以 `windows.React` 或者 `global.React` 全局变量的形式存在于浏览器环境下,那么此时:
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
<CH.Spotlight>
|
|
111
|
+
|
|
112
|
+
```json package.json
|
|
113
|
+
{
|
|
114
|
+
"devDependencies": {
|
|
115
|
+
"react": "^17"
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
如果项目依赖了 `react`。
|
|
123
|
+
|
|
124
|
+
```json package.json
|
|
125
|
+
{
|
|
126
|
+
"devDependencies": {
|
|
127
|
+
"react": "^17"
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
`modern.config.ts` 配置。
|
|
135
|
+
|
|
136
|
+
``` ts
|
|
137
|
+
export default defineConfig({
|
|
138
|
+
buildConfig: {
|
|
139
|
+
format: 'umd',
|
|
140
|
+
umdGlobals: {
|
|
141
|
+
react: 'React',
|
|
142
|
+
},
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
当源码中使用了 `react` 依赖。
|
|
150
|
+
|
|
151
|
+
``` tsx src/index.ts
|
|
152
|
+
import React from "react";
|
|
153
|
+
console.info(React);
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
此时我们会看到这样的产物代码。
|
|
159
|
+
|
|
160
|
+
``` js dist/index.js focus=7:12
|
|
161
|
+
(function(global, factory) {
|
|
162
|
+
if (typeof module === "object" && typeof module.exports === "object") factory();
|
|
163
|
+
else if (typeof define === "function" && define.amd) define([], factory);
|
|
164
|
+
else if (global = typeof globalThis !== "undefined" ? globalThis : global || self) factory();
|
|
165
|
+
})(this, function() {
|
|
166
|
+
// ...
|
|
167
|
+
// libuild:globals:react
|
|
168
|
+
var require_react = __commonJS({
|
|
169
|
+
"libuild:globals:react" (exports, module1) {
|
|
170
|
+
module1.exports = Function("return this")()["React"];
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
// src/index.ts
|
|
174
|
+
var import_react = __toESM(require_react());
|
|
175
|
+
console.info(import_react.default);
|
|
176
|
+
});
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
</CH.Spotlight>
|
|
180
|
+
|
|
181
|
+
此时项目就可以运行在浏览器中,并使用存在于全局对象上的 `React` 变量了。
|
|
182
|
+
|
|
183
|
+
## 更改项目的全局变量名称
|
|
184
|
+
|
|
185
|
+
当我们将下面的代码打包成 umd 产物并运行在浏览器的时候,我们可以通过 `window.index` 来使用该模块。
|
|
186
|
+
|
|
187
|
+
``` ts ./src/index.ts
|
|
188
|
+
export default () => {
|
|
189
|
+
console.info('hello world');
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
**默认情况下,以源码文件名称作为该模块在浏览器里全局变量的名称**。对于上面的例子,其产物内容如下:
|
|
194
|
+
|
|
195
|
+
``` js ./dist/index.js focus=6:6
|
|
196
|
+
(function(global, factory) {
|
|
197
|
+
if (typeof module === "object" && typeof module.exports === "object") factory(exports);
|
|
198
|
+
else if (typeof define === "function" && define.amd) define([
|
|
199
|
+
"exports"
|
|
200
|
+
], factory);
|
|
201
|
+
else if (global = typeof globalThis !== "undefined" ? globalThis : global || self) factory(global.index = {});
|
|
202
|
+
})(this, function(exports) {
|
|
203
|
+
//...
|
|
204
|
+
});
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
如果需要修改它,则需要使用 [`buildConfig.umdModuleName`](/zh/api/build-config#umdmodulename) API。
|
|
208
|
+
|
|
209
|
+
当使用该 API 后:
|
|
210
|
+
|
|
211
|
+
``` ts
|
|
212
|
+
export default defineConfig({
|
|
213
|
+
buildConfig: {
|
|
214
|
+
format: 'umd',
|
|
215
|
+
umdModuleName: 'myLib',
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
此时构建产物的内容为:
|
|
221
|
+
|
|
222
|
+
``` js ./dist/index.js focus=6:6
|
|
223
|
+
(function(global, factory) {
|
|
224
|
+
if (typeof module === "object" && typeof module.exports === "object") factory(exports);
|
|
225
|
+
else if (typeof define === "function" && define.amd) define([
|
|
226
|
+
"exports"
|
|
227
|
+
], factory);
|
|
228
|
+
else if (global = typeof globalThis !== "undefined" ? globalThis : global || self) factory(global.myLib = {});
|
|
229
|
+
})(this, function(exports) {
|
|
230
|
+
//...
|
|
231
|
+
});
|
|
232
|
+
```
|