@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.
- package/docs/en/apis/app/runtime/core/use-loader.mdx +1 -1
- package/docs/en/community/blog/_meta.json +1 -6
- package/docs/en/components/deploy.mdx +1 -1
- package/docs/en/components/init-app.mdx +0 -1
- package/docs/en/components/init-rspack-app.mdx +0 -1
- package/docs/en/components/ssr-monitor.mdx +3 -0
- package/docs/en/configure/_meta.json +1 -1
- package/docs/en/configure/app/output/ssg.mdx +52 -141
- package/docs/en/configure/app/tools/swc.mdx +1 -1
- package/docs/en/configure/app/tools/tailwindcss.mdx +1 -1
- package/docs/en/guides/advanced-features/_meta.json +0 -8
- package/docs/en/guides/advanced-features/bff/_meta.json +1 -6
- package/docs/en/guides/advanced-features/rsbuild-plugin.mdx +2 -2
- package/docs/en/guides/advanced-features/rspack-start.mdx +7 -22
- package/docs/en/guides/basic-features/_meta.json +31 -9
- package/docs/en/guides/basic-features/css/_meta.json +1 -0
- package/docs/en/guides/basic-features/css/css-in-js.mdx +34 -0
- package/docs/en/guides/basic-features/{css-modules.mdx → css/css-modules.mdx} +0 -4
- package/docs/en/guides/basic-features/css/css.mdx +25 -0
- package/docs/en/guides/basic-features/{css.mdx → css/tailwindcss.mdx} +5 -66
- package/docs/en/guides/basic-features/data/_meta.json +1 -4
- package/docs/en/guides/basic-features/data/data-fetch.mdx +134 -235
- package/docs/en/guides/basic-features/data/data-write.mdx +66 -77
- package/docs/en/guides/basic-features/debug/_meta.json +1 -0
- package/docs/en/guides/basic-features/debug/rsdoctor.mdx +57 -0
- package/docs/en/guides/{advanced-features → basic-features/debug}/using-storybook.mdx +2 -0
- package/docs/en/guides/basic-features/render/_meta.json +1 -0
- package/docs/en/guides/basic-features/render/ssg.mdx +208 -0
- package/docs/en/guides/{advanced-features/ssr/cache.mdx → basic-features/render/ssr-cache.mdx} +38 -50
- package/docs/en/guides/basic-features/render/ssr.mdx +301 -0
- package/docs/en/guides/basic-features/render/streaming-ssr.mdx +230 -0
- package/docs/en/guides/basic-features/routes.mdx +275 -263
- package/docs/en/guides/basic-features/static-assets/_meta.json +1 -0
- package/docs/en/guides/basic-features/static-assets.mdx +1 -1
- package/docs/en/guides/basic-features/testing/_meta.json +1 -0
- package/docs/en/guides/basic-features/testing/cypress.mdx +95 -0
- package/docs/en/guides/basic-features/testing/jest.mdx +148 -0
- package/docs/en/guides/basic-features/testing/playwright.mdx +111 -0
- package/docs/en/guides/basic-features/testing/vitest.mdx +100 -0
- package/docs/en/guides/concept/_meta.json +1 -4
- package/docs/en/guides/concept/entries.mdx +78 -47
- package/docs/en/guides/get-started/_meta.json +1 -7
- package/docs/en/guides/get-started/introduction.mdx +1 -1
- package/docs/en/guides/get-started/quick-start.mdx +1 -2
- package/docs/en/guides/get-started/tech-stack.mdx +4 -6
- package/docs/en/guides/get-started/upgrade.mdx +16 -2
- package/docs/en/guides/topic-detail/framework-plugin/_meta.json +1 -1
- package/docs/en/guides/topic-detail/generator/_meta.json +1 -1
- package/docs/en/guides/topic-detail/generator/create/_meta.json +1 -5
- package/docs/en/guides/topic-detail/generator/create/config.mdx +0 -10
- package/docs/en/guides/topic-detail/generator/create/use.mdx +0 -1
- package/docs/en/guides/topic-detail/generator/new/_meta.json +1 -5
- package/docs/en/guides/topic-detail/generator/plugin/_meta.json +1 -1
- package/docs/en/guides/troubleshooting/_meta.json +1 -6
- package/docs/en/tutorials/first-app/c03-css.mdx +1 -1
- package/docs/zh/apis/app/runtime/core/use-loader.mdx +1 -1
- package/docs/zh/community/blog/_meta.json +1 -6
- package/docs/zh/components/deploy.mdx +1 -1
- package/docs/zh/components/init-app.mdx +0 -1
- package/docs/zh/components/init-rspack-app.mdx +0 -1
- package/docs/zh/components/ssr-monitor.mdx +3 -0
- package/docs/zh/configure/_meta.json +1 -1
- package/docs/zh/configure/app/output/ssg.mdx +49 -139
- package/docs/zh/configure/app/tools/swc.mdx +1 -1
- package/docs/zh/configure/app/tools/tailwindcss.mdx +1 -1
- package/docs/zh/guides/advanced-features/_meta.json +0 -8
- package/docs/zh/guides/advanced-features/bff/_meta.json +1 -6
- package/docs/zh/guides/advanced-features/rsbuild-plugin.mdx +2 -2
- package/docs/zh/guides/advanced-features/rspack-start.mdx +8 -24
- package/docs/zh/guides/basic-features/_meta.json +31 -9
- package/docs/zh/guides/basic-features/css/_meta.json +1 -0
- package/docs/zh/guides/basic-features/css/css-in-js.mdx +34 -0
- package/docs/zh/guides/basic-features/css/css.mdx +25 -0
- package/docs/zh/guides/basic-features/{css.mdx → css/tailwindcss.mdx} +3 -64
- package/docs/zh/guides/basic-features/data/_meta.json +1 -4
- package/docs/zh/guides/basic-features/data/data-fetch.mdx +98 -214
- package/docs/zh/guides/basic-features/data/data-write.mdx +54 -55
- package/docs/zh/guides/basic-features/debug/_meta.json +1 -0
- package/docs/zh/guides/basic-features/debug/rsdoctor.mdx +57 -0
- package/docs/zh/guides/{advanced-features → basic-features/debug}/using-storybook.mdx +1 -1
- package/docs/zh/guides/basic-features/render/_meta.json +1 -0
- package/docs/zh/guides/basic-features/render/ssg.mdx +210 -0
- package/docs/zh/guides/{advanced-features/ssr/cache.mdx → basic-features/render/ssr-cache.mdx} +16 -26
- package/docs/zh/guides/basic-features/render/ssr.mdx +309 -0
- package/docs/zh/guides/{advanced-features/ssr/stream.mdx → basic-features/render/streaming-ssr.mdx} +22 -37
- package/docs/zh/guides/basic-features/routes.mdx +252 -237
- package/docs/zh/guides/basic-features/static-assets/_meta.json +1 -0
- package/docs/zh/guides/basic-features/static-assets.mdx +2 -6
- package/docs/zh/guides/basic-features/testing/_meta.json +1 -0
- package/docs/zh/guides/basic-features/testing/cypress.mdx +95 -0
- package/docs/zh/guides/basic-features/testing/jest.mdx +148 -0
- package/docs/zh/guides/basic-features/testing/playwright.mdx +112 -0
- package/docs/zh/guides/basic-features/testing/vitest.mdx +100 -0
- package/docs/zh/guides/concept/_meta.json +1 -4
- package/docs/zh/guides/concept/entries.mdx +80 -58
- package/docs/zh/guides/get-started/_meta.json +1 -7
- package/docs/zh/guides/get-started/introduction.mdx +2 -2
- package/docs/zh/guides/get-started/quick-start.mdx +1 -2
- package/docs/zh/guides/get-started/tech-stack.mdx +8 -10
- package/docs/zh/guides/get-started/upgrade.mdx +15 -1
- package/docs/zh/guides/topic-detail/framework-plugin/_meta.json +1 -1
- package/docs/zh/guides/topic-detail/generator/_meta.json +1 -1
- package/docs/zh/guides/topic-detail/generator/create/_meta.json +1 -5
- package/docs/zh/guides/topic-detail/generator/create/config.mdx +0 -10
- package/docs/zh/guides/topic-detail/generator/create/use.mdx +0 -1
- package/docs/zh/guides/topic-detail/generator/new/_meta.json +1 -5
- package/docs/zh/guides/topic-detail/generator/plugin/_meta.json +1 -1
- package/docs/zh/guides/troubleshooting/_meta.json +1 -6
- package/docs/zh/tutorials/first-app/c03-css.mdx +1 -1
- package/i18n.json +16 -4
- package/package.json +6 -6
- package/rspress.config.ts +1 -1
- package/src/components/ContentCard/index.tsx +1 -1
- package/src/components/Sandpack/index.tsx +1 -1
- package/src/components/ShowcaseList/index.tsx +1 -1
- package/src/i18n/index.ts +1 -1
- package/src/pages/index.tsx +2 -2
- package/docs/en/apis/app/hooks/config/storybook.mdx +0 -37
- package/docs/en/guides/advanced-features/ssg.mdx +0 -116
- package/docs/en/guides/advanced-features/ssr/_meta.json +0 -5
- package/docs/en/guides/advanced-features/ssr/index.mdx +0 -23
- package/docs/en/guides/advanced-features/ssr/stream.mdx +0 -248
- package/docs/en/guides/advanced-features/ssr/usage.mdx +0 -341
- package/docs/en/guides/advanced-features/ssr.mdx +0 -555
- package/docs/zh/apis/app/hooks/config/storybook.mdx +0 -38
- package/docs/zh/guides/advanced-features/ssg.mdx +0 -116
- package/docs/zh/guides/advanced-features/ssr/_meta.json +0 -5
- package/docs/zh/guides/advanced-features/ssr/index.mdx +0 -23
- package/docs/zh/guides/advanced-features/ssr/usage.mdx +0 -329
- /package/docs/en/guides/basic-features/{mock.mdx → debug/mock.mdx} +0 -0
- /package/docs/en/guides/basic-features/{proxy.mdx → debug/proxy.mdx} +0 -0
- /package/docs/en/guides/basic-features/{json-files.mdx → static-assets/json-files.mdx} +0 -0
- /package/docs/en/guides/basic-features/{svg-assets.mdx → static-assets/svg-assets.mdx} +0 -0
- /package/docs/en/guides/basic-features/{wasm-assets.mdx → static-assets/wasm-assets.mdx} +0 -0
- /package/docs/zh/guides/basic-features/{css-modules.mdx → css/css-modules.mdx} +0 -0
- /package/docs/zh/guides/basic-features/{mock.mdx → debug/mock.mdx} +0 -0
- /package/docs/zh/guides/basic-features/{proxy.mdx → debug/proxy.mdx} +0 -0
- /package/docs/zh/guides/basic-features/{json-files.mdx → static-assets/json-files.mdx} +0 -0
- /package/docs/zh/guides/basic-features/{svg-assets.mdx → static-assets/svg-assets.mdx} +0 -0
- /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
|
13
|
+
在 Modern.js 应用中,每一个入口对应一个独立的页面,也对应一条服务端路由。默认情况下,Modern.js 会基于目录约定来自动确定页面的入口,同时也支持通过配置项来自定义入口。
|
14
14
|
|
15
15
|
Modern.js 提供的很多配置项都是以入口为维度进行划分的,比如页面标题、HTML 模板、页面 Meta 信息、是否开启 SSR/SSG、服务端路由规则等。
|
16
16
|
|
17
17
|
## 单入口与多入口
|
18
18
|
|
19
|
-
Modern.js
|
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
|
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
|
-
|
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
|
-
|
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
|
75
|
+
默认情况下,Modern.js 启动应用前会对 `src/` 下的文件进行扫描,识别入口,并生成对应的服务端路由。
|
77
76
|
|
78
77
|
:::tip
|
79
|
-
|
80
|
-
- 如果你需要自定义入口,请参考 [自定义入口](#自定义入口)。
|
81
|
-
|
78
|
+
你可以通过 [source.entriesDir](/configure/app/source/entries-dir) 修改识别入口的目录。
|
82
79
|
:::
|
83
80
|
|
84
|
-
|
81
|
+
入口所在目录必须满足以下三个条件之一:
|
85
82
|
|
86
83
|
1. 具有 `routes/` 目录。
|
87
84
|
2. 具有 `App.[jt]sx?` 文件。
|
88
|
-
3. 具有 `entry.[jt]sx?`
|
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
|
96
|
+
框架模式指的是需要使用 Modern.js 的框架能力,例如约定式路由、SSR、一体化调用等。这类入口约定下,应用中的入口并不是真正的编译入口。Modern.js 在启动时会生成一个封装过的入口,可以在 `node_modules/.modern/[entryName]/index.js` 找到真正的入口。
|
105
97
|
|
106
98
|
#### 约定式路由
|
107
99
|
|
108
|
-
如果入口中存在 `routes/`
|
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
|
-
```
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
//
|
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
|
-
|
186
|
+
使用该功能需要开启需要开启 [source.enableCustomEntry](/configure/app/source/enable-custom-entry)。
|
203
187
|
:::
|
204
188
|
|
205
|
-
|
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
|
-
|
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
|
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
|
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
|
-
|
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
|
+
|
@@ -50,10 +50,10 @@ Modern.js 能为开发者提供极致的**开发体验(Development Experience
|
|
50
50
|
|
51
51
|
- 🚀 **Rust 构建**:提供双构建工具支持,轻松切换到 Rspack 构建工具,编译飞快。
|
52
52
|
- 🪜 **渐进式**:使用最精简的模板创建项目,通过生成器逐步开启插件功能,定制解决方案。
|
53
|
-
- 🏠 **一体化**:开发与生产环境 Web Server
|
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: '
|
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,可以参考[
|
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 支持约定式路由、自控式路由或其他路由方案,请参考[
|
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,你可以参考[
|
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 支持[
|
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,请参考[
|
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
|
-
请参考[
|
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/),请参考[
|
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 组件。该功能为可选功能,请参考[
|
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 无法立即更新时,可以使用包管理器锁定子依赖版本。
|
@@ -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.
|
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.
|
25
|
+
"@modern-js/sandpack-react": "2.59.0"
|
26
26
|
},
|
27
27
|
"peerDependencies": {
|
28
|
-
"@modern-js/builder-doc": "^2.
|
28
|
+
"@modern-js/builder-doc": "^2.59.0"
|
29
29
|
},
|
30
30
|
"devDependencies": {
|
31
|
-
"@rspress/shared": "1.
|
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.
|
39
|
+
"rspress": "1.28.2",
|
40
40
|
"ts-node": "^10.9.1",
|
41
41
|
"typescript": "^5",
|
42
|
-
"@modern-js/builder-doc": "2.
|
42
|
+
"@modern-js/builder-doc": "2.59.0"
|
43
43
|
},
|
44
44
|
"scripts": {
|
45
45
|
"dev": "rspress dev",
|
package/rspress.config.ts
CHANGED
@@ -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 {
|
5
|
+
import { NoSSR, useDark } from 'rspress/runtime';
|
6
6
|
|
7
7
|
import './index.css';
|
8
8
|
|
package/src/i18n/index.ts
CHANGED
package/src/pages/index.tsx
CHANGED
@@ -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.
|