@modern-js/main-doc 2.11.0 → 2.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/docs/en/apis/app/commands.mdx +1 -1
  3. package/docs/en/apis/app/hooks/api/framework/lambda.mdx +2 -2
  4. package/docs/en/apis/app/hooks/api/functions/api.mdx +3 -3
  5. package/docs/en/apis/app/hooks/api/functions/app.mdx +1 -1
  6. package/docs/en/apis/app/hooks/api/test.mdx +2 -1
  7. package/docs/en/apis/app/hooks/config/icon.mdx +46 -6
  8. package/docs/en/apis/app/hooks/config/mock.mdx +1 -1
  9. package/docs/en/apis/app/hooks/config/upload.mdx +1 -1
  10. package/docs/en/apis/app/hooks/server/test.mdx +1 -1
  11. package/docs/en/apis/app/hooks/src/app.mdx +1 -1
  12. package/docs/en/apis/app/hooks/src/pages.mdx +1 -1
  13. package/docs/en/apis/app/runtime/app/define-config.mdx +1 -1
  14. package/docs/en/apis/app/runtime/core/bootstrap.mdx +2 -2
  15. package/docs/en/apis/app/runtime/core/use-loader.mdx +6 -2
  16. package/docs/en/apis/app/runtime/model/auto-actions.mdx +6 -6
  17. package/docs/en/apis/app/runtime/model/connect.mdx +2 -1
  18. package/docs/en/apis/app/runtime/model/create-app.mdx +1 -1
  19. package/docs/en/apis/app/runtime/model/handle-effect.mdx +3 -3
  20. package/docs/en/apis/app/runtime/model/model_.mdx +2 -2
  21. package/docs/en/apis/app/runtime/model/use-model.mdx +2 -2
  22. package/docs/en/apis/app/runtime/model/use-static-model.mdx +2 -2
  23. package/docs/en/apis/app/runtime/model/use-store.mdx +1 -1
  24. package/docs/en/apis/app/runtime/router/router.mdx +1 -0
  25. package/docs/en/apis/app/runtime/ssr/pre-render.mdx +2 -2
  26. package/docs/en/apis/app/runtime/testing/render.mdx +1 -1
  27. package/docs/en/components/enable-bff.mdx +2 -2
  28. package/docs/en/configure/app/html/script-loading.mdx +13 -0
  29. package/docs/en/configure/app/output/ssg.mdx +1 -1
  30. package/docs/en/configure/app/plugins.mdx +3 -3
  31. package/docs/en/configure/app/source/disable-entry-dirs.mdx +1 -1
  32. package/docs/en/configure/app/tools/bundler-chain.mdx +13 -0
  33. package/docs/en/configure/app/tools/swc.mdx +4 -3
  34. package/docs/en/configure/app/usage.mdx +65 -23
  35. package/docs/en/guides/advanced-features/bff/function.mdx +3 -3
  36. package/docs/en/guides/advanced-features/code-split.mdx +2 -2
  37. package/docs/en/guides/advanced-features/eslint.mdx +1 -1
  38. package/docs/en/guides/advanced-features/ssg.mdx +2 -2
  39. package/docs/en/guides/advanced-features/ssr.mdx +45 -8
  40. package/docs/en/guides/basic-features/alias.mdx +1 -1
  41. package/docs/en/guides/basic-features/data-fetch.mdx +1 -1
  42. package/docs/en/guides/basic-features/env-vars.mdx +5 -5
  43. package/docs/en/guides/basic-features/html.mdx +0 -4
  44. package/docs/en/guides/basic-features/routes.mdx +48 -28
  45. package/docs/en/guides/concept/entries.mdx +3 -3
  46. package/docs/en/guides/get-started/introduction.mdx +21 -1
  47. package/docs/en/guides/get-started/quick-start.mdx +6 -23
  48. package/docs/en/guides/get-started/upgrade.mdx +7 -7
  49. package/docs/en/guides/topic-detail/framework-plugin/hook.mdx +1 -1
  50. package/docs/en/guides/topic-detail/generator/codesmith/api/json.mdx +3 -3
  51. package/docs/en/guides/topic-detail/generator/config/app.mdx +1 -1
  52. package/docs/en/guides/topic-detail/generator/config/monorepo.mdx +1 -1
  53. package/docs/en/guides/topic-detail/generator/plugin/api/file/addHelper.mdx +1 -1
  54. package/docs/en/guides/topic-detail/model/manage-effects.mdx +2 -1
  55. package/docs/en/guides/topic-detail/model/model-communicate.mdx +1 -1
  56. package/docs/en/guides/topic-detail/model/use-model.mdx +2 -1
  57. package/docs/en/guides/troubleshooting/builder.mdx +31 -0
  58. package/docs/en/tutorials/foundations/introduction.mdx +0 -2
  59. package/docs/zh/apis/app/hooks/config/icon.mdx +44 -6
  60. package/docs/zh/apis/app/hooks/src/pages.mdx +1 -1
  61. package/docs/zh/apis/app/runtime/core/use-loader.mdx +4 -0
  62. package/docs/zh/apis/app/runtime/model/handle-effect.mdx +2 -1
  63. package/docs/zh/apis/app/runtime/model/model_.mdx +4 -2
  64. package/docs/zh/blog/updates/2022-0708-updates.md +1 -2
  65. package/docs/zh/components/enable-bff.mdx +2 -2
  66. package/docs/zh/configure/app/html/script-loading.mdx +13 -0
  67. package/docs/zh/configure/app/runtime/router.mdx +1 -1
  68. package/docs/zh/configure/app/source/disable-entry-dirs.mdx +2 -2
  69. package/docs/zh/configure/app/tools/bundler-chain.mdx +13 -0
  70. package/docs/zh/configure/app/tools/swc.mdx +4 -3
  71. package/docs/zh/configure/app/usage.mdx +66 -24
  72. package/docs/zh/guides/advanced-features/ssr.mdx +74 -36
  73. package/docs/zh/guides/basic-features/data-fetch.mdx +1 -1
  74. package/docs/zh/guides/basic-features/html.mdx +0 -4
  75. package/docs/zh/guides/basic-features/routes.mdx +64 -24
  76. package/docs/zh/guides/concept/entries.mdx +4 -4
  77. package/docs/zh/guides/get-started/introduction.mdx +21 -1
  78. package/docs/zh/guides/get-started/upgrade.mdx +3 -3
  79. package/docs/zh/guides/topic-detail/changesets/release.mdx +2 -2
  80. package/docs/zh/guides/topic-detail/model/use-model.mdx +2 -1
  81. package/docs/zh/guides/troubleshooting/builder.mdx +31 -0
  82. package/modern.config.ts +3 -2
  83. package/package.json +5 -5
  84. package/src/components/SolutionCards/index.module.scss +62 -0
  85. package/src/components/SolutionCards/index.tsx +26 -0
  86. package/docs/en/configure/app/source/plugin-import.mdx +0 -13
  87. package/docs/zh/configure/app/source/plugin-import.mdx +0 -13
@@ -25,24 +25,24 @@ You can see that the dependency in the project `package.json` has been changed t
25
25
 
26
26
  ## Specify version upgrade
27
27
 
28
- Modern.js all packages are published using the **unified version number**.
28
+ All packages of Modern.js are published using the **unified version number**.
29
29
 
30
- According to the website Release Note, developers can also manually upgrade the project to the desired version.
30
+ According to the website release note, developers can also manually upgrade the project to the desired version.
31
31
 
32
32
  :::tip
33
33
  When upgrading, you need to upgrade to all packages provided by the Modern.js, rather than upgrading a single dependency.
34
34
 
35
35
  :::
36
36
 
37
- ## lock child dependency
37
+ ## Lock nested dependency
38
38
 
39
- When there is a problem with one of the child dependencies of the project, and the Modern.js cannot be updated immediately, you can use the package manager to lock the child dependency version.
39
+ When there is a problem with one of the nested dependencies of the project, and the Modern.js cannot be updated immediately, you can use the package manager to lock the child dependency version.
40
40
 
41
41
  ### pnpm
42
42
 
43
43
  For projects using pnpm, add the following configuration to the `package.json` in the **project root directory** and re-execute `pnpm install`:
44
44
 
45
- ```json
45
+ ```json title="package.json"
46
46
  {
47
47
  "pnpm": {
48
48
  "overrides": {
@@ -56,7 +56,7 @@ For projects using pnpm, add the following configuration to the `package.json` i
56
56
 
57
57
  For projects using Yarn, add the following configuration to the `package.json` in the **project root directory** and re-execute `yarn install`:
58
58
 
59
- ```json
59
+ ```json title="package.json"
60
60
  {
61
61
  "resolutions": {
62
62
  "package-name": "^1.0.0"
@@ -68,7 +68,7 @@ For projects using Yarn, add the following configuration to the `package.json` i
68
68
 
69
69
  For projects using Npm, add the following configuration to the `package.json` in the **project root directory** and re-execute `npm install`:
70
70
 
71
- ```json
71
+ ```json title="package.json"
72
72
  {
73
73
  "overrides": {
74
74
  "package-name": "^1.0.0"
@@ -32,7 +32,7 @@ pipeline.run(1); // 4
32
32
  pipeline.run(5); // 12
33
33
  ```
34
34
 
35
- In this example, a `Pipeline<number, number>` is created on line 3. This means that when you run it, you need to pass in a `number`, and you will get a `number` as a resultthe type is:
35
+ In this example, a `Pipeline<number, number>` is created on line 3. This means that when you run it, you need to pass in a `number`, and you will get a `number` as a result, the type is:
36
36
 
37
37
  ```ts
38
38
  (count: number, next: (nextCount: number) => number) => number;
@@ -35,7 +35,7 @@ Get the JSON file content.
35
35
 
36
36
  Parameter:
37
37
 
38
- - resource: `FsResource`. A file resourceget by `context.materials.default.get(<filename>)`.
38
+ - resource: `FsResource`. A file resource, get by `context.materials.default.get(<filename>)`.
39
39
 
40
40
  ### extend
41
41
 
@@ -43,7 +43,7 @@ Merge objects into a JSON file.
43
43
 
44
44
  Parameter:
45
45
 
46
- - resource: `FsResource`. A file resourceget by `context.materials.default.get(<filename>)`.
46
+ - resource: `FsResource`. A file resource, get by `context.materials.default.get(<filename>)`.
47
47
  - obj: `Record<string, any>`. Object to be merged.
48
48
 
49
49
  ### update
@@ -52,5 +52,5 @@ pdate object fields to JSON file.
52
52
 
53
53
  Parameter:
54
54
 
55
- - resource: `FsResource`. A file resourceget by `context.materials.default.get(<filename>)`.
55
+ - resource: `FsResource`. A file resource, get by `context.materials.default.get(<filename>)`.
56
56
  - operation: `{ query: Record<string, any>; update: Record<string, any> }`. Update operation, use gesture to view [declaration-update](https://www.npmjs.com/package/declaration-update) in detail.
@@ -75,7 +75,7 @@ BFF type (bffType), supports two options:
75
75
 
76
76
  ##### framework
77
77
 
78
- BFF runtime framework (framework)supports two options:
78
+ BFF runtime framework (framework), supports two options:
79
79
 
80
80
  - Express(express)
81
81
 
@@ -12,7 +12,7 @@ The Monorepo project supports the creation of sub-projects by using the new comm
12
12
 
13
13
  ### solution
14
14
 
15
- Subproject type(solution)the different subproject type fields are:
15
+ Subproject type(solution), the different subproject type fields are:
16
16
 
17
17
  - Application (mwa)
18
18
  - Application (Test) (mwa_test)
@@ -4,7 +4,7 @@ sidebar_position: 2
4
4
 
5
5
  # addHelper
6
6
 
7
- For text files, add a customized Help function of Handlebarsthe specific viewable document[Custom Helpers](https://handlebarsjs.com/guide/#custom-helpers).
7
+ For text files, add a customized Help function of Handlebars, the specific viewable document[Custom Helpers](https://handlebarsjs.com/guide/#custom-helpers).
8
8
 
9
9
  This method is available on the `onForged` time to live API parameter.
10
10
 
@@ -2,6 +2,7 @@
2
2
  sidebar_position: 5
3
3
  title: Management Effect
4
4
  ---
5
+
5
6
  # Management Effect
6
7
 
7
8
  The actions in the model must be pure functions and cannot have any side effects during execution. However, in real-world scenarios, we often encounter many side effects, such as: requesting data from an HTTP API to obtain state data, or modifying `localStorage` or sending events while updating the state. In Reduck, side effects are managed through the model's `effects` function.
@@ -88,7 +89,7 @@ For this type of side effect scenario, `handleEffect` stipulates that the state
88
89
  {
89
90
  result: null,
90
91
  error: null,
91
- pending: false
92
+ pending: false,
92
93
  }
93
94
  ```
94
95
 
@@ -188,7 +188,7 @@ const fooModel = model('foo').define((context, { use, onMount }) => {
188
188
  let actions;
189
189
 
190
190
  onMount(() => {
191
- // after fooModel mountedget actions
191
+ // after fooModel mounted, get actions
192
192
  [, actions] = use(fooModel);
193
193
  });
194
194
 
@@ -2,6 +2,7 @@
2
2
  sidebar_position: 3
3
3
  title: Use Models
4
4
  ---
5
+
5
6
  # Use Models
6
7
 
7
8
  ## Using Models in Components
@@ -146,7 +147,7 @@ will always get the initial value of Input.
146
147
 
147
148
  :::
148
149
 
149
- `useStaticModel` is also suitable for use with animation libraries such as [react-three-fiber](https://github.com/pmndrs/react-three-fiber), because binding fast-changing states in animation component UI can easily cause [performance issues](https:/docs.pmnd.rs/react-three-fiber/advanced/pitfalls#never-bind-fast-state-reactive). In this case, you can choose to use `useStaticModel`, which only subscribes to the State but does not cause the view component to re-render. Here is a simplified example:
150
+ `useStaticModel` is also suitable for use with animation libraries such as [react-three-fiber](https://github.com/pmndrs/react-three-fiber), because binding fast-changing states in animation component UI can easily cause [performance issues](https://docs.pmnd.rs/react-three-fiber/advanced/pitfalls#never-bind-fast-state-reactive). In this case, you can choose to use `useStaticModel`, which only subscribes to the State but does not cause the view component to re-render. Here is a simplified example:
150
151
 
151
152
  ```ts
152
153
  function ThreeComponent() {
@@ -0,0 +1,31 @@
1
+ ---
2
+ sidebar_position: 3
3
+ ---
4
+
5
+ # Build FAQ
6
+
7
+ If you encounter build-related problems, you can refer to the following documents:
8
+
9
+ ## General FAQ
10
+
11
+ Please refer to [Modern.js Builder - General FAQ](https://modernjs.dev/builder/en/guide/faq/general.html), which contains some general questions about concepts, such as:
12
+
13
+ - The relationship between Modern.js Builder and Modern.js?
14
+ - Can Builder be used to build libraries or UI components?
15
+ - Will Builder support Vite?
16
+
17
+ ## Features FAQ
18
+
19
+ Please refer to [Modern.js Builder - Features FAQ](https://modernjs.dev/builder/en/guide/faq/features.html), which contains an introduction to some common building features, such as:
20
+
21
+ - How to import UI Component library on demand?
22
+ - How to run ESLint during compilation?
23
+ - How to configure CDN path for static assets?
24
+
25
+ ## Exceptions FAQ
26
+
27
+ Please refer to [Modern.js Builder - Exceptions FAQ](https://modernjs.dev/builder/en/guide/faq/exceptions.html), which contains some common construction problems, such as:
28
+
29
+ - 'compilation' argument error when webpack compiling?
30
+ - Compile error `You may need additional loader`?
31
+ - Find `exports is not defined` runtime error?
@@ -26,5 +26,3 @@ We have prepared a tutorial on creating a "contact list app" that you can follow
26
26
  - Container components
27
27
  - New portal
28
28
  - ...
29
-
30
- Translated with www.DeepL.com/Translator (free version)
@@ -1,18 +1,56 @@
1
1
  ---
2
- title: icon.png
2
+ title: icon
3
3
  sidebar_position: 2
4
4
  ---
5
- # icon.png
6
5
 
7
- 应用工程方案 App Icon 文件。
6
+ # Icon
8
7
 
9
- 项目根目录下 `config/icon.png` 时,可以在构建时向 html 页面注入 app icon 信息:
8
+ ## 设置 favicon
9
+
10
+ 当项目根目录的 `config` 目录下存在 `favicon.*` 文件时,Modern.js 会自动将该文件设置到 [html.favicon](/configure/app/html/favicon) 配置项中,用于生成页面的 favicon 图标:
11
+
12
+ ```
13
+ ./config
14
+ └── favicon.ico
15
+ ```
16
+
17
+ 构建完成后,可以看到 HTML 中自动生成了以下标签:
18
+
19
+ ```html
20
+ <link rel="icon" href="/favicon.ico" />
21
+ ```
22
+
23
+ ### 查找顺序
24
+
25
+ 在设置 app icon 时,Modern.js 会按以下顺序寻找文件:
26
+
27
+ - favicon.png
28
+ - favicon.jpg
29
+ - favicon.jpeg
30
+ - favicon.svg
31
+ - favicon.ico
32
+
33
+ ## 设置 app icon
34
+
35
+ 当项目根目录的 `config` 目录下存在 `icon.*` 文件时,Modern.js 会自动将该文件设置到 [html.appIcon](/configure/app/html/app-icon) 配置项中,用于生成 iOS 系统下的 apple-touch-icon 图标。
10
36
 
11
37
  ```
12
38
  ./config
13
39
  └── icon.png
14
40
  ```
15
41
 
16
- 最终 html 中会注入 app icon `link` 标签, 如下:
42
+ 构建完成后,可以看到 HTML 中自动生成了以下标签:
43
+
44
+ ```html
45
+ <link rel="apple-touch-icon" sizes="180*180" href="/static/image/icon.png" />
46
+ ```
47
+
48
+ ### 查找顺序
49
+
50
+ 在设置 app icon 时,Modern.js 会按以下顺序寻找文件:
17
51
 
18
- ![app-icon](https://lf3-static.bytednsdoc.com/obj/eden-cn/aphqeh7uhohpquloj/modern-js/api/app-icon.png)
52
+ - icon.png
53
+ - icon.jpg
54
+ - icon.jpeg
55
+ - icon.svg
56
+ - icon.ico
@@ -85,7 +85,7 @@ pages 目录下的文件满足以下条件的不会被当做路由文件
85
85
  import React from 'react';
86
86
  import UserLayout from 'xxxx';
87
87
 
88
- export default const App = ({Component, ...pageProps}:{ Component: React.ComponentType}) => {
88
+ export const App = ({Component, ...pageProps}:{ Component: React.ComponentType}) => {
89
89
  return (
90
90
  <UserLayout>
91
91
  <Component {...pageProps} />
@@ -5,6 +5,10 @@ title: useLoader
5
5
 
6
6
  一个同构的 API,通常会用来做异步请求。当 SSR 的时候,服务端使用 `useLoader` 预加载数据,同时浏览器端也会复用这部分数据。
7
7
 
8
+ :::tip
9
+ 在使用 Rspack 作为打包工具时,暂不支持使用 useLoader API。
10
+ :::
11
+
8
12
  ## 使用姿势
9
13
 
10
14
  ```ts
@@ -2,9 +2,10 @@
2
2
  sidebar_position: 7
3
3
  title: handleEffect
4
4
  ---
5
+
5
6
  # handleEffect
6
7
 
7
- import ReduckTip from "@site-docs/components/reduck-tip"
8
+ import ReduckTip from '@site-docs/components/reduck-tip';
8
9
 
9
10
  <ReduckTip />
10
11
 
@@ -2,9 +2,10 @@
2
2
  sidebar_position: 1
3
3
  title: model
4
4
  ---
5
+
5
6
  # model
6
7
 
7
- import ReduckTip from "@site-docs/components/reduck-tip"
8
+ import ReduckTip from '@site-docs/components/reduck-tip';
8
9
 
9
10
  <ReduckTip />
10
11
 
@@ -61,7 +62,8 @@ const fooModel = model('foo').define({
61
62
  - context: Context,Reduck 上下文对象,可以获取底层的 `store` 对象。`store` 除支持 Redux Store 的所有 [API](https://redux.js.org/api/store) 以外,还挂载了用于消费 Model 的 `use` 的方法,和用于卸载 Model 的 `unmount` 方法。
62
63
  - utils: Utils,定义 Model 时,常用的工具函数:`use`、`onMount`。`use` 作用同 `store` 对象上的 `use`,`onMount` 是 Model 挂载后的钩子函数。
63
64
 
64
- {/* TODO: @anchao 调整类型 */}
65
+ {/* TODO: @anchao 调整类型 */}
66
+
65
67
  ```ts
66
68
  interface Utils {
67
69
  use: UseModel;
@@ -39,8 +39,7 @@ npx @modern-js/upgrade
39
39
 
40
40
  新的模块工程项目,不仅支持对产物做 bundless 构建,也支持 bundle 构建。通过配置 `buildConfig` 下的 [`buildType`](https://modernjs.dev/v1/docs/apis/module/config/output/build-config/build-type) ,即可进行 bundle 构建:
41
41
 
42
- ```ts
43
- // modern.config.ts
42
+ ```ts title="modern.config.ts"
44
43
  import { defineConfig } from '@modern-js/module-tools';
45
44
 
46
45
  export default defineConfig({
@@ -6,7 +6,7 @@ import { Tabs, Tab as TabItem } from "@theme";
6
6
  <Tabs>
7
7
  <TabItem value="express" label="Express.js" default>
8
8
 
9
- ```ts title="edenx.config.ts"
9
+ ```ts title="modern.config.ts"
10
10
  import expressPlugin from '@modern-js/plugin-express';
11
11
  import bffPlugin from '@modern-js/plugin-bff';
12
12
 
@@ -18,7 +18,7 @@ export default defineConfig({
18
18
  </TabItem>
19
19
  <TabItem value="koa" label="Koa.js">
20
20
 
21
- ```ts title="edenx.config.ts"
21
+ ```ts title="modern.config.ts"
22
22
  import koaPlugin from '@modern-js/plugin-koa';
23
23
  import bffPlugin from '@modern-js/plugin-bff';
24
24
 
@@ -0,0 +1,13 @@
1
+ ---
2
+ sidebar_label: scriptLoading
3
+ ---
4
+
5
+ # html.scriptLoading
6
+
7
+ :::tip
8
+ 该配置由 Modern.js Builder 提供,更多信息可参考 [html.scriptLoading](https://modernjs.dev/builder/api/config-html.html#htmlscriptloading)。
9
+ :::
10
+
11
+ import Main from '@modern-js/builder-doc/docs/zh/config/html/scriptLoading.md';
12
+
13
+ <Main />
@@ -18,7 +18,7 @@ import RouterLegacyTip from "@site-docs/components/router-legacy-tip"
18
18
  ## basename
19
19
 
20
20
  - **类型:** `string`
21
- - **默认值:** ``
21
+ - **默认值:** `/`
22
22
 
23
23
  设置客户端路由的 `basename`,通常用于应用需要部署在域名非根路径下的场景。
24
24
 
@@ -7,14 +7,14 @@ sidebar_label: disableEntryDirs
7
7
  - **类型:** `string[]`
8
8
  - **默认值:** `[]`
9
9
 
10
- 默认会根据 `src` 目录识别应用入口,可通过该选项禁止某些目录被识别为应用入口。
10
+ Modern.js 默认会根据 `src` 目录识别应用入口,你可以通过该选项禁止某些目录被识别为应用入口。
11
11
 
12
12
  例如,当配置与目录结构如下时:
13
13
 
14
14
  ```ts title="modern.config.ts"
15
15
  export default defineConfig({
16
16
  source: {
17
- disableEntryDirs: './src/one',
17
+ disableEntryDirs: ['./src/one'],
18
18
  },
19
19
  });
20
20
  ```
@@ -0,0 +1,13 @@
1
+ ---
2
+ sidebar_label: bundlerChain
3
+ ---
4
+
5
+ # tools.bundlerChain
6
+
7
+ :::tip
8
+ 该配置由 Modern.js Builder 提供,更多信息可参考 [tools.bundlerChain](https://modernjs.dev/builder/api/config-tools.html#toolsbundlerchain)。
9
+ :::
10
+
11
+ import Main from '@modern-js/builder-doc/docs/zh/config/tools/bundlerChain.mdx';
12
+
13
+ <Main />
@@ -19,13 +19,14 @@ Modern.js 提供了开箱即用的 SWC 插件,可以为你的 Web 应用提供
19
19
 
20
20
  ## 安装
21
21
 
22
- 使用前需要安装 `@modern-js/plugin-swc` 插件。
22
+ 首先,你需要执行 `pnpm run new` 启用 SWC 编译:
23
23
 
24
24
  ```bash
25
- pnpm add @modern-js/plugin-swc -D
25
+ ? 请选择你想要的操作:启用可选功能
26
+ ? 启用可选功能:启用「SWC 编译」
26
27
  ```
27
28
 
28
- 安装完成后,只需在 `modern.config.ts` 文件中注册 SWC 插件,即可启用 SWC 编译和压缩能力。
29
+ 执行完成后,你只需在 `modern.config.ts` 文件中注册 SWC 插件,即可启用 SWC 编译和压缩能力。
29
30
 
30
31
  ```ts title="modern.config.ts"
31
32
  import appTools, { defineConfig } from '@modern-js/app-tools';
@@ -19,17 +19,33 @@ Modern.js 不支持同时在 package.json 中和 modern.config.ts 中配置同
19
19
 
20
20
  ## 在配置文件中配置
21
21
 
22
- Modern.js 的配置文件定义在项目的根目录下,支持 `.js`, `.ts` 和 `.mjs` 格式:
22
+ Modern.js 的配置文件定义在项目的根目录下,支持 `.ts`, `.js` 和 `.mjs` 格式:
23
23
 
24
- - `modern.config.js`
25
24
  - `modern.config.ts`
25
+ - `modern.config.js`
26
26
  - `modern.config.mjs`
27
27
 
28
- ### modern.config.js
28
+ ### modern.config.ts(推荐)
29
+
30
+ 我们推荐使用 .ts 格式的配置文件,它提供了友好的 TypeScript 类型提示,从而帮助你避免配置中的错误。
31
+
32
+ 从 `@modern-js/app-tools` 中导入 `defineConfig` 工具函数, 它会帮助你进行配置的类型推导和类型补全:
33
+
34
+ ```ts title="modern.config.ts"
35
+ import { defineConfig } from '@modern-js/app-tools';
36
+
37
+ export default defineConfig({
38
+ source: {
39
+ alias: {
40
+ '@common': './src/common',
41
+ },
42
+ },
43
+ });
44
+ ```
29
45
 
30
- `modern.config.js` 中可以使用 JavaScript 语法,因此比 `package.json` 更加灵活。
46
+ ### modern.config.js
31
47
 
32
- 比如,你可以在 `modern.config.js` 中定义函数类型的配置选项:
48
+ 如果你在开发一个非 TypeScript 项目,可以使用 .js 格式的配置文件:
33
49
 
34
50
  ```js title="modern.config.js"
35
51
  export default {
@@ -51,24 +67,6 @@ export default {
51
67
  };
52
68
  ```
53
69
 
54
- ### modern.config.ts(推荐)
55
-
56
- 我们推荐使用 .ts 格式的配置文件,它提供了友好的 TypeScript 类型提示,从而帮助你避免配置中的错误。
57
-
58
- 从 `@modern-js/app-tools` 中导入 `defineConfig` 工具函数, 它会帮助你进行配置的类型推导和类型补全:
59
-
60
- ```ts title="modern.config.ts"
61
- import { defineConfig } from '@modern-js/app-tools';
62
-
63
- export default defineConfig({
64
- source: {
65
- alias: {
66
- '@common': './src/common',
67
- },
68
- },
69
- });
70
- ```
71
-
72
70
  ### 导出配置函数
73
71
 
74
72
  Modern.js 支持在配置文件中导出一个函数,你可以在函数中动态计算配置,并返回给 Modern.js。
@@ -134,7 +132,7 @@ $ modern build -c modern.prod.config.js
134
132
 
135
133
  ## 在 package.json 中配置(不推荐)
136
134
 
137
- 除了配置文件外,也可以在 `package.json` 中的 `modernConfig` 字段下设置配置选项,如:
135
+ 除了配置文件外,你也可以在 `package.json` 中的 `modernConfig` 字段下设置配置项,如:
138
136
 
139
137
  ```json title="package.json"
140
138
  {
@@ -200,3 +198,47 @@ modern.config.local.ts
200
198
  modern.config.local.js
201
199
  modern.config.local.mjs
202
200
  ```
201
+
202
+ ## 合并多份配置
203
+
204
+ 在某些情况下,你可能需要将多份配置合并为一份配置,此时你可以使用 `mergeConfig` 工具函数来合并多个配置。
205
+
206
+ `mergeConfig` 函数接受一个数组作为参数,数组中的每一项都是一个配置对象,`mergeConfig` 会将数组中的每一项配置对象进行深层合并,自动将多个函数项合并为数组,最终返回一个合并后的配置对象。
207
+
208
+ ### 示例
209
+
210
+ ```ts title="modern.config.ts"
211
+ import { mergeConfig } from '@modern-js/app-tools';
212
+
213
+ const config1 = {
214
+ dev: {
215
+ port: 3000,
216
+ },
217
+ tools: {
218
+ postcss: () => console.log('config1');
219
+ },
220
+ };
221
+ const config2 = {
222
+ dev: {
223
+ port: 3001,
224
+ },
225
+ tools: {
226
+ postcss: () => console.log('config2');
227
+ },
228
+ };
229
+
230
+ const mergedConfig = mergeConfig([config1, config2]);
231
+ ```
232
+
233
+ 在以上示例中,合并后的配置对象为:
234
+
235
+ ```ts
236
+ const mergedConfig = {
237
+ dev: {
238
+ port: 3001,
239
+ },
240
+ tools: {
241
+ postcss: [() => console.log('config1'), () => console.log('config2')],
242
+ },
243
+ };
244
+ ```