@modern-js/main-doc 2.0.0-beta.1 → 2.0.0-beta.2

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.
Files changed (157) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/en/docusaurus-plugin-content-docs/current/apis/app/commands/build.md +1 -1
  3. package/en/docusaurus-plugin-content-docs/current/apis/app/commands/dev.md +1 -1
  4. package/en/docusaurus-plugin-content-docs/current/apis/app/commands/lint.md +1 -1
  5. package/en/docusaurus-plugin-content-docs/current/apis/app/commands/new.md +1 -2
  6. package/en/docusaurus-plugin-content-docs/current/apis/app/commands/start.md +1 -1
  7. package/en/docusaurus-plugin-content-docs/current/apis/app/commands/test.md +1 -1
  8. package/en/docusaurus-plugin-content-docs/current/apis/app/overview.md +1 -1
  9. package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/model/auto-actions.md +1 -1
  10. package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/model/connect.md +1 -1
  11. package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/model/create-app.md +1 -1
  12. package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/model/create-store.md +1 -1
  13. package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/model/handle-effect.md +1 -1
  14. package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/model/model_.md +1 -1
  15. package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/model/use-local-model.md +1 -1
  16. package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/model/use-model.md +1 -1
  17. package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/model/use-static-model.md +1 -1
  18. package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/model/use-store.md +1 -1
  19. package/en/docusaurus-plugin-content-docs/current/components/command-tip.md +56 -0
  20. package/en/docusaurus-plugin-content-docs/current/components/reduck-tip.md +5 -0
  21. package/en/docusaurus-plugin-content-docs/current/configure/app/output/disable-css-extract.md +12 -0
  22. package/en/docusaurus-plugin-content-docs/current/configure/app/runtime/router.md +1 -1
  23. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/_category_.json +4 -0
  24. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/codesmith/_category_.json +4 -0
  25. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/codesmith/api/_category_.json +4 -0
  26. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/codesmith/api/app.md +152 -0
  27. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/codesmith/api/ejs.md +56 -0
  28. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/codesmith/api/fs.md +54 -0
  29. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/codesmith/api/git.md +49 -0
  30. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/codesmith/api/handlebars.md +58 -0
  31. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/codesmith/api/json.md +59 -0
  32. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/codesmith/api/npm.md +49 -0
  33. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/codesmith/develop.md +52 -0
  34. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/codesmith/introduce.md +46 -0
  35. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/codesmith/run-in-js.md +48 -0
  36. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/codesmith/structure.md +87 -0
  37. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/config/_category_.json +4 -0
  38. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/config/common.md +106 -0
  39. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/config/module.md +39 -0
  40. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/config/monorepo.md +28 -0
  41. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/config/mwa.md +89 -0
  42. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/_category_.json +4 -0
  43. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/abstract.md +26 -0
  44. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/_category_.json +4 -0
  45. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/file/_category_.json +4 -0
  46. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/file/addFile.md +52 -0
  47. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/file/addHelper.md +26 -0
  48. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/file/addManyFile.md +58 -0
  49. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/file/addPartial.md +26 -0
  50. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/file/introduce.md +38 -0
  51. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/file/rmDir.md +24 -0
  52. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/file/rmFile.md +24 -0
  53. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/file/updateJSONFile.md +54 -0
  54. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/file/updateModernConfig.md +26 -0
  55. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/file/updateTextRawFile.md +33 -0
  56. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/git/_category_.json +4 -0
  57. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/git/gitAddAndCommit.md +20 -0
  58. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/git/initGitRepo.md +16 -0
  59. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/git/isInGitRepo.md +16 -0
  60. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/hook/_category_.json +4 -0
  61. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/hook/afterForged.md +35 -0
  62. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/hook/onForged.md +36 -0
  63. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/info/_category_.json +4 -0
  64. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/info/isFileExit.md +22 -0
  65. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/info/locale.md +17 -0
  66. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/info/readDir.md +22 -0
  67. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/input/_category_.json +4 -0
  68. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/input/addInputAfter.md +57 -0
  69. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/input/addInputBefore.md +56 -0
  70. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/input/setInput.md +42 -0
  71. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/input/setInputValue.md +30 -0
  72. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/input/type.md +65 -0
  73. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/introduce.md +91 -0
  74. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/new/_category_.json +4 -0
  75. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/new/createElement.md +33 -0
  76. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/new/createSubProject.md +35 -0
  77. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/new/enableFunc.md +44 -0
  78. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/new/introduce.md +15 -0
  79. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/npm/_category_.json +4 -0
  80. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/npm/install.md +18 -0
  81. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/develop.md +125 -0
  82. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/use.md +61 -0
  83. package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/project.md +118 -0
  84. package/en/docusaurus-plugin-content-docs/current.json +39 -3
  85. package/package.json +3 -3
  86. package/scripts/summary.en.json +1 -1
  87. package/scripts/summary.zh.json +1 -1
  88. package/zh/apis/app/commands/new.md +0 -1
  89. package/zh/apis/app/hooks/server/test.md +2 -2
  90. package/zh/apis/app/runtime/web-server/hook.md +4 -4
  91. package/zh/apis/app/runtime/web-server/middleware.md +4 -4
  92. package/zh/configure/app/output/disable-css-extract.md +12 -0
  93. package/zh/guides/advanced-features/bff/_category_.json +5 -1
  94. package/zh/guides/advanced-features/bff/bff-proxy.md +5 -3
  95. package/zh/guides/advanced-features/bff/frameworks.md +72 -51
  96. package/zh/guides/advanced-features/bff/function.md +16 -30
  97. package/zh/guides/advanced-features/bff/index.md +20 -0
  98. package/zh/guides/advanced-features/bff/type.md +43 -0
  99. package/zh/guides/advanced-features/custom-app.md +63 -1
  100. package/zh/guides/advanced-features/web-server.md +21 -110
  101. package/zh/guides/basic-features/data-fetch.md +61 -0
  102. package/zh/guides/basic-features/env-vars.md +88 -41
  103. package/zh/guides/basic-features/routes.md +267 -0
  104. package/zh/guides/concept/entries.md +112 -0
  105. package/zh/guides/concept/lifecycle.md +10 -0
  106. package/zh/guides/get-started/quick-start.md +199 -1
  107. package/zh/guides/get-started/upgrade.md +75 -1
  108. package/zh/guides/topic-detail/generator/codesmith/api/_category_.json +4 -0
  109. package/zh/guides/topic-detail/generator/codesmith/api/app.md +152 -0
  110. package/zh/guides/topic-detail/generator/codesmith/api/ejs.md +56 -0
  111. package/zh/guides/topic-detail/generator/codesmith/api/fs.md +54 -0
  112. package/zh/guides/topic-detail/generator/codesmith/api/git.md +48 -0
  113. package/zh/guides/topic-detail/generator/codesmith/api/handlebars.md +56 -0
  114. package/zh/guides/topic-detail/generator/codesmith/api/json.md +58 -0
  115. package/zh/guides/topic-detail/generator/codesmith/api/npm.md +45 -0
  116. package/zh/guides/topic-detail/generator/codesmith/develop.md +52 -0
  117. package/zh/guides/topic-detail/generator/codesmith/introduce.md +42 -1
  118. package/zh/guides/topic-detail/generator/codesmith/run-in-js.md +48 -0
  119. package/zh/guides/topic-detail/generator/codesmith/structure.md +86 -0
  120. package/zh/guides/topic-detail/generator/config/mwa.md +4 -8
  121. package/zh/guides/topic-detail/generator/plugin/api/file/addFile.md +1 -1
  122. package/zh/guides/topic-detail/generator/plugin/api/file/addHelper.md +1 -1
  123. package/zh/guides/topic-detail/generator/plugin/api/file/addPartial.md +2 -2
  124. package/zh/guides/topic-detail/generator/plugin/api/file/introduce.md +1 -1
  125. package/zh/guides/topic-detail/generator/plugin/api/file/rmDir.md +1 -1
  126. package/zh/guides/topic-detail/generator/plugin/api/file/rmFile.md +1 -1
  127. package/zh/guides/topic-detail/generator/plugin/api/file/updateJSONFile.md +3 -2
  128. package/zh/guides/topic-detail/generator/plugin/api/file/updateModernConfig.md +2 -2
  129. package/zh/guides/topic-detail/generator/plugin/api/file/updateTextRawFile.md +1 -1
  130. package/zh/guides/topic-detail/generator/plugin/api/hook/afterForged.md +3 -3
  131. package/zh/guides/topic-detail/generator/plugin/api/hook/onForged.md +3 -3
  132. package/zh/guides/topic-detail/generator/plugin/api/input/addInputAfter.md +1 -1
  133. package/zh/guides/topic-detail/generator/plugin/api/input/addInputBefore.md +1 -1
  134. package/zh/guides/topic-detail/generator/plugin/api/input/type.md +1 -1
  135. package/zh/guides/topic-detail/generator/plugin/api/new/createElement.md +1 -1
  136. package/zh/guides/topic-detail/generator/plugin/api/new/createSubProject.md +1 -1
  137. package/zh/guides/topic-detail/generator/plugin/api/new/enableFunc.md +1 -1
  138. package/zh/guides/topic-detail/generator/plugin/api/npm/install.md +1 -1
  139. package/zh/guides/topic-detail/generator/plugin/develop.md +11 -7
  140. package/zh/guides/topic-detail/monorepo/sub-project-interface.md +0 -2
  141. package/zh/tutorials/first-app/c01-getting-started/1.1-prerequisites.md +2 -2
  142. package/zh/tutorials/first-app/c02-generator-and-studio/2.1-generator.md +0 -8
  143. package/zh/tutorials/first-app/c02-generator-and-studio/2.2-boilerplates.md +15 -7
  144. package/zh/tutorials/first-app/c07-app-entry/7.1-intro.md +1 -1
  145. package/zh/tutorials/first-app/c07-app-entry/7.2-add-entry-in-cli.md +1 -5
  146. package/zh/tutorials/first-app/c08-client-side-routing/8.2-file-based-routing.md +0 -8
  147. package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/env.md +0 -72
  148. package/zh/apis/app/runtime/env.md +0 -70
  149. package/zh/components/deploy.md +0 -60
  150. package/zh/components/dev-ide.md +0 -1
  151. package/zh/components/entry-name.md +0 -15
  152. package/zh/components/env-prepare.md +0 -1
  153. package/zh/components/launch-bff-choices.md +0 -6
  154. package/zh/guides/advanced-features/bff/bff-server.md +0 -142
  155. package/zh/guides/advanced-features/typescript.md +0 -4
  156. package/zh/guides/concept/integrated.md +0 -4
  157. package/zh/guides/concept/solutions.md +0 -4
@@ -2,3 +2,270 @@
2
2
  title: 路由
3
3
  sidebar_position: 1
4
4
  ---
5
+
6
+ Modern.js 内置了对 [React Router 6](https://reactrouter.com/en/main) 的**部分**支持,并提供了多种类型的路由模式。根据不同[入口](/docs/guides/concept/entries)类型,将路由分为三种模式,分别是**约定式路由**,**自控式路由**和**配置式路由**。
7
+
8
+ :::note
9
+ 本小节提到的路由,都是客户端路由,即 SPA 路由。
10
+ :::
11
+
12
+ ## 约定式路由
13
+
14
+ 以 `routes/` 为约定的入口,Modern.js 会自动基于文件系统,生成对应的路由结构。
15
+
16
+ Modern.js 支持了业界流行的约定路由模式:**嵌套路由**,使用嵌套路由时,页面的路由 与 UI 结构是相呼应的,我们将会详细介绍这种路由模式。
17
+
18
+ ```
19
+ /user/johnny/profile /user/johnny/posts
20
+ +------------------+ +-----------------+
21
+ | User | | User |
22
+ | +--------------+ | | +-------------+ |
23
+ | | Profile | | +------------> | | Posts | |
24
+ | | | | | | | |
25
+ | +--------------+ | | +-------------+ |
26
+ +------------------+ +-----------------+
27
+ ```
28
+
29
+ ### 路由文件约定
30
+
31
+ `routes/` 目录下有两个文件约定 `layout.[jt]sx` 和 `page.[jt]sx`(后面简写为 `.tsx`)。这两个文件决定了应用的布局层次,其中 `layout.tsx` 中作为布局组件,`page.tsx` 作为内容组件,是整个路由表的叶子节点。
32
+
33
+ 例如,这里 `routes/layout.tsx` 会作为 `/` 路由下所有组件的布局组件使用:
34
+
35
+ ```bash
36
+ .
37
+ └── routes
38
+ ├── layout.tsx
39
+ ├── page.tsx
40
+ └── user
41
+ ├── layout.tsx
42
+ └── page.tsx
43
+ ```
44
+
45
+ 当路由为 `/` 时,会有以下 UI 布局:
46
+
47
+ ```tsx
48
+ <Layout>
49
+ <Page />
50
+ </Layout>
51
+ ```
52
+
53
+ 同样,`routes/user/layout.tsx` 会作为 `/user` 路由下所有组件的布局组件使用。当路由为 `/user` 时, 会有以下 UI 布局:
54
+
55
+ ```tsx
56
+ <Layout>
57
+ <UserLayout>
58
+ <UserPage>
59
+ <UserLayout>
60
+ </Layout>
61
+ ```
62
+
63
+ #### Layout
64
+
65
+ `<Layout>` 组件是指 `routes/` 目录下所有 `layout.tsx` 文件,它们表示对应路由片段的布局,使用 `<Outlet>` 表示子组件。
66
+
67
+ :::note
68
+ `<Outlet>` 是 React Router 6 中新的 API,详情可以查看 [Outlet](https://reactrouter.com/en/main/components/outlet#outlet).
69
+ :::
70
+
71
+ 为了方便介绍 `<Layout>` 与 `<Outlet>` 的关系,以下面的文件目录举例:
72
+
73
+ ```bash
74
+ .
75
+ └── routes
76
+ ├── blog
77
+ │   └── page.tsx
78
+ ├── layout.tsx
79
+ ├── page.tsx
80
+ └── user
81
+ ├── layout.tsx
82
+ └── page.tsx
83
+ ```
84
+
85
+ 1. 当路由为 `/` 时,`routes/layout.tsx` 中的 `<Outlet>` 代表的是 `routes/page.tsx` 中导出的组件,生成以下 UI 结构:
86
+
87
+ ```tsx
88
+ <Layout>
89
+ <Page />
90
+ </Layout>
91
+ ```
92
+
93
+ 2. 当路由为 `/blog` 时,`routes/layout.tsx` 中的 `<Outlet>` 代表的是 `routes/blog/page.tsx` 中导出的组件,生成以下 UI 结构:
94
+ ```tsx
95
+ <Layout>
96
+ <BlogPage />
97
+ </Layout>
98
+ ```
99
+
100
+ 3. 当路由为 `/user` 时,`routes/layout.tsx` 中的 `<Outlet>` 代表的是 `routes/user/layout.tsx` 中导出的组件。`routes/user/layout.tsx` 中的 `<Outlet>` 代表的是 `routes/user/page.tsx` 中导出的组件。生成以下 UI 结构:
101
+
102
+ ```tsx
103
+ <Layout>
104
+ <UserLayout>
105
+ <UserPage>
106
+ <UserLayout>
107
+ </Layout>
108
+ ```
109
+
110
+ 总结而言,如果子路由的文件目录下存在 `layout.tsx`,上一级 `layout.tsx` 中的 `<Outlet>` 即为子路由文件目录下的 `layout.tsx` ,否则为子路由文件目录下的 `page.tsx`。
111
+
112
+ #### Page
113
+
114
+ 所有的路由,理论上都应该由 `<Page>` 组件结束。在 `page.tsx` 文件内,如果开发者引入 `<Outlet>` 组件,不会有任何效果。
115
+
116
+ ### 动态路由
117
+
118
+ 通过 `[]` 命名的文件目录,生成的路由会作为动态路由。例如以下文件目录:
119
+
120
+ ```
121
+ └── routes
122
+ ├── [id]
123
+ │   └── page.tsx
124
+ ├── blog
125
+ │   └── page.tsx
126
+ └── page.tsx
127
+ ```
128
+
129
+ `routes/[id]/page.tsx` 文件会转为 `/:id` 路由。除了可以确切匹配的 `/blog` 路由,其他所有 `/xxx` 都会匹配到该路由。
130
+
131
+ 在组件中,可以通过 [useParams](/docs/apis/app/runtime/router/#useparams) 获取对应命名的参数。
132
+
133
+ ### 无路径布局
134
+
135
+ 当目录名以 __ 开头时,对应的目录名不会转换为实际的路由路径,例如以下文件目录:
136
+
137
+ ```
138
+ .
139
+ └── routes
140
+ ├── __auth
141
+ │ ├── layout.tsx
142
+ │ ├── login
143
+ │ │ └── page.tsx
144
+ │ └── signup
145
+ │ └── page.tsx
146
+ ├── layout.tsx
147
+ └── page.tsx
148
+ ```
149
+
150
+ Modern.js 会生成 `/login` 和 `/sign` 两条路由,`__auth/layout.tsx` 组件会作为 `login/page.tsx` 和 `signup/page.tsx` 的布局组件,但__auth 不会作为路由路径片段。
151
+
152
+ 当需要为某些类型的路由,做独立的布局,或是想要将路由做归类时,这一功能非常有用。
153
+
154
+ ### 无布局路径
155
+
156
+ 有些情况下,项目需要较为复杂的路由,但这些路由又不存在独立的 UI 布局,如果像普通文件目录那边创建路由会导致目录层级较深。
157
+
158
+ 因此 Modern.js 支持了通过 `.` 来分割路由片段,代替文件目录。例如,当需要 `/user/profile/2022/edit` 时,可以直接创建如下文件:
159
+
160
+ ```
161
+ └── routes
162
+ ├── user.profile.[id].edit
163
+ │ └── page.tsx
164
+ ├── layout.tsx
165
+ └── page.tsx
166
+ ```
167
+
168
+ 访问路由时,将得到如下 UI 布局:
169
+
170
+ ```tsx
171
+ <RootLayout>
172
+ <UserProfileEdit /> // routes/user.profile.[id].edit/page.tsx
173
+ </RootLayout>
174
+ ```
175
+
176
+ ### Loading
177
+
178
+ `routes/` 下每一层目录中,开发者可以创建 `loading.tsx` 文件,默认导出一个 `<Loading>` 组件。
179
+
180
+ 当路由目录下存在该组件时,这一级子路由下所有的路由切换时,都会以该 `<Loading>` 组件作为 JS Chunk 加载时的 Fallback UI。当该目录下未定义 `layout.tsx` 文件时,`<Loading>` 组件不会生效。例如以下文件目录:
181
+
182
+ ```bash
183
+ .
184
+ └── routes
185
+ ├── blog
186
+ │   ├── [id]
187
+ │   │   └── page.tsx
188
+ │   └── page.tsx
189
+ ├── layout.tsx
190
+ ├── loading.tsx
191
+ └── page.tsx
192
+ ```
193
+
194
+ 当路由从 `/` 跳转到 `/blog` 时,如果 `<Blog>` 组件的 JS Chunk 还未加载,则会先展示 `loading.tsx` 中导出的组件 UI。但从 `/blog` 跳转到 `/blog/20220101` 时,则不会展示。
195
+
196
+ ### 错误处理
197
+
198
+ `routes/` 下每一层目录中,开发者同样可以定义一个 `error.tsx` 文件,默认导出一个 `<ErrorBoundary>` 组件。
199
+
200
+ 当有路由目录下存在该组件时,组件渲染出错会被 ErrorBoundary 组件捕获。当目录未定义 `layout.tsx` 文件时,`<ErrorBoundary>` 组件不会生效。
201
+
202
+ `<ErrorBoundary>` 可以返回出错时的 UI 视图,当前层级未声明 `<ErrorBoundary>` 组件时,错误会向上冒泡到更上层的组件,直到被捕获或抛出错误。同时,当组件出错时,只会影响捕获到该错误的路由组件及子组件,其他组件的状态和视图不受影响,可以继续交互。
203
+
204
+ <!-- Todo API 路由-->
205
+ 在 `<ErrorBoundary>` 组件内,可以使用 [useRouteError](/docs/apis/app/runtime/router/#useparams) 获取的错误的具体信息:
206
+
207
+ ```tsx
208
+ import { useRouteError } from '@modern-js/runtime/router';
209
+ export default const ErrorBoundary = () => {
210
+ const error = useRouteError();
211
+ return (
212
+ <div>
213
+ <h1>{error.status}</h1>
214
+ <h2>{error.message}</h2>
215
+ </div>
216
+ )
217
+ }
218
+ ```
219
+
220
+ ## 自控式路由
221
+
222
+ 以 `routes/` 为约定的入口,Modern.js 不会多路由做额外的操作,开发者可以自行使用 React Router 6 的 API 进行开发。
223
+
224
+ 例如:
225
+
226
+ ```tsx
227
+ import {
228
+ Route,
229
+ Routes,
230
+ BrowserRouter,
231
+ Outlet,
232
+ } from '@modern-js/runtime/router';
233
+
234
+ export default () => {
235
+ return (
236
+ <div>
237
+ <BrowserRouter>
238
+ <Routes>
239
+ <Route index element={<div>index</div>} />
240
+ <Route
241
+ path="user"
242
+ element={
243
+ <div>
244
+ User Layout
245
+ <Outlet />
246
+ </div>
247
+ }
248
+ >
249
+ <Route index element={<div>user</div>} />
250
+ <Route path="profile" element={<div>profile</div>} />
251
+ </Route>
252
+ <Route path="about" element={<div>about</div>} />
253
+ </Routes>
254
+ </BrowserRouter>
255
+ </div>
256
+ );
257
+ };
258
+ ```
259
+
260
+ :::note
261
+ 在自控式路由下,开发者如果希望在 SSR 中使用 React Router 6 中 [Loader API](https://reactrouter.com/en/main/hooks/use-loader-data#useloaderdata) 的能力会相对复杂,推荐直接使用约定式路由。Modern.js 已经为你封装好了一切。
262
+
263
+ <!-- Todo 嵌套路由带来的优化可以补充下文档-->
264
+ 如果项目只想升级到 React Router 6,而不希望使用嵌套路由带来的优化,那[useLoader](/docs/apis/app/runtime/core/use-loader) 在 SSR 下仍然可以工作。
265
+ :::
266
+
267
+ ## 配置式路由
268
+
269
+ :::note
270
+ 敬请期待
271
+ :::
@@ -2,3 +2,115 @@
2
2
  title: 入口
3
3
  sidebar_position: 2
4
4
  ---
5
+
6
+ 入口是 Modern.js 默认的文件约定,项目的每一个入口是一张独立的页面,对应一条服务端路由。
7
+
8
+ 很多配置,如 HTML 模板、Meta 信息、是否开启 SSR、SSG、服务端路由规则都是以入口为维度划分的。
9
+
10
+ ## 单入口与多入口
11
+
12
+ Modern.js 初始化的项目是单入口的,项目结构如下:
13
+
14
+ ```
15
+ .
16
+ ├── node_modules
17
+ ├── src
18
+ │   ├── modern-app-env.d.ts
19
+ │   └── routes
20
+ │   ├── index.css
21
+ │   ├── layout.tsx
22
+ │   └── page.tsx
23
+ ├── package.json
24
+ ├── modern.config.ts
25
+ ├── pnpm-lock.yaml
26
+ ├── README.md
27
+ └── tsconfig.json
28
+ ```
29
+
30
+ Modern.js 可以很方便的将单入口切换成多入口。可以在项目下执行 `pnpm run new`,通过生成器创建入口:
31
+
32
+ ```bash
33
+ ? 请选择你想要的操作: 创建工程元素
34
+ ? 创建工程元素: 新建「应用入口」
35
+ ? 请填写入口名称: new-entry
36
+ ```
37
+
38
+ 执行后,`src/` 目录将会变成如下结构:
39
+
40
+ ```
41
+ .
42
+ ├── modern-app-env.d.ts
43
+ ├── myapp
44
+ │   └── routes
45
+ │   ├── index.css
46
+ │   ├── layout.tsx
47
+ │   └── page.tsx
48
+ └── new-entry
49
+ └── routes
50
+ ├── index.css
51
+ ├── layout.tsx
52
+ └── page.tsx
53
+ ```
54
+
55
+ 原本的代码被移动到了和 `package.json` 中 `name` 同名的目录下,并创建了新的目录。
56
+
57
+ 执行 `pnpm run dev` 后,可以看到新增一条 `/new-entry` 的路由,并且被迁移的代码路由并未发生变化。
58
+
59
+ :::note
60
+ Modern.js 会将和 `package.json` 中 `name` 同名的目录作为主入口,默认路由为 `/`,其他入口默认路由为 `/{entryName}`。
61
+ :::
62
+
63
+ ## 入口条件
64
+
65
+ 默认情况下,Modern.js 启动项目前会对 `src/` 下的文件进行扫描,识别入口,并生成对应的服务端路由。
66
+
67
+ :::tip
68
+ 可以通过 [source.entriesDir](/docs/configure/app/source/entries-dir) 更改入口目录为其他目录。
69
+ :::
70
+
71
+ 并非 `src/` 下所有的一级目录都会成为项目入口, 入口所在目录必须满足以下四个条件之一:
72
+
73
+ 1. 具有 `routes/` 目录
74
+ 2. 具有 `App.[jt]sx?` 文件
75
+ 3. 具有 `index.[jt]sx?` 文件
76
+ 2. 具有 `pages/` 目录(兼容旧版本)
77
+
78
+ 当 `src/` 目录满足入口特征时,Modern.js 会认为当前项目为单入口应用。
79
+
80
+ :::tip
81
+ 单入口默认的入口名为 `main`。
82
+ :::
83
+
84
+ 当项目不是单入口应用时,Modern.js 会进一步查看 `src/` 下的一级目录。
85
+
86
+ ## 入口的区别
87
+
88
+ 不同约定的入口具有不同的行为。
89
+
90
+ ### routes 入口
91
+
92
+ 如果入口为 `routes/` 约定,Modern.js 会在启动时扫描 `routes` 下的文件,基于文件约定,自动生成客户端路由(react-router)。
93
+
94
+ 详细内容可以参考[路由](/docs/guides/basic-features/routes).
95
+
96
+ ### App 入口
97
+
98
+ 如果入口为 `App.[jt]sx?` 约定,开发者可以在这个文件中自由的设置客户端路由,或者不设置客户端路由。
99
+
100
+ 详细内容可以参考[路由](/docs/guides/basic-features/routes).
101
+
102
+ ### Index 入口
103
+
104
+ 通常情况下,上面两种模式已经能满足需求,但当开发者需要自己接管 React 挂载逻辑,或完全接管 Webpack 入口时,可以使用 `index.[jt]sx?` 约定。
105
+
106
+ 如果入口为 `index.[jt]sx?` 约定,Modern.js 会根据该文件是否存在默认的组件导出,来决定构建行为。
107
+
108
+ 详细内容可以参考[自定义 App](/docs/guides/advanced-features/custom-app).
109
+
110
+ ## 配置入口
111
+
112
+ 在 Modern.js 中,除了使用文件约定生成入口外,还可以在 `modern.config.[jt]s` 中手动配置入口。
113
+
114
+ :::tip
115
+ 详情可以查看 [source.entries](/docs/configure/app/source/entries).
116
+ :::
@@ -2,3 +2,13 @@
2
2
  title: 生命周期
3
3
  sidebar_position: 1
4
4
  ---
5
+
6
+ Modern.js 应用具有完整的生命周期,包括 CLI、Server Side 和 Runtime 三个阶段。
7
+
8
+ 目前 Modern.js 大致的生命周期如下:
9
+
10
+ :::note
11
+ 其中粉色框的矩形代表 Modern.js 提供的插件钩子,淡黄色底色椭圆代表与下一个阶段的连接点。
12
+ :::
13
+
14
+ ![lifecycle](https://lf3-static.bytednsdoc.com/obj/eden-cn/nuvjhpqnuvr/modern-website/life-cycle.svg)
@@ -1,4 +1,202 @@
1
1
  ---
2
2
  title: 快速上手
3
- sidebar_position: 2
3
+ sidebar_position: 1
4
4
  ---
5
+
6
+ ## 环境准备
7
+
8
+ ### Node.js
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
+ :::
27
+
28
+ ## 安装
29
+
30
+ Modern.js 提供了 `@modern-js/create` 生成器来创建项目,不要全局安装,使用 `npx` 按需运行。
31
+
32
+ 可以使用已有的空目录来创建项目:
33
+
34
+ ```bash
35
+ mkdir myapp && cd myapp
36
+ npx @modern-js/create
37
+ ```
38
+
39
+ 也可以直接用新目录创建项目:
40
+
41
+ ```bash
42
+ npx @modern-js/create myapp
43
+ ```
44
+
45
+ ## 初始化项目
46
+
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
+
73
+ 现在,项目结构如下:
74
+
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
+ ```
90
+
91
+ ## 启动项目
92
+
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/`,能看到以下内容:
111
+
112
+ ![dev](https://lf3-static.bytednsdoc.com/obj/eden-cn/nuvjhpqnuvr/modern-website/dev.png)
113
+
114
+ ## 使用配置
115
+
116
+ 通过生成器创建的 Modern.js 项目中,存在 `modern.config.ts` 文件。
117
+
118
+ 可以通过配置文件来开启功能,或覆盖 Modern.js 的默认行为。例如添加如下配置,开启 SSR:
119
+
120
+ ```ts
121
+ import { defineConfig } from '@modern-js/app-tools';
122
+
123
+ // https://modernjs.dev/docs/apis/app/config
124
+ export default defineConfig({
125
+ runtime: {
126
+ router: true,
127
+ state: true,
128
+ },
129
+ server: {
130
+ ssr: true,
131
+ },
132
+ });
133
+ ```
134
+
135
+ 重新执行 `pnpm run dev`,在浏览器 Network 菜单中,可以发现项目已经在服务端完成了页面渲染。
136
+
137
+ ## 构建项目
138
+
139
+ 在项目中执行 `pnpm run build` 即可构建项目生产环境产物:
140
+
141
+ ```bash
142
+ $ pnpm run build
143
+
144
+ > modern build
145
+
146
+ info Create a production build...
147
+
148
+ info File sizes after production build:
149
+
150
+ File Size Gzipped
151
+ dist/static/js/lib-corejs.ffeb7fb8.js 214.96 kB 67.23 kB
152
+ dist/static/js/lib-react.09721b5c.js 152.61 kB 49.02 kB
153
+ dist/static/js/218.102e2f39.js 85.45 kB 28.5 kB
154
+ dist/static/js/lib-babel.a7bba875.js 11.93 kB 3.95 kB
155
+ dist/html/main/index.html 5.84 kB 2.57 kB
156
+ dist/static/js/main.3568a38e.js 3.57 kB 1.44 kB
157
+ dist/static/css/async/304.c3c481a5.css 2.62 kB 874 B
158
+ dist/asset-manifest.json 1.48 kB 349 B
159
+ dist/static/js/async/304.c45706bc.js 1.4 kB 575 B
160
+ dist/static/js/async/509.fcb06e14.js 283 B 230 B
161
+
162
+ Client ✔ done in 3.57s
163
+ ```
164
+
165
+ 构建产物默认生成到 `dist/`,目录结构如下:
166
+
167
+ ```
168
+ .
169
+ ├── asset-manifest.json
170
+ ├── html
171
+ │   └── main
172
+ ├── loader-routes
173
+ │   └── main
174
+ ├── modern.config.json
175
+ ├── route.json
176
+ └── static
177
+ ├── css
178
+ └── js
179
+ ```
180
+
181
+ ## 本地验证
182
+
183
+ 在项目中执行 `pnpm run start` 即可在本地验证构建产物是否正常运行:
184
+
185
+ ```bash
186
+ $ pnpm run start
187
+
188
+ > modern start
189
+
190
+ Starting the modern server...
191
+ info App running at:
192
+
193
+ > Local: http://localhost:8080/
194
+ > Network: http://10.94.58.87:8080/
195
+ > Network: http://10.254.68.105:8080/
196
+ ```
197
+
198
+ 在浏览器中打开 `http://localhost:8000/`,内容应该和 `pnpm run dev` 时一致。
199
+
200
+ ## 部署
201
+
202
+ 本地验证完成后,可以将 `dist/` 下的产物整理成服务器需要的结构,进行部署。
@@ -1,4 +1,78 @@
1
1
  ---
2
2
  title: 升级
3
- sidebar_position: 3
3
+ sidebar_position: 2
4
4
  ---
5
+
6
+ ## 通过命令行升级
7
+
8
+ Modern.js 提供了 `upgrade` 命令支持项目升级到最新的 Modern.js 版本。
9
+
10
+ 在项目中执行 `pnpm run upgrade`:
11
+
12
+ ```bash
13
+ $ pnpm run upgrade
14
+
15
+ > modern upgrade
16
+
17
+ [INFO] [项目类型]: 应用
18
+ [INFO] [Modern.js 最新版本]: 2.0.0
19
+ [INFO] [当前项目 Modern.js 依赖已经为最新版本]: 2.0.0
20
+ ```
21
+
22
+ 可以看到项目 `package.json` 中的依赖已经更改到最新,执行 `pnpm install` 重新安装即可。
23
+
24
+ ## 指定版本升级
25
+
26
+ Modern.js 所有的官方包目前都使用统一版本号进行发布。
27
+
28
+ 根据官网 Release Note,开发者也可以手动将项目升级到想要的版本。
29
+
30
+ :::tip
31
+ 对所有 Modern.js 官方提供的包做统一升级,而不是升级单个依赖。
32
+ :::
33
+
34
+ ## 锁定子依赖
35
+
36
+ 当项目某个子依赖出现问题,而 Modern.js 无法立即更新时,可以使用包管理器锁定子依赖版本。
37
+
38
+ ### Pnpm
39
+
40
+ 对于使用 Pnpm 的项目,请在**项目根目录**的 `package.json` 中添加以下配置,然后重新执行 `pnpm i`:
41
+
42
+ ```json
43
+ {
44
+ "pnpm": {
45
+ "overrides": {
46
+ "package-name": "^1.0.0"
47
+ }
48
+ }
49
+ }
50
+ ```
51
+
52
+ ### Yarn
53
+
54
+ 对于使用 Yarn 的项目,请在**项目根目录**的 `package.json` 中添加以下配置,然后重新执行 `yarn i`:
55
+
56
+ ```json
57
+ {
58
+ "resolutions": {
59
+ "package-name": "^1.0.0"
60
+ }
61
+ }
62
+ ```
63
+
64
+ ### Npm
65
+
66
+ 对于使用 Npm 的项目,请在**项目根目录**的 `package.json` 中添加以下配置,然后重新执行 `npm i`:
67
+
68
+ ```json
69
+ {
70
+ "overrides": {
71
+ "package-name": "^1.0.0"
72
+ }
73
+ }
74
+ ```
75
+
76
+ :::info
77
+ 对于 Monorepo 仓库,只能在项目根目录的 `package.json` 中锁定依赖版本,并且会影响 Monorepo 中的所有 package。
78
+ :::
@@ -0,0 +1,4 @@
1
+ {
2
+ "label": "API",
3
+ "position": 5
4
+ }