@modern-js/main-doc 2.58.2 → 2.59.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (140) hide show
  1. package/docs/en/apis/app/runtime/core/use-loader.mdx +1 -1
  2. package/docs/en/community/blog/_meta.json +1 -6
  3. package/docs/en/components/deploy.mdx +1 -1
  4. package/docs/en/components/init-app.mdx +0 -1
  5. package/docs/en/components/init-rspack-app.mdx +0 -1
  6. package/docs/en/components/ssr-monitor.mdx +3 -0
  7. package/docs/en/configure/_meta.json +1 -1
  8. package/docs/en/configure/app/output/ssg.mdx +52 -141
  9. package/docs/en/configure/app/tools/swc.mdx +1 -1
  10. package/docs/en/configure/app/tools/tailwindcss.mdx +1 -1
  11. package/docs/en/guides/advanced-features/_meta.json +0 -8
  12. package/docs/en/guides/advanced-features/bff/_meta.json +1 -6
  13. package/docs/en/guides/advanced-features/rsbuild-plugin.mdx +2 -2
  14. package/docs/en/guides/advanced-features/rspack-start.mdx +7 -22
  15. package/docs/en/guides/basic-features/_meta.json +31 -9
  16. package/docs/en/guides/basic-features/css/_meta.json +1 -0
  17. package/docs/en/guides/basic-features/css/css-in-js.mdx +34 -0
  18. package/docs/en/guides/basic-features/{css-modules.mdx → css/css-modules.mdx} +0 -4
  19. package/docs/en/guides/basic-features/css/css.mdx +25 -0
  20. package/docs/en/guides/basic-features/{css.mdx → css/tailwindcss.mdx} +5 -66
  21. package/docs/en/guides/basic-features/data/_meta.json +1 -4
  22. package/docs/en/guides/basic-features/data/data-fetch.mdx +134 -235
  23. package/docs/en/guides/basic-features/data/data-write.mdx +66 -77
  24. package/docs/en/guides/basic-features/debug/_meta.json +1 -0
  25. package/docs/en/guides/basic-features/debug/rsdoctor.mdx +57 -0
  26. package/docs/en/guides/{advanced-features → basic-features/debug}/using-storybook.mdx +2 -0
  27. package/docs/en/guides/basic-features/render/_meta.json +1 -0
  28. package/docs/en/guides/basic-features/render/ssg.mdx +208 -0
  29. package/docs/en/guides/{advanced-features/ssr/cache.mdx → basic-features/render/ssr-cache.mdx} +38 -50
  30. package/docs/en/guides/basic-features/render/ssr.mdx +301 -0
  31. package/docs/en/guides/basic-features/render/streaming-ssr.mdx +230 -0
  32. package/docs/en/guides/basic-features/routes.mdx +275 -263
  33. package/docs/en/guides/basic-features/static-assets/_meta.json +1 -0
  34. package/docs/en/guides/basic-features/static-assets.mdx +1 -1
  35. package/docs/en/guides/basic-features/testing/_meta.json +1 -0
  36. package/docs/en/guides/basic-features/testing/cypress.mdx +95 -0
  37. package/docs/en/guides/basic-features/testing/jest.mdx +148 -0
  38. package/docs/en/guides/basic-features/testing/playwright.mdx +111 -0
  39. package/docs/en/guides/basic-features/testing/vitest.mdx +100 -0
  40. package/docs/en/guides/concept/_meta.json +1 -4
  41. package/docs/en/guides/concept/entries.mdx +78 -47
  42. package/docs/en/guides/get-started/_meta.json +1 -7
  43. package/docs/en/guides/get-started/introduction.mdx +1 -1
  44. package/docs/en/guides/get-started/quick-start.mdx +1 -2
  45. package/docs/en/guides/get-started/tech-stack.mdx +4 -6
  46. package/docs/en/guides/get-started/upgrade.mdx +16 -2
  47. package/docs/en/guides/topic-detail/framework-plugin/_meta.json +1 -1
  48. package/docs/en/guides/topic-detail/generator/_meta.json +1 -1
  49. package/docs/en/guides/topic-detail/generator/create/_meta.json +1 -5
  50. package/docs/en/guides/topic-detail/generator/create/config.mdx +0 -10
  51. package/docs/en/guides/topic-detail/generator/create/use.mdx +0 -1
  52. package/docs/en/guides/topic-detail/generator/new/_meta.json +1 -5
  53. package/docs/en/guides/topic-detail/generator/plugin/_meta.json +1 -1
  54. package/docs/en/guides/troubleshooting/_meta.json +1 -6
  55. package/docs/en/tutorials/first-app/c03-css.mdx +1 -1
  56. package/docs/zh/apis/app/runtime/core/use-loader.mdx +1 -1
  57. package/docs/zh/community/blog/_meta.json +1 -6
  58. package/docs/zh/components/deploy.mdx +1 -1
  59. package/docs/zh/components/init-app.mdx +0 -1
  60. package/docs/zh/components/init-rspack-app.mdx +0 -1
  61. package/docs/zh/components/ssr-monitor.mdx +3 -0
  62. package/docs/zh/configure/_meta.json +1 -1
  63. package/docs/zh/configure/app/output/ssg.mdx +49 -139
  64. package/docs/zh/configure/app/tools/swc.mdx +1 -1
  65. package/docs/zh/configure/app/tools/tailwindcss.mdx +1 -1
  66. package/docs/zh/guides/advanced-features/_meta.json +0 -8
  67. package/docs/zh/guides/advanced-features/bff/_meta.json +1 -6
  68. package/docs/zh/guides/advanced-features/rsbuild-plugin.mdx +2 -2
  69. package/docs/zh/guides/advanced-features/rspack-start.mdx +8 -24
  70. package/docs/zh/guides/basic-features/_meta.json +31 -9
  71. package/docs/zh/guides/basic-features/css/_meta.json +1 -0
  72. package/docs/zh/guides/basic-features/css/css-in-js.mdx +34 -0
  73. package/docs/zh/guides/basic-features/css/css.mdx +25 -0
  74. package/docs/zh/guides/basic-features/{css.mdx → css/tailwindcss.mdx} +3 -64
  75. package/docs/zh/guides/basic-features/data/_meta.json +1 -4
  76. package/docs/zh/guides/basic-features/data/data-fetch.mdx +98 -214
  77. package/docs/zh/guides/basic-features/data/data-write.mdx +54 -55
  78. package/docs/zh/guides/basic-features/debug/_meta.json +1 -0
  79. package/docs/zh/guides/basic-features/debug/rsdoctor.mdx +57 -0
  80. package/docs/zh/guides/{advanced-features → basic-features/debug}/using-storybook.mdx +1 -1
  81. package/docs/zh/guides/basic-features/render/_meta.json +1 -0
  82. package/docs/zh/guides/basic-features/render/ssg.mdx +210 -0
  83. package/docs/zh/guides/{advanced-features/ssr/cache.mdx → basic-features/render/ssr-cache.mdx} +16 -26
  84. package/docs/zh/guides/basic-features/render/ssr.mdx +309 -0
  85. package/docs/zh/guides/{advanced-features/ssr/stream.mdx → basic-features/render/streaming-ssr.mdx} +22 -37
  86. package/docs/zh/guides/basic-features/routes.mdx +252 -237
  87. package/docs/zh/guides/basic-features/static-assets/_meta.json +1 -0
  88. package/docs/zh/guides/basic-features/static-assets.mdx +2 -6
  89. package/docs/zh/guides/basic-features/testing/_meta.json +1 -0
  90. package/docs/zh/guides/basic-features/testing/cypress.mdx +95 -0
  91. package/docs/zh/guides/basic-features/testing/jest.mdx +148 -0
  92. package/docs/zh/guides/basic-features/testing/playwright.mdx +112 -0
  93. package/docs/zh/guides/basic-features/testing/vitest.mdx +100 -0
  94. package/docs/zh/guides/concept/_meta.json +1 -4
  95. package/docs/zh/guides/concept/entries.mdx +80 -58
  96. package/docs/zh/guides/get-started/_meta.json +1 -7
  97. package/docs/zh/guides/get-started/introduction.mdx +2 -2
  98. package/docs/zh/guides/get-started/quick-start.mdx +1 -2
  99. package/docs/zh/guides/get-started/tech-stack.mdx +8 -10
  100. package/docs/zh/guides/get-started/upgrade.mdx +15 -1
  101. package/docs/zh/guides/topic-detail/framework-plugin/_meta.json +1 -1
  102. package/docs/zh/guides/topic-detail/generator/_meta.json +1 -1
  103. package/docs/zh/guides/topic-detail/generator/create/_meta.json +1 -5
  104. package/docs/zh/guides/topic-detail/generator/create/config.mdx +0 -10
  105. package/docs/zh/guides/topic-detail/generator/create/use.mdx +0 -1
  106. package/docs/zh/guides/topic-detail/generator/new/_meta.json +1 -5
  107. package/docs/zh/guides/topic-detail/generator/plugin/_meta.json +1 -1
  108. package/docs/zh/guides/troubleshooting/_meta.json +1 -6
  109. package/docs/zh/tutorials/first-app/c03-css.mdx +1 -1
  110. package/i18n.json +16 -4
  111. package/package.json +6 -6
  112. package/rspress.config.ts +1 -1
  113. package/src/components/ContentCard/index.tsx +1 -1
  114. package/src/components/Sandpack/index.tsx +1 -1
  115. package/src/components/ShowcaseList/index.tsx +1 -1
  116. package/src/i18n/index.ts +1 -1
  117. package/src/pages/index.tsx +2 -2
  118. package/docs/en/apis/app/hooks/config/storybook.mdx +0 -37
  119. package/docs/en/guides/advanced-features/ssg.mdx +0 -116
  120. package/docs/en/guides/advanced-features/ssr/_meta.json +0 -5
  121. package/docs/en/guides/advanced-features/ssr/index.mdx +0 -23
  122. package/docs/en/guides/advanced-features/ssr/stream.mdx +0 -248
  123. package/docs/en/guides/advanced-features/ssr/usage.mdx +0 -341
  124. package/docs/en/guides/advanced-features/ssr.mdx +0 -555
  125. package/docs/zh/apis/app/hooks/config/storybook.mdx +0 -38
  126. package/docs/zh/guides/advanced-features/ssg.mdx +0 -116
  127. package/docs/zh/guides/advanced-features/ssr/_meta.json +0 -5
  128. package/docs/zh/guides/advanced-features/ssr/index.mdx +0 -23
  129. package/docs/zh/guides/advanced-features/ssr/usage.mdx +0 -329
  130. /package/docs/en/guides/basic-features/{mock.mdx → debug/mock.mdx} +0 -0
  131. /package/docs/en/guides/basic-features/{proxy.mdx → debug/proxy.mdx} +0 -0
  132. /package/docs/en/guides/basic-features/{json-files.mdx → static-assets/json-files.mdx} +0 -0
  133. /package/docs/en/guides/basic-features/{svg-assets.mdx → static-assets/svg-assets.mdx} +0 -0
  134. /package/docs/en/guides/basic-features/{wasm-assets.mdx → static-assets/wasm-assets.mdx} +0 -0
  135. /package/docs/zh/guides/basic-features/{css-modules.mdx → css/css-modules.mdx} +0 -0
  136. /package/docs/zh/guides/basic-features/{mock.mdx → debug/mock.mdx} +0 -0
  137. /package/docs/zh/guides/basic-features/{proxy.mdx → debug/proxy.mdx} +0 -0
  138. /package/docs/zh/guides/basic-features/{json-files.mdx → static-assets/json-files.mdx} +0 -0
  139. /package/docs/zh/guides/basic-features/{svg-assets.mdx → static-assets/svg-assets.mdx} +0 -0
  140. /package/docs/zh/guides/basic-features/{wasm-assets.mdx → static-assets/wasm-assets.mdx} +0 -0
@@ -10,13 +10,13 @@ sidebar_position: 1
10
10
 
11
11
  **入口(Entry)指的是一个页面的起始模块。**
12
12
 
13
- 在 Modern.js 项目中,每一个入口对应一个独立的页面,也对应一条服务端路由。默认情况下,Modern.js 会基于目录约定来自动确定页面的入口,同时也支持通过配置项来自定义入口。
13
+ 在 Modern.js 应用中,每一个入口对应一个独立的页面,也对应一条服务端路由。默认情况下,Modern.js 会基于目录约定来自动确定页面的入口,同时也支持通过配置项来自定义入口。
14
14
 
15
15
  Modern.js 提供的很多配置项都是以入口为维度进行划分的,比如页面标题、HTML 模板、页面 Meta 信息、是否开启 SSR/SSG、服务端路由规则等。
16
16
 
17
17
  ## 单入口与多入口
18
18
 
19
- Modern.js 初始化的项目是单入口的(SPA),项目结构如下:
19
+ Modern.js 初始化的应用是单入口的,应用结构如下:
20
20
 
21
21
  ```
22
22
  .
@@ -30,7 +30,7 @@ Modern.js 初始化的项目是单入口的(SPA),项目结构如下:
30
30
  └── tsconfig.json
31
31
  ```
32
32
 
33
- 在 Modern.js 项目中,你可以很方便的将单入口切换成多入口,直接在项目下执行 `pnpm run new`,根据提示创建入口即可:
33
+ 在 Modern.js 应用中,你可以很方便的将单入口切换成多入口。在应用目录下执行 `pnpm run new`,根据提示即可创建入口:
34
34
 
35
35
  ```bash
36
36
  ? 请选择你想要的操作 创建工程元素
@@ -56,13 +56,12 @@ Modern.js 初始化的项目是单入口的(SPA),项目结构如下:
56
56
 
57
57
  原本的入口代码被移动到了和 `package.json` 中 `name` 同名的目录下,并创建了 `new-entry` 入口目录。
58
58
 
59
- 你可以执行 `pnpm run dev` 启动开发服务,此时可以看到新增了一条名为 `/new-entry` 的路由,并且原有页面的路由并未发生变化。
60
-
61
- :::tip
62
- Modern.js 会将与 `package.json` 文件中 `name` 字段同名的入口作为主入口,主入口的路由为 `/`,其他入口的路由为 `/{entryName}`。
59
+ Modern.js 会将与 `package.json` 文件中 `name` 字段同名的入口作为主入口,主入口的路由为 `/`,其他入口的路由为 `/{entryName}`。比如,`package.json` 中的 `name` 为 `myapp` 时,`src/myapp` 会作为应用的主入口。
63
60
 
64
- 比如,`package.json` 中的 `name` `myapp` 时,`src/myapp` 会作为项目的主入口。
61
+ 你可以执行 `pnpm run dev` 启动开发服务,此时可以看到新增了一条名为 `/new-entry` 的路由,并且原有页面的路由并未发生变化。
65
62
 
63
+ :::note
64
+ **单入口/多入口** 和 **SPA/MPA** 的概念并不等价。前者是关于如何配置和打包应用,而后者是组织前端应用的模式,每个入口都可以是 SPA 或非 SPA 的。
66
65
  :::
67
66
 
68
67
  ## 入口类型
@@ -73,39 +72,32 @@ import EntryMode from '@site-docs/components/entry-mode.mdx';
73
72
 
74
73
  <EntryMode />
75
74
 
76
- 默认情况下,Modern.js 启动项目前会对 `src/` 下的文件进行扫描,识别入口,并生成对应的服务端路由。
75
+ 默认情况下,Modern.js 启动应用前会对 `src/` 下的文件进行扫描,识别入口,并生成对应的服务端路由。
77
76
 
78
77
  :::tip
79
- - 你可以通过 [source.entriesDir](/configure/app/source/entries-dir) 修改页面入口的识别目录。
80
- - 如果你需要自定义入口,请参考 [自定义入口](#自定义入口)。
81
-
78
+ 你可以通过 [source.entriesDir](/configure/app/source/entries-dir) 修改识别入口的目录。
82
79
  :::
83
80
 
84
- 并非 `src/` 下所有的一级目录都会成为项目入口, 入口所在目录必须满足以下五个条件之一:
81
+ 入口所在目录必须满足以下三个条件之一:
85
82
 
86
83
  1. 具有 `routes/` 目录。
87
84
  2. 具有 `App.[jt]sx?` 文件。
88
- 3. 具有 `entry.[jt]sx?` 文件 (需要开启 `source.enableCustomEntry` 使用)。
89
- 4. 具有 `index.[jt]sx?` 文件(即将废弃)。
90
- 5. 具有 `pages/` 目录(兼容 Modern.js 1.0)(即将废弃)。
85
+ 3. 具有 `entry.[jt]sx?` 文件(需要开启 [source.enableCustomEntry](/configure/app/source/enable-custom-entry) 使用)。
91
86
 
92
87
 
93
- 当 `src/` 目录满足入口特征时,Modern.js 会认为当前项目为单入口应用。
88
+ 当 `src/` 目录满足入口特征时,Modern.js 会认为当前应用为单入口应用。否则,Modern.js 会扫描 `src/` 下的一级目录,并进一步判断是否为入口,此时应用通常为多入口应用。
94
89
 
95
90
  :::tip
96
91
  在单入口应用中,默认的入口名为 `main`。
97
-
98
92
  :::
99
93
 
100
- 当项目不是单入口应用时,Modern.js 会进一步查看 `src/` 下的一级目录。
101
-
102
94
  ### 框架模式入口
103
95
 
104
- 框架模式指的是需要使用 Modern.js 的框架能力,例如嵌套路由、SSR、一体化调用等。这类入口约定下,开发者定义的入口并不是真正的编译入口。Modern.js 在启动时会生成一个封装过的入口,可以在 `node_modules/.modern/[entryName]/index.js` 找到真正的入口。
96
+ 框架模式指的是需要使用 Modern.js 的框架能力,例如约定式路由、SSR、一体化调用等。这类入口约定下,应用中的入口并不是真正的编译入口。Modern.js 在启动时会生成一个封装过的入口,可以在 `node_modules/.modern/[entryName]/index.js` 找到真正的入口。
105
97
 
106
98
  #### 约定式路由
107
99
 
108
- 如果入口中存在 `routes/` 目录,Modern.js 会在启动时扫描 `routes/` 下的文件,基于文件约定,自动生成客户端路由(react-router)。例如:
100
+ 如果入口中存在 `routes/` 目录,我们称该入口为约定式路由。Modern.js 会在启动时扫描 `routes/` 下的文件,基于文件约定,自动生成客户端路由(react-router)。例如:
109
101
 
110
102
  ```bash
111
103
  .
@@ -121,9 +113,18 @@ import EntryMode from '@site-docs/components/entry-mode.mdx';
121
113
 
122
114
  #### 自控式路由
123
115
 
124
- 如果入口中存在 `App.[jt]sx?` 文件,开发者可以在这个文件中通过代码的方式,设置客户端路由,或者不设置客户端路由。
116
+ 如果入口中存在 `App.[jt]sx?` 文件,我们称为该入口为自控式路由。例如:
125
117
 
126
- ```tsx
118
+ ```bash
119
+ .
120
+ ├── src
121
+ │ └── App.tsx
122
+ ```
123
+
124
+
125
+ 以 `src/App.tsx` 为约定的入口,Modern.js 不会对路由做额外的操作,开发者可以使用 [React Router 6](https://reactrouter.com/en/main) 的 API 设置客户端路由,或不设置客户端路由。例如以下代码,在应用中自行设置了客户端路由:
126
+
127
+ ```tsx title="src/App.tsx"
127
128
  import { BrowserRouter, Route, Routes } from '@modern-js/runtime/router';
128
129
 
129
130
  export default () => {
@@ -138,16 +139,20 @@ export default () => {
138
139
  };
139
140
  ```
140
141
 
141
- 详细内容可以参考[路由方案](/guides/basic-features/routes#自控式路由)。
142
+ :::note
143
+ 我们推荐开发者使用约定式路由,Modern.js 默认对约定式路由做了一系列资源加载及渲染上的优化,并且提供了开箱即用的 SSR 能力。而在使用自控路由时,这些能力都需要开发者自行封装。
144
+ :::
142
145
 
143
146
  #### 自定义入口
144
147
 
145
- 如果入口中存在 `entry.[jt]sx` 文件,需要开发者在 `entry.[jt]sx` 文件中调用 `createRoot` 和 `render` 函数,完成项目入口逻辑。
146
-
147
148
  :::info
148
- 使用该文件需要开启 [source.enableCustomEntry](/configure/app/source/enable-custom-entry)。
149
+ 使用该功能需要开启 [source.enableCustomEntry](/configure/app/source/enable-custom-entry)。
149
150
  :::
150
151
 
152
+ 默认情况下,使用约定式路由或自控式路由时,Modern.js 会自动完成渲染。如果你希望自定义这个行为,可以通过自定义入口文件的方式来实现。
153
+
154
+ 如果入口中存在 `entry.[jt]sx` 文件,则 Modern.js 不再控制应用的渲染流程,你可以在 `entry.[jt]sx` 文件中调用 `createRoot` 和 `render` 函数,完成应用入口逻辑。
155
+
151
156
  ```tsx
152
157
  import { createRoot } from '@modern-js/runtime/react';
153
158
  import { render } from '@modern-js/runtime/browser';
@@ -158,7 +163,7 @@ render(<ModernRoot />);
158
163
 
159
164
  ```
160
165
 
161
- 比如在 render 执行前,需要做一些其他操作,可以这样实现:
166
+ 上述代码中,`createRoot` 函数返回的组件为 `routes/` 目录生成或 `App.tsx` 导出的组件,`render` 函数用于处理渲染与挂载组件。例如,你希望在渲染前执行某些异步任务,可以这样实现:
162
167
 
163
168
  ```tsx
164
169
  import { createRoot } from '@modern-js/runtime/react';
@@ -167,7 +172,7 @@ import { render } from '@modern-js/runtime/browser';
167
172
  const ModernRoot = createRoot();
168
173
 
169
174
  async function beforeRender() {
170
- // todo
175
+ // some async request
171
176
  }
172
177
 
173
178
  beforeRender().then(() => {
@@ -175,34 +180,15 @@ beforeRender().then(() => {
175
180
  });
176
181
  ```
177
182
 
178
- #### 自定义 Bootstrap
179
-
180
- :::warning
181
- 即将废弃,推荐使用自定义入口
182
- :::
183
-
184
- 如果入口中存在 `index.[jt]sx` 文件,并且当文件默认导出函数时,Modern.js 会将默认的 `bootstrap` 函数作为入参传入,并用导出的函数替代默认的 `bootstrap`,这样开发者可以自定义将组件挂载到 DOM 节点上,或在挂载前添加自定义行为。例如:
185
-
186
- ```tsx
187
- export default (App: React.ComponentType, bootstrap: () => void) => {
188
- // do something before bootstrap...
189
- initSomething().then(() => {
190
- bootstrap();
191
- });
192
- };
193
- ```
194
-
195
183
  ### 构建模式入口
196
184
 
197
- 构建模式指的是不使用 Modern.js 提供的 Runtime 能力,而是完全由开发者自行定义页面的入口。
198
-
199
- 当入口目录中存在 `index.[jt]sx`(即将废弃) 并且没有通过 `export default` 导出函数或者入口目录存在 `entry.[jt]sx` 并且未安装 `@modern-js/runtime` 依赖时,对应文件就会被识别为 webpack 或 Rspack 的 entry 模块。
200
-
201
185
  :::info
202
- 使用 `entry.[jt]sx` 文件需要开启 [source.enableCustomEntry](/configure/app/source/enable-custom-entry)。
186
+ 使用该功能需要开启需要开启 [source.enableCustomEntry](/configure/app/source/enable-custom-entry)。
203
187
  :::
204
188
 
205
- 此时 Modern.js 不会自动生成入口代码,因此需要你自行将组件挂载到 DOM 节点上,例如:
189
+ 构建模式指的是不使用 Modern.js 提供的 Runtime 能力,只使用 Modern.js 构建能力的开发模式。当应用中未安装 `@modern-js/runtime` 依赖时,Modern.js 会认为当前应用所有的入口都是构建模式入口。
190
+
191
+ 此时,如果入口中存在 `entry.[jt]sx`,则该文件会被识别为 webpack 或 Rspack 的构建入口。此时,Modern.js 不会自动生成入口代码,你需要自行将组件挂载到 DOM 节点上,例如:
206
192
 
207
193
  ```js title=src/entry.tsx
208
194
  import React from 'react';
@@ -212,18 +198,21 @@ import App from './App';
212
198
  ReactDOM.render(<App />, document.getElementById('root'));
213
199
  ```
214
200
 
215
- 这种方式等价于开启 Modern.js 的 [source.entries.disableMount](/configure/app/source/entries) 选项。当你使用这种方式时,**将无法使用 Modern.js 框架的运行时能力**,比如 `modern.config.js` 文件中的 `runtime` 配置将不会再生效。
201
+ 在构建模式入口中,**将无法使用 Modern.js 框架的运行时能力**,比如:
202
+ - 约定式路由,即基于 `src/routes` 下文件的路由
203
+ - 服务端渲染(SSR)
204
+ - `modern.config.js` 文件中的 `runtime` 配置将不会再生效
216
205
 
217
- ## 自定义入口配置
206
+ ## 在配置文件中指定入口
218
207
 
219
208
  在某些情况下,你可能需要自定义入口配置,而不是使用 Modern.js 提供的入口约定。
220
209
 
221
- 比如你需要将一个非 Modern.js 项目迁移到 Modern.js,它并不是按照 Modern.js 的目录结构来搭建的。如果你要将它改成 Modern.js 约定的目录结构,可能会存在一定的迁移成本。这种情况下,你就可以使用自定义入口。
210
+ 比如你需要将一个非 Modern.js 应用迁移到 Modern.js,它并不是按照 Modern.js 的目录结构来搭建的。如果你要将它改成 Modern.js 约定的目录结构,会存在一定的迁移成本。这种情况下,你就可以使用自定义入口。
222
211
 
223
212
  Modern.js 提供了以下配置项,你可以在 [modern.config.ts](/configure/app/usage) 中配置它们:
224
213
 
225
214
  - [source.entries](/configure/app/source/entries):用于设置自定义的入口对象。
226
- - [source.disableDefaultEntries](/configure/app/source/disable-default-entries):用于关闭 Modern.js 默认的入口扫描行为。当你使用自定义入口时,项目的部分结构可能会恰巧命中 Modern.js 约定的目录结构,但你可能不希望 Modern.js 为你自动生成入口配置,开启该选项可以避免这个问题。
215
+ - [source.disableDefaultEntries](/configure/app/source/disable-default-entries):用于关闭 Modern.js 默认的入口扫描行为。当你使用自定义入口时,应用的部分结构可能会恰巧命中 Modern.js 约定的目录结构,但你可能不希望 Modern.js 为你自动生成入口配置,开启该选项可以避免这个问题。
227
216
 
228
217
  ### 示例
229
218
 
@@ -247,4 +236,37 @@ export default defineConfig({
247
236
  });
248
237
  ```
249
238
 
250
- 注意,当你开启 `disableMount` 时,**将无法使用 Modern.js 框架的运行时能力**,比如 `modern.config.ts` 文件中的 `runtime` 配置将不会再生效。
239
+ 值得注意的是,默认情况下,Modern.js 认为通过配置指定的入口是**框架模式入口**,将自动生成真正的编译入口。如果你的应用是从 Webpack 或 Vite 等构建工具迁移到 Modern.js 框架时,你通常需要在入口配置中开启 `disableMount` 选项,此时 Modern.js 认为该入口是**构建模式入口**。
240
+
241
+
242
+ ## 弃用功能
243
+
244
+ 目前,如果入口所在的目录满足以下条件,也会成为应用入口。
245
+
246
+ 1. 具有 `index.[jt]sx?` 文件。
247
+ 2. 具有 `pages/` 目录。
248
+
249
+
250
+ `pages/` 目录为 Modern.js 旧版本中的约定式路由,新版本中推荐使用 `routes/` 目录。
251
+
252
+ `index.[jt]sx?` 在旧版本中支持应用自定义 Bootstrap 逻辑和构建模式入口,新版本中推荐使用 `entry.[jt]sx?` 代替。
253
+
254
+ ### 自定义 Bootstrap
255
+
256
+ 当入口中存在 `index.[jt]sx` 文件,并且当文件默认导出函数时,Modern.js 会将默认的 `bootstrap` 函数作为入参传入,并用导出的函数替代默认的 `bootstrap`,这样开发者可以自定义将组件挂载到 DOM 节点上,或在挂载前添加自定义行为。例如:
257
+
258
+ ```tsx
259
+ export default (App: React.ComponentType, bootstrap: () => void) => {
260
+ // do something before bootstrap...
261
+ initSomething().then(() => {
262
+ bootstrap();
263
+ });
264
+ };
265
+ ```
266
+
267
+ ### 构建模式入口
268
+
269
+ 当入口目录中存在 `index.[jt]sx`(即将废弃) 并且没有通过 `export default` 导出函数时,该入口也将被认为是构建模式入口。
270
+
271
+
272
+
@@ -1,7 +1 @@
1
- [
2
- "introduction",
3
- "quick-start",
4
- "upgrade",
5
- "glossary",
6
- "tech-stack"
7
- ]
1
+ ["introduction", "quick-start", "upgrade", "glossary", "tech-stack"]
@@ -50,10 +50,10 @@ Modern.js 能为开发者提供极致的**开发体验(Development Experience
50
50
 
51
51
  - 🚀 **Rust 构建**:提供双构建工具支持,轻松切换到 Rspack 构建工具,编译飞快。
52
52
  - 🪜 **渐进式**:使用最精简的模板创建项目,通过生成器逐步开启插件功能,定制解决方案。
53
- - 🏠 **一体化**:开发与生产环境 Web Server 唯一,CSR 和 SSR 同构开发,函数即接口的 API 服务调用。
53
+ - 🏠 **一体化**:开发与生产环境 Web Server 逻辑一致,CSR 和 SSR 同构开发,函数即接口的 API 服务调用。
54
54
  - 📦 **开箱即用**:默认 TS 支持,内置构建、ESLint、调试工具,全功能可测试。
55
55
  - 🌏 **周边生态**:自研状态管理、微前端、模块打包等周边需求。
56
- - 🕸 **多种路由模式**:包含自控路由、基于文件约定的路由(嵌套路由)等。
56
+ - 🕸 **约定式路由**:使用基于文件约定的路由,帮助开发者快速搭建应用。
57
57
 
58
58
  ## 和其他框架的对比
59
59
 
@@ -58,7 +58,7 @@ export default defineConfig({
58
58
  },
59
59
  plugins: [
60
60
  appTools({
61
- bundler: 'webpack', // Set to 'experimental-rspack' to enable rspack ⚡️🦀
61
+ bundler: 'rspack', // Set to 'webpack' to enable webpack
62
62
  }),
63
63
  ],
64
64
  });
@@ -74,7 +74,6 @@ export default defineConfig({
74
74
  - 集成 Modern.js Core,提供配置解析、插件加载等能力。
75
75
  - 集成 Modern.js Builder,提供构建能力。
76
76
  - 集成 Modern.js Server,提供开发和生产服务器相关能力。
77
- - 集成一些最为常用的插件,比如 `plugin-lint`、`plugin-data-loader` 等。
78
77
 
79
78
  `@modern-js/app-tools` 是基于 Modern.js 的插件体系实现的,本质上是一个插件,因此你需要在配置文件的 `plugins` 字段中注册 `appTools`:
80
79
 
@@ -12,13 +12,13 @@ Modern.js 框架默认集成了一些社区中流行的库和开发工具。
12
12
 
13
13
  Modern.js 使用 [React 18](https://react.dev/) 来构建用户界面,同时也兼容 React 17。
14
14
 
15
- Modern.js 底层的 Rsbuild 支持构建 Vue 应用,如果你需要使用 Vue,可以参考[Rsbuild - Vue](https://rsbuild.dev/zh/guide/framework/vue3)。
15
+ Modern.js 底层的 Rsbuild 支持构建 Vue 应用,如果你需要使用 Vue,可以参考 [Rsbuild - Vue](https://rsbuild.dev/zh/guide/framework/vue3)。
16
16
 
17
17
  ## 路由
18
18
 
19
19
  Modern.js 的路由基于 [React Router 6](https://reactrouter.com/en/main),同时也兼容 React Router 5。
20
20
 
21
- Modern.js 支持约定式路由、自控式路由或其他路由方案,请参考[「路由方案」](/guides/basic-features/routes) 进行选择。
21
+ Modern.js 支持约定式路由、自控式路由或其他路由方案,请参考 [路由方案](/guides/basic-features/routes) 进行选择。
22
22
 
23
23
  ## 微前端
24
24
 
@@ -30,8 +30,6 @@ Modern.js 提供对 [Garfish](https://www.garfishjs.org/) 微前端框架开箱
30
30
 
31
31
  Modern.js 可以与社区中任意的状态管理库搭配使用,比如 [Redux](https://redux.js.org/)、[Jotai](https://jotai.org/)、[Zustand](https://docs.pmnd.rs/zustand)、[Valtio](https://valtio.pmnd.rs/) 等。
32
32
 
33
- Modern.js 也基于 Redux 封装了 Reduck 状态管理库,你可以参考 [「Reduck 状态管理」](/guides/topic-detail/model/quick-start)来使用。
34
-
35
33
  ## 包管理器
36
34
 
37
35
  Modern.js 可以与社区中任意的包管理器搭配使用,比如 [npm](https://www.npmjs.com/package/npm)、[yarn](https://classic.yarnpkg.com/lang/en/)、[pnpm](https://pnpm.io/) 或 [Bun](https://bun.sh/)。
@@ -42,7 +40,7 @@ Modern.js 可以与社区中任意的包管理器搭配使用,比如 [npm](htt
42
40
 
43
41
  Modern.js 使用 [Webpack 5](https://webpack.js.org/) 或 [Rspack](https://www.rspack.dev/) 来打包你的 Web 应用。
44
42
 
45
- 默认使用的打包工具为 Webpack 5,你可以参考[「使用 Rspack](/guides/advanced-features/rspack-start) 来切换到更快的 Rspack。
43
+ 默认使用的打包工具为 Webpack 5,你可以参考 [使用 Rspack](/guides/advanced-features/rspack-start) 来切换到更快的 Rspack。
46
44
 
47
45
  ## 转译工具
48
46
 
@@ -62,24 +60,24 @@ Modern.js 使用 [Babel](https://babeljs.io/)、[SWC](https://swc.rs/) 或 [esbu
62
60
 
63
61
  Modern.js 使用 [PostCSS](https://postcss.org/) 来转换 CSS 代码,并默认开启 [autoprefixer](https://github.com/postcss/autoprefixer) 来补全 CSS 前缀。
64
62
 
65
- Modern.js 支持[「启用 Tailwind CSS](/guides/basic-features/css.html#使用-tailwind-css),并同时兼容 Tailwind CSS v2 和 v3 版本。
63
+ Modern.js 支持 [启用 Tailwind CSS](/guides/basic-features/css/tailwindcss),并同时兼容 Tailwind CSS v2 和 v3 版本。
66
64
 
67
65
  ## CSS 预处理器
68
66
 
69
67
  Modern.js 支持 [Sass](https://sass-lang.com/)、[Less](https://lesscss.org/) 和 [Stylus](https://stylus-lang.com/) 三种 CSS 预处理器:
70
68
 
71
69
  - 默认支持 Sass 和 Less,开箱即用。
72
- - 可选支持 Stylus,请参考[Stylus 插件」](https://rsbuild.dev/zh/plugins/list/plugin-stylus) 来使用。
70
+ - 可选支持 Stylus,请参考 [Stylus 插件](https://rsbuild.dev/zh/plugins/list/plugin-stylus) 来使用。
73
71
 
74
72
  ## CSS Modules
75
73
 
76
74
  Modern.js 对 [CSS Modules](https://github.com/css-modules/css-modules) 提供了开箱即用的支持,内部基于 [css-loader](https://www.npmjs.com/package/css-loader) 实现。
77
75
 
78
- 请参考[「使用 CSS Modules](/guides/basic-features/css-modules) 来使用。
76
+ 请参考 [使用 CSS Modules](/guides/basic-features/css/css-modules) 来使用。
79
77
 
80
78
  ## CSS-in-JS
81
79
 
82
- Modern.js 支持使用 [styled-components](https://styled-components.com/),请参考[「使用 CSS-in-JS](/guides/basic-features/css.html#使用-css-in-js) 来使用。
80
+ Modern.js 支持使用 [styled-components](https://styled-components.com/),请参考 [使用 CSS-in-JS](/guides/basic-features/css/css-in-js) 来使用。
83
81
 
84
82
  如果你需要使用其他 CSS-in-JS 方案,可以自行集成到你的项目中。
85
83
 
@@ -91,7 +89,7 @@ Modern.js 可以与社区中任意的 React 组件库搭配使用,比如 [MUI]
91
89
 
92
90
  ## 组件开发
93
91
 
94
- Modern.js 支持使用 [Storybook](https://storybook.js.org/) 来开发 UI 组件。该功能为可选功能,请参考[「使用 Storybook](/guides/advanced-features/using-storybook) 启用。
92
+ Modern.js 支持使用 [Storybook](https://storybook.js.org/) 来开发 UI 组件。该功能为可选功能,请参考 [使用 Storybook](/guides/basic-features/debug/using-storybook) 启用。
95
93
 
96
94
  ## Node.js 框架
97
95
 
@@ -38,9 +38,23 @@ import ReleaseNote from '@site-docs/components/release-note';
38
38
 
39
39
  :::tip
40
40
  当升级时,需要对 Modern.js 官方提供的所有包做统一升级,而不是升级单个依赖。
41
-
42
41
  :::
43
42
 
43
+ ## 版本管理策略
44
+
45
+ 在 Modern.js 项目中,我们推荐所有官方提供的依赖都使用固定版本号,不使用 `^` 或 `~` 进行范围声明。例如:
46
+
47
+ ```json
48
+ {
49
+ "dependencies": {
50
+ "@modern-js/app-tools": "x.y.z"
51
+ }
52
+ }
53
+ ```
54
+
55
+ 这样可以确保依赖的版本是完全确定的,从而保证构建的一致性和可预测性。
56
+
57
+
44
58
  ## 锁定子依赖
45
59
 
46
60
  当项目某个子依赖出现问题,而 Modern.js 无法立即更新时,可以使用包管理器锁定子依赖版本。
@@ -7,4 +7,4 @@
7
7
  "extend",
8
8
  "plugin-api",
9
9
  "hook-list"
10
- ]
10
+ ]
@@ -14,4 +14,4 @@
14
14
  "name": "plugin",
15
15
  "label": "generator-plugin"
16
16
  }
17
- ]
17
+ ]
@@ -1,5 +1 @@
1
- [
2
- "use",
3
- "option",
4
- "config"
5
- ]
1
+ ["use", "option", "config"]
@@ -41,16 +41,6 @@ import PackageManager from '@site-docs/components/package-manager';
41
41
 
42
42
  <PackageManager />
43
43
 
44
- ### buildTools
45
-
46
- 问题:请选择构建工具
47
-
48
- 选项:
49
-
50
- - webpack -- webpack
51
-
52
- - Rspack -- rspack
53
-
54
44
  ## Npm 模块
55
45
 
56
46
  ### packageName
@@ -35,7 +35,6 @@ npx @modern-js/create@latest web-app
35
35
  ? 请选择你想创建的工程类型 Web 应用
36
36
  ? 请选择开发语言 TS
37
37
  ? 请选择包管理工具 pnpm
38
- ? 请选择构建工具 webpack
39
38
  ```
40
39
 
41
40
  ### 创建 Npm 模块项目
@@ -1,5 +1 @@
1
- [
2
- "use",
3
- "option",
4
- "config"
5
- ]
1
+ ["use", "option", "config"]
@@ -8,4 +8,4 @@
8
8
  "name": "api",
9
9
  "label": "API"
10
10
  }
11
- ]
11
+ ]
@@ -1,6 +1 @@
1
- [
2
- "dependencies",
3
- "cli",
4
- "builder",
5
- "hmr"
6
- ]
1
+ ["dependencies", "cli", "builder", "hmr"]
@@ -293,7 +293,7 @@ import '../styles/utils.css';
293
293
  ```
294
294
 
295
295
  :::info
296
- Modern.js 集成了 [PostCSS](/guides/basic-features/css),支持现代 CSS 语法特性,比如 [custom properties](https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties)。
296
+ Modern.js 集成了 [PostCSS](/guides/basic-features/css/css),支持现代 CSS 语法特性,比如 [custom properties](https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties)。
297
297
 
298
298
  :::
299
299
 
package/i18n.json CHANGED
@@ -51,14 +51,26 @@
51
51
  "zh": "渲染",
52
52
  "en": "Rendering"
53
53
  },
54
+ "css-solution": {
55
+ "zh": "样式开发",
56
+ "en": "Styling"
57
+ },
58
+ "debug": {
59
+ "zh": "调试",
60
+ "en": "Debug"
61
+ },
62
+ "static-assets": {
63
+ "zh": "引用静态资源",
64
+ "en": "Import Static Assets"
65
+ },
66
+ "testing": {
67
+ "zh": "测试",
68
+ "en": "Testing"
69
+ },
54
70
  "use-bff": {
55
71
  "zh": "使用 BFF",
56
72
  "en": "Using BFF"
57
73
  },
58
- "use-ssr": {
59
- "zh": "服务端渲染",
60
- "en": "SSR"
61
- },
62
74
  "micro-frontend": {
63
75
  "zh": "微前端",
64
76
  "en": "Micro Frontend"
package/package.json CHANGED
@@ -15,20 +15,20 @@
15
15
  "modern",
16
16
  "modern.js"
17
17
  ],
18
- "version": "2.58.2",
18
+ "version": "2.59.0",
19
19
  "publishConfig": {
20
20
  "registry": "https://registry.npmjs.org/",
21
21
  "access": "public",
22
22
  "provenance": true
23
23
  },
24
24
  "dependencies": {
25
- "@modern-js/sandpack-react": "2.58.2"
25
+ "@modern-js/sandpack-react": "2.59.0"
26
26
  },
27
27
  "peerDependencies": {
28
- "@modern-js/builder-doc": "^2.58.2"
28
+ "@modern-js/builder-doc": "^2.59.0"
29
29
  },
30
30
  "devDependencies": {
31
- "@rspress/shared": "1.27.0",
31
+ "@rspress/shared": "1.28.2",
32
32
  "@types/fs-extra": "9.0.13",
33
33
  "@types/node": "^16",
34
34
  "classnames": "^2",
@@ -36,10 +36,10 @@
36
36
  "fs-extra": "^10",
37
37
  "react": "^18",
38
38
  "react-dom": "^18",
39
- "rspress": "1.27.0",
39
+ "rspress": "1.28.2",
40
40
  "ts-node": "^10.9.1",
41
41
  "typescript": "^5",
42
- "@modern-js/builder-doc": "2.58.2"
42
+ "@modern-js/builder-doc": "2.59.0"
43
43
  },
44
44
  "scripts": {
45
45
  "dev": "rspress dev",
package/rspress.config.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import path from 'path';
2
- import { defineConfig } from 'rspress/config';
3
2
  import type { NavItem } from '@rspress/shared';
3
+ import { defineConfig } from 'rspress/config';
4
4
 
5
5
  const { version } = require('./package.json');
6
6
 
@@ -1,5 +1,5 @@
1
- import type React from 'react';
2
1
  import cl from 'classnames';
2
+ import type React from 'react';
3
3
  import { withBase } from 'rspress/runtime';
4
4
  import styles from './index.module.scss';
5
5
 
@@ -2,7 +2,7 @@ import ModernSandpack, {
2
2
  type ModernSandpackProps,
3
3
  } from '@modern-js/sandpack-react';
4
4
  import React, { type PropsWithChildren } from 'react';
5
- import { useDark, NoSSR } from 'rspress/runtime';
5
+ import { NoSSR, useDark } from 'rspress/runtime';
6
6
 
7
7
  import './index.css';
8
8
 
@@ -1,5 +1,5 @@
1
- import { useShowcases } from './useShowcases';
2
1
  import styles from './index.module.scss';
2
+ import { useShowcases } from './useShowcases';
3
3
 
4
4
  const getDomain = (url: string) => new URL(url).hostname;
5
5
 
package/src/i18n/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { withBase, useLang } from 'rspress/runtime';
1
+ import { useLang, withBase } from 'rspress/runtime';
2
2
  import { EN_US } from './enUS';
3
3
  import { ZH_CN } from './zhCN';
4
4
 
@@ -1,11 +1,11 @@
1
1
  /* eslint-disable react/no-unescaped-entities */
2
2
  import clsx from 'clsx';
3
- import { useLang, Helmet, useLocation } from 'rspress/runtime';
4
3
  import { useEffect } from 'react';
4
+ import { Helmet, useLang, useLocation } from 'rspress/runtime';
5
5
  import ContentCard from '../components/ContentCard';
6
- import SecondaryTitle from '../components/SecondaryTitle';
7
6
  import { FeatureLayout } from '../components/FeatureLayout';
8
7
  import Footer from '../components/Footer';
8
+ import SecondaryTitle from '../components/SecondaryTitle';
9
9
  import { useI18n, useUrl } from '../i18n';
10
10
  import styles from './index.module.scss';
11
11
 
@@ -1,37 +0,0 @@
1
- ---
2
- title: storybook/
3
- sidebar_position: 7
4
- ---
5
-
6
- # storybook/
7
-
8
- Modern.js supports debugging using Storybook. When configuring Storybook, you need to configure it in the `config/storybook` directory of the project.
9
-
10
- Please refer to [Storybook Configuration](https://storybook.js.org/docs/react/configure/overview) for Storybook configuration.
11
-
12
- :::info
13
- Enabling the Storybook function requires running the new command to enable it under the project first.
14
- :::
15
-
16
- #### Example
17
-
18
- For the webpack configuration of the Storybook Manager app section, you can configure it by adding the `./config/storybook/main.js` file to configure it.
19
-
20
- ```js
21
- // ./config/storybook/main.js
22
-
23
- module.exports = {
24
- // it controls the Storybook manager app
25
- managerWebpack: async (config, options) => {
26
- // update config here
27
- return config;
28
- },
29
- };
30
- ```
31
-
32
- ### Limitation
33
-
34
- There are some limitations when using the `config/storybook` directory for configuration:
35
-
36
- - The location where the Story file is stored cannot be modified, that is, the `stories` configuration cannot be modified in the `main.js` file.
37
- - It is not supported to modify Webpack and Babel related configurations in `main.js`, related requirements can be passed through [`tools.webpack`](/configure/app/tools/webpack.html) /[`tools.babel`](/configure/app/tools/babel.html) modify.