@modern-js/main-doc 2.0.0-beta.3 → 2.0.0-beta.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (158) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/en/docusaurus-plugin-content-docs/current/apis/app/commands/dev.md +8 -3
  3. package/en/docusaurus-plugin-content-docs/current/apis/app/commands/inspect.md +31 -10
  4. package/en/docusaurus-plugin-content-docs/current/apis/app/commands/serve.md +32 -0
  5. package/en/docusaurus-plugin-content-docs/current/apis/app/hooks/src/server.md +31 -0
  6. package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/core/bootstrap.md +4 -3
  7. package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/core/create-app.md +2 -3
  8. package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/core/use-module-apps.md +1 -1
  9. package/en/docusaurus-plugin-content-docs/current/components/init-app.md +42 -0
  10. package/en/docusaurus-plugin-content-docs/current/configure/app/builder-plugins.md +70 -0
  11. package/en/docusaurus-plugin-content-docs/current/configure/app/dev/with-master-app.md +0 -1
  12. package/en/docusaurus-plugin-content-docs/current/configure/app/plugins.md +11 -5
  13. package/en/docusaurus-plugin-content-docs/current/configure/app/server/routes.md +2 -4
  14. package/en/docusaurus-plugin-content-docs/current/configure/app/source/disable-entry-dirs.md +38 -0
  15. package/en/docusaurus-plugin-content-docs/current/configure/app/source/entries.md +66 -2
  16. package/en/docusaurus-plugin-content-docs/current/configure/app/tools/esbuild.md +16 -39
  17. package/en/docusaurus-plugin-content-docs/current/guides/basic-features/css/css-in-js.md +38 -0
  18. package/en/docusaurus-plugin-content-docs/current/guides/basic-features/css/css-modules.md +86 -0
  19. package/en/docusaurus-plugin-content-docs/current/guides/basic-features/css/less-sass.md +17 -0
  20. package/en/docusaurus-plugin-content-docs/current/guides/basic-features/css/postcss.md +81 -0
  21. package/en/docusaurus-plugin-content-docs/current/guides/basic-features/css/tailwindcss.md +95 -0
  22. package/en/docusaurus-plugin-content-docs/current/guides/basic-features/data-fetch.md +66 -0
  23. package/en/docusaurus-plugin-content-docs/current/guides/basic-features/routes.md +270 -0
  24. package/en/docusaurus-plugin-content-docs/current/guides/concept/entries.md +116 -0
  25. package/en/docusaurus-plugin-content-docs/current/guides/get-started/quick-start.md +162 -0
  26. package/en/docusaurus-plugin-content-docs/current/guides/get-started/upgrade.md +78 -0
  27. package/{zh/tutorials/first-app → en/docusaurus-plugin-content-docs/current/guides}/overview.md +4 -4
  28. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/framework-plugin/_category_.json +4 -0
  29. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/framework-plugin/lifecycle.md +15 -0
  30. package/en/docusaurus-plugin-content-docs/current/tutorials/foundations/introduction.md +1 -1
  31. package/en/docusaurus-plugin-content-docs/current.json +11 -11
  32. package/package.json +4 -4
  33. package/zh/apis/app/commands/dev.md +9 -4
  34. package/zh/apis/app/commands/inspect.md +32 -11
  35. package/zh/apis/app/commands/new.md +1 -1
  36. package/zh/apis/app/commands/{start.md → serve.md} +3 -3
  37. package/zh/apis/app/hooks/src/index_.md +5 -4
  38. package/zh/apis/app/hooks/src/server.md +31 -0
  39. package/zh/apis/app/runtime/core/bootstrap.md +3 -4
  40. package/zh/apis/app/runtime/core/create-app.md +1 -18
  41. package/zh/apis/app/runtime/core/use-module-apps.md +64 -33
  42. package/zh/apis/app/runtime/web-server/hook.md +1 -1
  43. package/zh/apis/app/runtime/web-server/middleware.md +1 -0
  44. package/zh/components/debug-app.md +18 -0
  45. package/zh/components/default-mwa-generate.md +5 -0
  46. package/zh/components/deploy.md +1 -0
  47. package/zh/components/enable-micro-frontend.md +13 -0
  48. package/zh/components/global-proxy.md +28 -0
  49. package/zh/components/init-app.md +44 -0
  50. package/zh/components/micro-runtime-config.md +18 -0
  51. package/zh/components/prerequisites.md +19 -0
  52. package/zh/components/release-note.md +1 -0
  53. package/zh/configure/app/builder-plugins.md +72 -0
  54. package/zh/configure/app/deploy/_category_.json +4 -0
  55. package/zh/configure/app/deploy/microFrontend.md +64 -0
  56. package/zh/configure/app/dev/with-master-app.md +0 -2
  57. package/zh/configure/app/plugins.md +10 -4
  58. package/zh/configure/app/runtime/master-app.md +33 -36
  59. package/zh/configure/app/server/routes.md +2 -4
  60. package/zh/configure/app/source/disable-entry-dirs.md +37 -0
  61. package/zh/configure/app/source/entries-dir.md +0 -3
  62. package/zh/configure/app/source/entries.md +66 -3
  63. package/zh/configure/app/tools/esbuild.md +16 -39
  64. package/zh/guides/advanced-features/bff/bff-proxy.md +1 -1
  65. package/zh/guides/advanced-features/compatibility.md +14 -39
  66. package/zh/guides/advanced-features/eslint.md +21 -21
  67. package/zh/guides/advanced-features/ssg.md +20 -9
  68. package/zh/guides/advanced-features/ssr.md +95 -52
  69. package/zh/guides/advanced-features/testing.md +44 -1
  70. package/zh/guides/advanced-features/web-server.md +14 -3
  71. package/zh/guides/basic-features/css/tailwindcss.md +13 -6
  72. package/zh/guides/basic-features/data-fetch.md +398 -5
  73. package/zh/guides/basic-features/html.md +182 -0
  74. package/zh/guides/basic-features/mock.md +3 -9
  75. package/zh/guides/basic-features/proxy.md +2 -27
  76. package/zh/guides/basic-features/routes.md +35 -3
  77. package/zh/guides/concept/entries.md +108 -19
  78. package/zh/guides/get-started/quick-start.md +14 -83
  79. package/zh/guides/get-started/upgrade.md +11 -9
  80. package/zh/guides/{concept → topic-detail/framework-plugin}/lifecycle.md +0 -0
  81. package/zh/guides/topic-detail/micro-frontend/c01-introduction.md +29 -0
  82. package/zh/guides/topic-detail/micro-frontend/c02-development.md +191 -0
  83. package/zh/guides/topic-detail/micro-frontend/c03-main-app.md +246 -0
  84. package/zh/guides/topic-detail/micro-frontend/c04-communicate.md +54 -0
  85. package/zh/guides/topic-detail/micro-frontend/{mixed-stack.md → c05-mixed-stack.md} +3 -3
  86. package/zh/guides/topic-detail/model/quick-start.md +1 -1
  87. package/zh/guides/topic-detail/model/test-model.md +2 -2
  88. package/zh/guides/topic-detail/monorepo/create-sub-project.md +2 -2
  89. package/zh/guides/topic-detail/monorepo/intro.md +1 -1
  90. package/zh/guides/troubleshooting/dependencies.md +0 -69
  91. package/zh/tutorials/first-app/_category_.json +1 -1
  92. package/zh/tutorials/first-app/c01-start.md +99 -0
  93. package/zh/tutorials/first-app/{c05-component/5.1-use-ui-library.md → c02-component.md} +13 -15
  94. package/zh/tutorials/first-app/c03-css.md +324 -0
  95. package/zh/tutorials/first-app/{c08-client-side-routing/8.1-code-based-routing.md → c04-routes.md} +52 -39
  96. package/zh/tutorials/first-app/c05-loader.md +82 -0
  97. package/zh/tutorials/first-app/c06-model.md +256 -0
  98. package/zh/tutorials/first-app/c07-container.md +283 -0
  99. package/zh/tutorials/first-app/c08-entries.md +137 -0
  100. package/zh/tutorials/foundations/introduction.md +1 -1
  101. package/en/docusaurus-plugin-content-docs/current/apis/app/commands/start.md +0 -32
  102. package/en/docusaurus-plugin-content-docs/current/configure/app/output/enable-modern-mode.md +0 -34
  103. package/zh/apis/generator/overview.md +0 -32
  104. package/zh/configure/app/output/enable-modern-mode.md +0 -34
  105. package/zh/guides/advanced-features/custom-app.md +0 -72
  106. package/zh/guides/topic-detail/micro-frontend/communicate.md +0 -39
  107. package/zh/guides/topic-detail/micro-frontend/debugging.md +0 -168
  108. package/zh/guides/topic-detail/micro-frontend/introduction.md +0 -13
  109. package/zh/guides/topic-detail/micro-frontend/route-mode.md +0 -110
  110. package/zh/guides/topic-detail/monorepo/deploy.md +0 -43
  111. package/zh/tutorials/first-app/c01-getting-started/1.1-prerequisites.md +0 -25
  112. package/zh/tutorials/first-app/c01-getting-started/1.2-minimal-mwa.md +0 -118
  113. package/zh/tutorials/first-app/c01-getting-started/1.3-dev-command.md +0 -29
  114. package/zh/tutorials/first-app/c01-getting-started/1.4-enable-ssr.md +0 -47
  115. package/zh/tutorials/first-app/c01-getting-started/1.5-start-command.md +0 -18
  116. package/zh/tutorials/first-app/c01-getting-started/1.6-create-repo.md +0 -31
  117. package/zh/tutorials/first-app/c01-getting-started/_category_.json +0 -3
  118. package/zh/tutorials/first-app/c02-generator-and-studio/2.1-generator.md +0 -79
  119. package/zh/tutorials/first-app/c02-generator-and-studio/2.2-boilerplates.md +0 -34
  120. package/zh/tutorials/first-app/c02-generator-and-studio/2.3-configuration.md +0 -19
  121. package/zh/tutorials/first-app/c02-generator-and-studio/_category_.json +0 -3
  122. package/zh/tutorials/first-app/c03-ide/3.1-setting-up.md +0 -55
  123. package/zh/tutorials/first-app/c03-ide/3.2-hints-in-ide.md +0 -60
  124. package/zh/tutorials/first-app/c03-ide/3.3-autofix-in-ide.md +0 -11
  125. package/zh/tutorials/first-app/c03-ide/3.4-autofix-in-cli.md +0 -63
  126. package/zh/tutorials/first-app/c03-ide/_category_.json +0 -3
  127. package/zh/tutorials/first-app/c04-es6-plus-and-ts/4.1-use-es6-plus.md +0 -54
  128. package/zh/tutorials/first-app/c04-es6-plus-and-ts/4.2-use-typescript.md +0 -135
  129. package/zh/tutorials/first-app/c04-es6-plus-and-ts/4.3-compatibility.md +0 -67
  130. package/zh/tutorials/first-app/c04-es6-plus-and-ts/_category_.json +0 -3
  131. package/zh/tutorials/first-app/c05-component/5.2-use-standalone-component.md +0 -72
  132. package/zh/tutorials/first-app/c05-component/_category_.json +0 -3
  133. package/zh/tutorials/first-app/c06-css-and-component/6.1-css-in-js.md +0 -110
  134. package/zh/tutorials/first-app/c06-css-and-component/6.2-utility-class.md +0 -143
  135. package/zh/tutorials/first-app/c06-css-and-component/6.3-postcss.md +0 -84
  136. package/zh/tutorials/first-app/c06-css-and-component/6.4-design-system.md +0 -83
  137. package/zh/tutorials/first-app/c06-css-and-component/6.5-storybook.md +0 -77
  138. package/zh/tutorials/first-app/c06-css-and-component/6.6-testing.md +0 -104
  139. package/zh/tutorials/first-app/c06-css-and-component/_category_.json +0 -3
  140. package/zh/tutorials/first-app/c07-app-entry/7.1-intro.md +0 -69
  141. package/zh/tutorials/first-app/c07-app-entry/7.2-add-entry-in-cli.md +0 -100
  142. package/zh/tutorials/first-app/c07-app-entry/7.3-manage-entries-by-hand.md +0 -69
  143. package/zh/tutorials/first-app/c07-app-entry/_category_.json +0 -3
  144. package/zh/tutorials/first-app/c08-client-side-routing/_category_.json +0 -3
  145. package/zh/tutorials/first-app/c09-bff/9.1-serverless.md +0 -30
  146. package/zh/tutorials/first-app/c09-bff/9.2-enable-bff.md +0 -95
  147. package/zh/tutorials/first-app/c09-bff/9.3-fetch-bff.md +0 -131
  148. package/zh/tutorials/first-app/c09-bff/_category_.json +0 -3
  149. package/zh/tutorials/first-app/c10-model/10.1-application-architecture.md +0 -21
  150. package/zh/tutorials/first-app/c10-model/10.2-add-model.md +0 -185
  151. package/zh/tutorials/first-app/c10-model/10.3-use-model.md +0 -55
  152. package/zh/tutorials/first-app/c10-model/10.4-testing.md +0 -69
  153. package/zh/tutorials/first-app/c10-model/_category_.json +0 -3
  154. package/zh/tutorials/first-app/c11-container/11.1-use-model-with-app-state.md +0 -240
  155. package/zh/tutorials/first-app/c11-container/11.2-add-container.md +0 -109
  156. package/zh/tutorials/first-app/c11-container/11.3-use-loader.md +0 -63
  157. package/zh/tutorials/first-app/c11-container/11.4-testing.md +0 -56
  158. package/zh/tutorials/first-app/c11-container/_category_.json +0 -3
@@ -177,7 +177,7 @@ Modern.js 会生成 `/login` 和 `/sign` 两条路由,`__auth/layout.tsx` 组
177
177
 
178
178
  `routes/` 下每一层目录中,开发者可以创建 `loading.tsx` 文件,默认导出一个 `<Loading>` 组件。
179
179
 
180
- 当路由目录下存在该组件时,这一级子路由下所有的路由切换时,都会以该 `<Loading>` 组件作为 JS Chunk 加载时的 Fallback UI。当该目录下未定义 `layout.tsx` 文件时,`<Loading>` 组件不会生效。例如以下文件目录:
180
+ 当路由目录下存在该组件和 `layout` 组件时,这一级子路由下所有的路由切换时,都会以该 `<Loading>` 组件作为 JS Chunk 加载时的 Fallback UI。例如以下文件目录:
181
181
 
182
182
  ```bash
183
183
  .
@@ -191,7 +191,38 @@ Modern.js 会生成 `/login` 和 `/sign` 两条路由,`__auth/layout.tsx` 组
191
191
  └── page.tsx
192
192
  ```
193
193
 
194
- 当路由从 `/` 跳转到 `/blog` 时,如果 `<Blog>` 组件的 JS Chunk 还未加载,则会先展示 `loading.tsx` 中导出的组件 UI。但从 `/blog` 跳转到 `/blog/20220101` 时,则不会展示。
194
+ 当定义 `loading.tsx` 时,就相当于以下布局:
195
+ ```tsx title="当路由为 / 时"
196
+ <Layout>
197
+ <Suspense fallback={<Loading/>}>
198
+ <Page><Page>
199
+ </Suspense>
200
+ </Layout>
201
+ ```
202
+
203
+ ```tsx title="当路由为 /blog 时"
204
+ <Layout>
205
+ <Suspense fallback={<Loading/>}>
206
+ <BlogPage />
207
+ </Suspense>
208
+ </Layout>
209
+ ```
210
+
211
+ ```tsx title="当路由为 /blog/123 时"
212
+ <Layout>
213
+ <Suspense fallback={<Loading/>}>
214
+ <BlogIdPage />
215
+ </Suspense>
216
+ </Layout>
217
+ ```
218
+ :::info
219
+ 当目录的 layout 组件不存在时,该目录下的 loading 组件也不会生效。
220
+ :::
221
+
222
+ 当路由从 `/` 跳转到 `/blog` 时,如果 `blog/page` 组件的 JS Chunk 还未加载,则会先展示 `loading.tsx` 中导出的组件 UI。
223
+
224
+ 同理,当路由从 `/` 或者 `/blog` 跳转到 `/blog/123` 时,如果 `blog/[id]/page` 组件的 JS Chunk 还未加载,也会先展示 `loading.tsx` 中导出的组件 UI。
225
+
195
226
 
196
227
  ### 错误处理
197
228
 
@@ -206,7 +237,7 @@ Modern.js 会生成 `/login` 和 `/sign` 两条路由,`__auth/layout.tsx` 组
206
237
 
207
238
  ```tsx
208
239
  import { useRouteError } from '@modern-js/runtime/router';
209
- export default const ErrorBoundary = () => {
240
+ const ErrorBoundary = () => {
210
241
  const error = useRouteError();
211
242
  return (
212
243
  <div>
@@ -215,6 +246,7 @@ export default const ErrorBoundary = () => {
215
246
  </div>
216
247
  )
217
248
  }
249
+ export default ErrorBoundary;
218
250
  ```
219
251
 
220
252
  ## 自控式路由
@@ -3,7 +3,7 @@ title: 入口
3
3
  sidebar_position: 2
4
4
  ---
5
5
 
6
- 入口是 Modern.js 默认的文件约定,项目的每一个入口是一张独立的页面,对应一条服务端路由。
6
+ 入口是 Modern.js 默认的文件约定,项目的每一个入口是一张独立的页面,对应一条**服务端路由**。
7
7
 
8
8
  很多配置,如 HTML 模板、Meta 信息、是否开启 SSR、SSG、服务端路由规则都是以入口为维度划分的。
9
9
 
@@ -13,7 +13,6 @@ Modern.js 初始化的项目是单入口的,项目结构如下:
13
13
 
14
14
  ```
15
15
  .
16
- ├── node_modules
17
16
  ├── src
18
17
  │   ├── modern-app-env.d.ts
19
18
  │   └── routes
@@ -30,9 +29,9 @@ Modern.js 初始化的项目是单入口的,项目结构如下:
30
29
  Modern.js 可以很方便的将单入口切换成多入口。可以在项目下执行 `pnpm run new`,通过生成器创建入口:
31
30
 
32
31
  ```bash
33
- ? 请选择你想要的操作: 创建工程元素
34
- ? 创建工程元素: 新建「应用入口」
35
- ? 请填写入口名称: new-entry
32
+ ? 请选择你想要的操作 创建工程元素
33
+ ? 创建工程元素 新建「应用入口」
34
+ ? 请填写入口名称 new-entry
36
35
  ```
37
36
 
38
37
  执行后,`src/` 目录将会变成如下结构:
@@ -57,10 +56,13 @@ Modern.js 可以很方便的将单入口切换成多入口。可以在项目下
57
56
  执行 `pnpm run dev` 后,可以看到新增一条 `/new-entry` 的路由,并且被迁移的代码路由并未发生变化。
58
57
 
59
58
  :::note
60
- Modern.js 会将和 `package.json` 中 `name` 同名的目录作为主入口,默认路由为 `/`,其他入口默认路由为 `/{entryName}`。
59
+ Modern.js 会将和 `package.json` 中 `name` 字段同名的入口作为主入口,默认路由为 `/`,其他入口默认路由为 `/{entryName}`。
61
60
  :::
62
61
 
63
- ## 入口条件
62
+
63
+ ## 入口类型
64
+
65
+ 不同的入口类型具有不同的编译和运行时行为。在 Modern.js 创建项目时,开发者可以手动选择创建**框架模式**或是**构建模式**的项目。完成创建后,可以看到不同模式的项目样板文件是不同的。
64
66
 
65
67
  默认情况下,Modern.js 启动项目前会对 `src/` 下的文件进行扫描,识别入口,并生成对应的服务端路由。
66
68
 
@@ -73,7 +75,7 @@ Modern.js 会将和 `package.json` 中 `name` 同名的目录作为主入口,
73
75
  1. 具有 `routes/` 目录
74
76
  2. 具有 `App.[jt]sx?` 文件
75
77
  3. 具有 `index.[jt]sx?` 文件
76
- 2. 具有 `pages/` 目录(兼容旧版本)
78
+ 2. 具有 `pages/` 目录(兼容 Modern.js 1.0)
77
79
 
78
80
  当 `src/` 目录满足入口特征时,Modern.js 会认为当前项目为单入口应用。
79
81
 
@@ -83,34 +85,121 @@ Modern.js 会将和 `package.json` 中 `name` 同名的目录作为主入口,
83
85
 
84
86
  当项目不是单入口应用时,Modern.js 会进一步查看 `src/` 下的一级目录。
85
87
 
86
- ## 入口的区别
88
+ ### 框架模式入口
87
89
 
88
- 不同约定的入口具有不同的行为。
90
+ 框架模式指需要使用 Modern.js 框架能力,例如 Router、SSR、一体化调用等。这类入口约定下,开发者定义的入口并不是真正的 Webpack 编译入口。Modern.js 在启动时会生成一个封装过的入口,可以在 `node_modules/.modern/{entryName}/index.js` 找到真正的入口。
89
91
 
90
- ### routes 入口
92
+ #### 约定式路由
91
93
 
92
- 如果入口为 `routes/` 约定,Modern.js 会在启动时扫描 `routes` 下的文件,基于文件约定,自动生成客户端路由(react-router)。
94
+ 如果入口中存在 `routes/` 目录,Modern.js 会在启动时扫描 `routes/` 下的文件,基于文件约定,自动生成客户端路由(react-router)。
93
95
 
94
96
  详细内容可以参考[路由](/docs/guides/basic-features/routes)。
95
97
 
96
- ### App 入口
98
+ #### 自定义路由
97
99
 
98
- 如果入口为 `App.[jt]sx?` 约定,开发者可以在这个文件中自由的设置客户端路由,或者不设置客户端路由。
100
+ 如果入口中存在 `App.[jt]sx?` 文件,开发者可以在这个文件中自由的设置客户端路由,或者不设置客户端路由。
99
101
 
100
102
  详细内容可以参考[路由](/docs/guides/basic-features/routes)。
101
103
 
102
- ### Index 入口
104
+ #### 自定义 App
105
+
106
+ 如果入口中存在 `index.[jt]sx` 文件,并且当文件默认导出函数时,Modern.js 还是会根据 runtime 的设置情况生成 createApp 包裹后的代码。在渲染过程中,将 createApp 包裹后的组件作为参数传递给 index 文件导出的函数,这样开发者可以自定义将组件挂载到 DOM 节点上,或在挂载前添加自定义行为。例如:
107
+
108
+ ```tsx
109
+ import ReactDOM from 'react-dom/client'
110
+ import { bootstrap } from '@modern-js/runtime';
111
+
112
+
113
+ export default (App: React.ComponentType) => {
114
+ // do something before bootstrap...
115
+ bootstrap(App, 'root', undefined, ReactDOM);
116
+ };
117
+ ```
118
+
119
+ :::warning
120
+ 由于 bootstrap 函数需要兼容 React17 和 React18 的用法,调用 bootstrap 函数时需要手动传入 ReactDOM 参数。
121
+ :::
122
+
123
+ Modern.js 生成的文件内容如下:
124
+
125
+ ```js
126
+ import React from 'react';
127
+ import ReactDOM from 'react-dom/client';
128
+ import customBootstrap from '@_edenx_src/index.tsx';
129
+ import App from '@_edenx_src/App';
130
+ import { router, state } from '@edenx/runtime/plugins';
131
+
132
+ const IS_BROWSER = typeof window !== 'undefined' && window.name !== 'nodejs';
133
+ const MOUNT_ID = 'root';
134
+
135
+ let AppWrapper = null;
136
+
137
+ function render() {
138
+ AppWrapper = createApp({
139
+ // runtime 的插件参数...
140
+ })(App)
141
+ if (IS_BROWSER) {
142
+ customBootstrap(AppWrapper);
143
+ }
144
+ return AppWrapper
145
+ }
146
+
147
+ AppWrapper = render();
148
+
149
+ export default AppWrapper;;
150
+ ```
151
+
152
+ ### 构建模式入口
153
+
154
+ 构建模式是指不使用任何 Modern.js 运行时的能力,完全由开发者自己定义项目 Webpack 的入口。
155
+
156
+ 如果入口中存在 `index.[jt]sx` ,并且没有默认导出函数时,这时候该文件就是真正的 Webpack 入口文件。这里和 [Create React App](https://github.com/facebook/create-react-app) 类似,需要自己将组件挂载到 DOM 节点、添加热更新代码等。例如:
103
157
 
104
- 通常情况下,上面两种模式已经能满足需求,但当开发者需要自己接管 React 挂载逻辑,或完全接管 Webpack 入口时,可以使用 `index.[jt]sx?` 约定。
158
+ ```js title=src/index.jsx
159
+ import React from 'react';
160
+ import ReactDOM from 'react-dom';
161
+ import App from './App';
105
162
 
106
- 如果入口为 `index.[jt]sx?` 约定,Modern.js 会根据该文件是否存在默认的组件导出,来决定构建行为。
163
+ ReactDOM.render(<App />, document.getElementById('root'));
164
+ ```
165
+
166
+ Modern.js **不推荐**使用这种方式,这种方式丧失了框架的一些能力,如 **`modern.config.js` 文件中的 `runtime` 配置将不会再生效**。但是在项目从其他框架迁移到 Modern.js,例如 CRA,或是自己手动搭建的 webpack 时,这种方式会非常有用。
107
167
 
108
- 详细内容可以参考[自定义 App](/docs/guides/advanced-features/custom-app)。
168
+ ## 使用配置文件定义入口
109
169
 
110
- ## 配置入口
170
+ 有些时候,已有的项目并不是按照 Modern.js 的目录结构来搭建的。如果强行要按照这种结构来工作,会有比较大的迁移成本。
111
171
 
112
172
  在 Modern.js 中,除了使用文件约定生成入口外,还可以在 `modern.config.[jt]s` 中手动配置入口。
113
173
 
174
+ ```ts
175
+ export default defineConfig({
176
+ source: {
177
+ entries: {
178
+ // 指定一个名称为 entry_customize 的新入口
179
+ entry_customize: './src/home/test/index.js',
180
+ },
181
+ },
182
+ });
183
+ ```
184
+
114
185
  :::tip
115
186
  详情可以查看 [source.entries](/docs/configure/app/source/entries)。
116
187
  :::
188
+
189
+ ## 禁用默认入口扫描
190
+
191
+ 另外,项目的部分结构可能恰巧命中了 Modern.js 的约定,但实际上这部分并不是真实的入口。
192
+
193
+ Modern.js 提供了配置,来禁用默认的入口扫描。与配置的入口结合使用,大部分项目可以在不修改目录结构的情况下,快速的进行迁移。
194
+
195
+ ```ts
196
+ export default defineConfig({
197
+ source: {
198
+ disableDefaultEntries: true,
199
+ },
200
+ });
201
+ ```
202
+
203
+ :::tip
204
+ 详情可以查看 [source.disableDefaultEntries](/docs/configure/app/source/disable-default-entries)。
205
+ :::
@@ -5,25 +5,9 @@ sidebar_position: 1
5
5
 
6
6
  ## 环境准备
7
7
 
8
- ### Node.js
8
+ import Prerequisites from '@site-docs/components/prerequisites.md'
9
9
 
10
- 需要 [Node.js LTS](https://github.com/nodejs/Release),并确保 Node 版本大于等于 14.17.6。
11
-
12
- Modern.js 推荐在开发环境里先安装 [nvm](https://github.com/nvm-sh/nvm#install--update-script),在 shell 里集成[自动切换 node 版本的脚本](https://github.com/nvm-sh/nvm#deeper-shell-integration)。
13
-
14
- 然后只要仓库根目录下有内容为 `lts/fermium` 或 `lts/gallium` 的 `.nvmrc` 文件,进入这个仓库时就会自动安装或切换到正确的 Node.js 版本。
15
-
16
- ### pnpm
17
-
18
- 推荐使用 [pnpm](https://pnpm.io/installation) 来管理依赖:
19
-
20
- ```bash
21
- npm install -g pnpm
22
- ```
23
-
24
- :::note
25
- Modern.js 同样支持使用 `yarn`、`npm` 进行依赖管理。
26
- :::
10
+ <Prerequisites />
27
11
 
28
12
  ## 安装
29
13
 
@@ -44,72 +28,16 @@ npx @modern-js/create myapp
44
28
 
45
29
  ## 初始化项目
46
30
 
47
- Modern.js 生成器会提供一个可交互的问答界面,根据结果初始化项目,按照默认的选择进行初始化:
48
-
49
- ```bash
50
- ? 请选择你想创建的工程类型 应用
51
- ? 请选择开发语言 TS
52
- ? 请选择包管理工具 pnpm
53
- ```
54
-
55
- 在生成项目后,Modern.js 会自动安装依赖、创建 git 仓库。
56
-
57
- ```bash
58
- [INFO] 依赖自动安装成功
59
- [INFO] git 仓库初始化成功
60
- [INFO] 创建成功!
61
- 可在新项目的目录下运行以下命令:
62
- pnpm run dev # 按开发环境的要求,运行和调试项目
63
- pnpm run build # 按产品环境的要求,构建项目
64
- pnpm run start # 按产品环境的要求,运行项目
65
- pnpm run lint # 检查和修复所有代码
66
- pnpm run new # 继续创建更多项目要素,比如应用入口
67
- ```
68
-
69
- :::note
70
- Modern.js 生成器除了在项目初始化时工作外,也能在后续研发中生成项目各种粒度的模块,并非一用即抛开。
71
- :::
72
31
 
73
- 现在,项目结构如下:
32
+ import InitApp from '@site-docs/components/init-app.md'
74
33
 
75
- ```
76
- .
77
- ├── node_modules
78
- ├── src
79
- │   ├── modern-app-env.d.ts
80
- │   └── routes
81
- │   ├── index.css
82
- │   ├── layout.tsx
83
- │   └── page.tsx
84
- ├── modern.config.ts
85
- ├── package.json
86
- ├── pnpm-lock.yaml
87
- ├── README.md
88
- └── tsconfig.json
89
- ```
34
+ <InitApp />
90
35
 
91
36
  ## 启动项目
92
37
 
93
- 在项目中执行 `pnpm run dev` 即可启动项目:
94
-
95
- ```bash
96
- $ pnpm run dev
97
-
98
- > modern dev
99
-
100
- info Starting dev server...
101
- info App running at:
102
-
103
- > Local: http://localhost:8080/
104
- > Network: http://10.94.58.87:8080/
105
- > Network: http://10.254.68.105:8080/
106
-
107
- Client ✔ done in 76.10ms
108
- ```
109
-
110
- 在浏览器中打开 `http://localhost:8000/`,能看到以下内容:
38
+ import DebugApp from '@site-docs/components/debug-app.md'
111
39
 
112
- ![dev](https://lf3-static.bytednsdoc.com/obj/eden-cn/nuvjhpqnuvr/modern-website/dev.png)
40
+ <DebugApp />
113
41
 
114
42
  ## 使用配置
115
43
 
@@ -118,7 +46,7 @@ info App running at:
118
46
  可以通过配置文件来开启功能,或覆盖 Modern.js 的默认行为。例如添加如下配置,开启 SSR:
119
47
 
120
48
  ```ts
121
- import { defineConfig } from '@modern-js/app-tools';
49
+ import AppToolsPlugin, { defineConfig } from '@modern-js/app-tools';
122
50
 
123
51
  // https://modernjs.dev/docs/apis/app/config
124
52
  export default defineConfig({
@@ -129,6 +57,7 @@ export default defineConfig({
129
57
  server: {
130
58
  ssr: true,
131
59
  },
60
+ plugins: [AppToolsPlugin()],
132
61
  });
133
62
  ```
134
63
 
@@ -180,12 +109,12 @@ info File sizes after production build:
180
109
 
181
110
  ## 本地验证
182
111
 
183
- 在项目中执行 `pnpm run start` 即可在本地验证构建产物是否正常运行:
112
+ 在项目中执行 `pnpm run serve` 即可在本地验证构建产物是否正常运行:
184
113
 
185
114
  ```bash
186
- $ pnpm run start
115
+ $ pnpm run serve
187
116
 
188
- > modern start
117
+ > modern serve
189
118
 
190
119
  Starting the modern server...
191
120
  info App running at:
@@ -199,4 +128,6 @@ info App running at:
199
128
 
200
129
  ## 部署
201
130
 
202
- 本地验证完成后,可以将 `dist/` 下的产物整理成服务器需要的结构,进行部署。
131
+ import Deploy from '@site-docs/components/deploy.md'
132
+
133
+ <Deploy />
@@ -16,28 +16,30 @@ $ pnpm run upgrade
16
16
 
17
17
  [INFO] [项目类型]: 应用
18
18
  [INFO] [Modern.js 最新版本]: 2.0.0
19
- [INFO] [当前项目 Modern.js 依赖已经为最新版本]: 2.0.0
19
+ [INFO] 已更新 Modern.js 依赖至最新版本!
20
20
  ```
21
21
 
22
- 可以看到项目 `package.json` 中的依赖已经更改到最新,执行 `pnpm install` 重新安装即可。
22
+ 可以看到项目 `package.json` 中的依赖已经更改到最新。
23
23
 
24
24
  ## 指定版本升级
25
25
 
26
- Modern.js 所有的官方包目前都使用统一版本号进行发布。
26
+ Modern.js 所有的官方包目前都使用**统一版本号**进行发布。
27
27
 
28
- 根据官网 Release Note,开发者也可以手动将项目升级到想要的版本。
28
+ import ReleaseNote from '@site-docs/components/release-note.md'
29
+
30
+ <ReleaseNote />
29
31
 
30
32
  :::tip
31
- 对所有 Modern.js 官方提供的包做统一升级,而不是升级单个依赖。
33
+ 当升级时,需要对 Modern.js 官方提供的所有包做统一升级,而不是升级单个依赖。
32
34
  :::
33
35
 
34
36
  ## 锁定子依赖
35
37
 
36
38
  当项目某个子依赖出现问题,而 Modern.js 无法立即更新时,可以使用包管理器锁定子依赖版本。
37
39
 
38
- ### Pnpm
40
+ ### pnpm
39
41
 
40
- 对于使用 Pnpm 的项目,请在**项目根目录**的 `package.json` 中添加以下配置,然后重新执行 `pnpm i`:
42
+ 对于使用 pnpm 的项目,请在**项目根目录**的 `package.json` 中添加以下配置,然后重新执行 `pnpm install`:
41
43
 
42
44
  ```json
43
45
  {
@@ -51,7 +53,7 @@ Modern.js 所有的官方包目前都使用统一版本号进行发布。
51
53
 
52
54
  ### Yarn
53
55
 
54
- 对于使用 Yarn 的项目,请在**项目根目录**的 `package.json` 中添加以下配置,然后重新执行 `yarn i`:
56
+ 对于使用 Yarn 的项目,请在**项目根目录**的 `package.json` 中添加以下配置,然后重新执行 `yarn install`:
55
57
 
56
58
  ```json
57
59
  {
@@ -63,7 +65,7 @@ Modern.js 所有的官方包目前都使用统一版本号进行发布。
63
65
 
64
66
  ### Npm
65
67
 
66
- 对于使用 Npm 的项目,请在**项目根目录**的 `package.json` 中添加以下配置,然后重新执行 `npm i`:
68
+ 对于使用 Npm 的项目,请在**项目根目录**的 `package.json` 中添加以下配置,然后重新执行 `npm install`:
67
69
 
68
70
  ```json
69
71
  {
@@ -0,0 +1,29 @@
1
+ ---
2
+ sidebar_position: 1
3
+ title: 微前端介绍
4
+ ---
5
+
6
+ 微前端是一种类似于微服务的架构,是一种由独立交付的多个前端应用组成整体的架构风格,将前端应用分解成一些更小、更简单的能够独立开发、测试、部署的应用,而在用户看来仍然是内聚的单个产品。
7
+
8
+ 它主要解决了两个问题:
9
+
10
+ * 随着项目迭代应用越来越庞大,难以维护。
11
+ * 跨团队或跨部门协作开发项目导致效率低下的问题。
12
+
13
+ ## 微前端关键词
14
+
15
+ 在微前端研发模式中,应用会被分成 **主应用**、和 **子应用**。
16
+
17
+ - 主应用:微前端项目的基座工程,所有子应用都会由它来加载。
18
+ - 子应用:独立开发、独立部署的应用,最终会被主应用加载。
19
+
20
+ ## 功能简介
21
+
22
+ * 基于 [Garfish](https://www.garfishjs.org/guide)
23
+ * 生成器支持微前端应用
24
+ * 支持 React 组件式引用微前端子应用
25
+ * 支持 loading
26
+ * 支持主应用线上、子应用线下调试模式
27
+
28
+ 可以在 [体验微前端](/docs/guides/topic-detail/micro-frontend/c02-development) 一节学习如何开发微前端主子应用。
29
+
@@ -0,0 +1,191 @@
1
+ ---
2
+ sidebar_position: 2
3
+ title: 体验微前端
4
+ ---
5
+
6
+ 通过本章你可以了解到:
7
+
8
+ - 如何创建微前端项目的主应用、子应用。
9
+ - 微前端项目开发的基本流程。
10
+
11
+ ## 创建应用
12
+
13
+ 在这次的实践中,我们需要创建三个应用,分别为1个主应用,2个子应用:
14
+
15
+ - main 主应用
16
+ - dashboard 子应用
17
+ - table 子应用
18
+
19
+ ### 创建 main 主应用
20
+
21
+ 通过命令行工具初始化项目:
22
+
23
+ ```bash
24
+ mkdir main && cd main
25
+ npx @modern-js/create
26
+ ```
27
+
28
+ import DefaultMWAGenerate from '@site-docs/components/default-mwa-generate.md';
29
+
30
+ <DefaultMWAGenerate />
31
+
32
+ 完成项目创建后我们可以通过 `pnpm run new` 来开启 `微前端` 功能:
33
+
34
+ ```bash
35
+ ? 请选择你想要的操作 启用可选功能
36
+ ? 启用可选功能 启用「微前端」模式
37
+ ```
38
+
39
+ 接下来,让我们注册微前端插件并添加开启微前端主应用,并增加子应用列表:
40
+
41
+ import EnableMicroFrontend from '@site-docs/components/enable-micro-frontend.md';
42
+
43
+ <EnableMicroFrontend />
44
+
45
+ import MicroRuntimeConfig from '@site-docs/components/micro-runtime-config.md';
46
+
47
+ <MicroRuntimeConfig />
48
+
49
+
50
+ ### 创建 dashboard 子应用
51
+
52
+ 通过命令行工具初始化项目:
53
+
54
+ ```bash
55
+ mkdir dashboard && cd dashboard
56
+ npx @modern-js/create
57
+ ```
58
+
59
+ 按照如下选择,生成项目:
60
+
61
+ <DefaultMWAGenerate/>
62
+
63
+ 我们执行 `pnpm run new` 来开启 `微前端` 功能:
64
+
65
+ ```bash
66
+ ? 请选择你想要的操作 启用可选功能
67
+ ? 启用可选功能 启用「微前端」模式
68
+ ```
69
+ 接下来,让我们注册微前端插件并修改 `modern.config.ts`,添加微前端子应用的配置 `deploy.microFrontend`:
70
+
71
+ ```javascript title="modern.config.ts"
72
+ import AppToolPlugin, { defineConfig } from '@modern-js/app-tools';
73
+ import GarfishPlugin from '@modern-js/plugin-garfish';
74
+
75
+ export default defineConfig({
76
+ runtime: {
77
+ router: true,
78
+ state: true
79
+ },
80
+ deploy: {
81
+ microFrontend: true
82
+ },
83
+ plugins: [AppToolPlugin(), GarfishPlugin()],
84
+ });
85
+ ```
86
+
87
+ ### 创建 table 子应用
88
+
89
+ 通过命令行工具初始化项目:
90
+
91
+ ```bash
92
+ mkdir table && cd table
93
+ npx @modern-js/create
94
+ ```
95
+
96
+ 按照如下选择,生成项目:
97
+
98
+ <DefaultMWAGenerate/>
99
+
100
+ 我们执行 `pnpm run new` 来开启 `微前端`:
101
+
102
+ ```bash
103
+ ? 请选择你想要的操作 启用可选功能
104
+ ? 启用可选功能 启用「微前端」模式
105
+ ```
106
+
107
+ 接下来,让我们注册微前端插件并修改 `modern.config.ts`,添加微前端子应用的配置 `deploy.microFrontend`:
108
+
109
+ ```javascript title="modern.config.ts"
110
+ import AppToolPlugin, { defineConfig } from '@modern-js/app-tools';
111
+ import GarfishPlugin from '@modern-js/plugin-garfish';
112
+
113
+ export default defineConfig({
114
+ runtime: {
115
+ router: true,
116
+ state: true
117
+ },
118
+ deploy: {
119
+ microFrontend: true
120
+ },
121
+ plugins: [AppToolPlugin(), GarfishPlugin()],
122
+ });
123
+ ```
124
+
125
+ ## 添加代码
126
+
127
+ ### main 主应用
128
+
129
+ 删除 `src/routers` 目录, 创建 `src/App.tsx`,并添加如下内容:
130
+
131
+ ```tsx
132
+ import { Link } from '@modern-js/runtime/router';
133
+ import { useModuleApps } from '@modern-js/runtime/garfish';
134
+
135
+ const App = () => {
136
+ const { DashBoard, TableList } = useModuleApps();
137
+ return (
138
+ <div>
139
+ <div>
140
+ <Link to='/dashboard'>Dashboard</Link> &nbsp;
141
+ <Link to='/table'>Table</Link>
142
+ </div>
143
+ <Route path='/dashboard'>
144
+ <DashBoard />
145
+ </Route>
146
+ <Route path='/table'>
147
+ <TableList />
148
+ </Route>
149
+ </div>
150
+ );
151
+ };
152
+
153
+ export default App;
154
+ ```
155
+
156
+ ### dashboard 子应用
157
+
158
+ 删除 `src/routers` 目录, 创建 `src/App.tsx`,并添加如下内容:
159
+
160
+ ```tsx
161
+ export default () => <div>Dashboard Page</div>;
162
+ ```
163
+
164
+ ### table 子应用
165
+
166
+ 删除 `src/routers` 目录, 创建 `src/App.tsx`,并添加如下内容:
167
+
168
+ ```tsx
169
+ export default () => <div>Table Page</div>;
170
+ ```
171
+
172
+ ## 调试
173
+
174
+ 按顺序在 `main`、 `dashboard`、 `table` 目录执行 `pnpm run dev` 命令启动应用:
175
+
176
+ - main - `http://localhost:8080`
177
+ - dashboard - `http://localhost:8081`
178
+ - table - `http://localhost:8082`
179
+
180
+ 访问主应用地址 `http://localhost:8080`,效果如下:
181
+
182
+ ![demo](https://tosv.byted.org/obj/eden-internal/ozpmyhn_lm_hymuPild/ljhwZthlaukjlkulzlp/modernjs/micro-demo.gif)
183
+
184
+ 在完成了微前端整体开发流程的体验后,你可以进一步了解如何 [开发主应用](./c03-main-app.md)
185
+
186
+
187
+ ## 常见问题
188
+
189
+ 自查手册: https://www.garfishjs.org/issues/
190
+
191
+