@modern-js/main-doc 2.58.2 → 2.59.0

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 (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.