@modern-js/main-doc 2.55.0 → 2.56.1
Sign up to get free protection for your applications and to get access to all the features.
- package/docs/en/configure/app/dev/live-reload.mdx +27 -0
- package/docs/en/configure/app/dev/setup-middlewares.mdx +69 -0
- package/docs/en/configure/app/dev/watch-files.mdx +59 -0
- package/docs/en/configure/app/dev/write-to-disk.mdx +38 -0
- package/docs/en/guides/basic-features/data/data-fetch.mdx +1 -1
- package/docs/en/guides/basic-features/routes.mdx +1 -1
- package/docs/zh/configure/app/dev/live-reload.mdx +27 -0
- package/docs/zh/configure/app/dev/setup-middlewares.mdx +69 -0
- package/docs/zh/configure/app/dev/watch-files.mdx +59 -0
- package/docs/zh/configure/app/dev/write-to-disk.mdx +38 -0
- package/docs/zh/guides/basic-features/data/data-fetch.mdx +1 -1
- package/docs/zh/guides/basic-features/routes.mdx +1 -1
- package/package.json +7 -7
@@ -0,0 +1,27 @@
|
|
1
|
+
---
|
2
|
+
sidebar_label: liveReload
|
3
|
+
---
|
4
|
+
|
5
|
+
# dev.liveReload
|
6
|
+
|
7
|
+
- **Type:** `boolean`
|
8
|
+
- **Default:** `true`
|
9
|
+
|
10
|
+
Whether to reload the page when source files are changed.
|
11
|
+
|
12
|
+
By default, Modern.js uses HMR as the preferred method to update modules. If HMR is disabled or cannot be used in certain scenarios, it will automatically fallback to liveReload.
|
13
|
+
|
14
|
+
Please refer to [Hot Module Replacement](https://rsbuild.dev/guide/advanced/hmr) for more information.
|
15
|
+
|
16
|
+
## Disabling liveReload
|
17
|
+
|
18
|
+
If you need to disable liveReload, you can set both `dev.hmr` and `dev.liveReload` to `false`. Then, no Web Socket requests will be made to the dev server on the page, and the page will not automatically refresh when file change.
|
19
|
+
|
20
|
+
```js
|
21
|
+
export default {
|
22
|
+
dev: {
|
23
|
+
hmr: false,
|
24
|
+
liveReload: false,
|
25
|
+
},
|
26
|
+
};
|
27
|
+
```
|
@@ -0,0 +1,69 @@
|
|
1
|
+
---
|
2
|
+
sidebar_label: setupMiddlewares
|
3
|
+
---
|
4
|
+
|
5
|
+
# dev.setupMiddlewares
|
6
|
+
|
7
|
+
- **Type:**
|
8
|
+
|
9
|
+
```ts
|
10
|
+
type ServerAPIs = {
|
11
|
+
sockWrite: (
|
12
|
+
type: string,
|
13
|
+
data?: string | boolean | Record<string, any>,
|
14
|
+
) => void;
|
15
|
+
};
|
16
|
+
|
17
|
+
type SetupMiddlewares = Array<
|
18
|
+
(
|
19
|
+
middlewares: {
|
20
|
+
unshift: (...handlers: RequestHandler[]) => void;
|
21
|
+
push: (...handlers: RequestHandler[]) => void;
|
22
|
+
},
|
23
|
+
server: ServerAPIs,
|
24
|
+
) => void
|
25
|
+
>;
|
26
|
+
```
|
27
|
+
|
28
|
+
- **Default:** `undefined`
|
29
|
+
|
30
|
+
Provides the ability to execute a custom function and apply custom middlewares.
|
31
|
+
|
32
|
+
The order among several different types of middleware is: `unshift` => internal middlewares => `push`.
|
33
|
+
|
34
|
+
```js
|
35
|
+
export default {
|
36
|
+
dev: {
|
37
|
+
setupMiddlewares: [
|
38
|
+
(middlewares, server) => {
|
39
|
+
middlewares.unshift((req, res, next) => {
|
40
|
+
next();
|
41
|
+
});
|
42
|
+
|
43
|
+
middlewares.push((req, res, next) => {
|
44
|
+
next();
|
45
|
+
});
|
46
|
+
},
|
47
|
+
],
|
48
|
+
},
|
49
|
+
};
|
50
|
+
```
|
51
|
+
|
52
|
+
It is possible to use some server api to meet special scenario requirements:
|
53
|
+
|
54
|
+
- sockWrite. Allow send some message to HMR client, and then the HMR client will take different actions depending on the message type. If you send a "content changed" message, the page will reload.
|
55
|
+
|
56
|
+
```js
|
57
|
+
export default {
|
58
|
+
dev: {
|
59
|
+
setupMiddlewares: [
|
60
|
+
(middlewares, server) => {
|
61
|
+
// add custom watch & trigger page reload when change
|
62
|
+
watcher.on('change', (changed) => {
|
63
|
+
server.sockWrite('content-changed');
|
64
|
+
});
|
65
|
+
},
|
66
|
+
],
|
67
|
+
},
|
68
|
+
};
|
69
|
+
```
|
@@ -0,0 +1,59 @@
|
|
1
|
+
---
|
2
|
+
sidebar_label: watchFiles
|
3
|
+
---
|
4
|
+
|
5
|
+
# dev.watchFiles
|
6
|
+
|
7
|
+
- **Type:**
|
8
|
+
|
9
|
+
```ts
|
10
|
+
type WatchFiles = {
|
11
|
+
paths: string | string[];
|
12
|
+
// watch options for chokidar
|
13
|
+
options?: WatchOptions;
|
14
|
+
};
|
15
|
+
```
|
16
|
+
|
17
|
+
- **Default:** `undefined`
|
18
|
+
|
19
|
+
Watch files and directories for changes. When a file changes, the page will be reloaded.
|
20
|
+
|
21
|
+
If both `dev.hmr` and `dev.liveReload` are set to false, `watchFiles` will be ignored.
|
22
|
+
|
23
|
+
:::tip
|
24
|
+
When files in WatchFiles change, reloading and recompilation of the configuration file will not be triggered.
|
25
|
+
:::
|
26
|
+
|
27
|
+
### Example
|
28
|
+
|
29
|
+
You can configure a list of globs/directories/files to watch for file changes.
|
30
|
+
|
31
|
+
```js
|
32
|
+
export default {
|
33
|
+
dev: {
|
34
|
+
watchFiles: {
|
35
|
+
// watch a single file
|
36
|
+
paths: 'public/demo.txt',
|
37
|
+
// use a glob pattern
|
38
|
+
paths: 'src/**/*.txt',
|
39
|
+
// watch multiple file paths
|
40
|
+
paths: ['src/**/*.txt', 'public/**/*'],
|
41
|
+
},
|
42
|
+
},
|
43
|
+
};
|
44
|
+
```
|
45
|
+
|
46
|
+
You can also specify [chokidar](https://github.com/paulmillr/chokidar#api) watcher options by passing an object with `paths` and `options` properties.
|
47
|
+
|
48
|
+
```js
|
49
|
+
export default {
|
50
|
+
dev: {
|
51
|
+
watchFiles: {
|
52
|
+
paths: 'src/**/*.txt',
|
53
|
+
options: {
|
54
|
+
usePolling: false,
|
55
|
+
},
|
56
|
+
},
|
57
|
+
},
|
58
|
+
};
|
59
|
+
```
|
@@ -0,0 +1,38 @@
|
|
1
|
+
---
|
2
|
+
sidebar_label: writeToDisk
|
3
|
+
---
|
4
|
+
|
5
|
+
# dev.writeToDisk
|
6
|
+
|
7
|
+
- **Type:** `boolean | ((filename: string) => boolean)`
|
8
|
+
- **Default:** `(file) => !file.includes('.hot-update.')`
|
9
|
+
|
10
|
+
Used to control whether the build artifacts of the development environment are written to the disk.
|
11
|
+
|
12
|
+
## Writing to Memory
|
13
|
+
|
14
|
+
You can choose to save the build artifacts in the memory of the dev server, thereby reducing the overhead caused by file operations.
|
15
|
+
|
16
|
+
Simply set the `dev.writeToDisk` option to `false`:
|
17
|
+
|
18
|
+
```ts
|
19
|
+
export default {
|
20
|
+
dev: {
|
21
|
+
writeToDisk: false,
|
22
|
+
},
|
23
|
+
};
|
24
|
+
```
|
25
|
+
|
26
|
+
## Matching Specific Files
|
27
|
+
|
28
|
+
You can also set `dev.writeToDisk` to a function to match only certain files. When the function returns `false`, the file will not be written; when it returns `true`, the file will be written to disk.
|
29
|
+
|
30
|
+
For example, Modern.js by default write files to disk while excluding hot-update temporary files:
|
31
|
+
|
32
|
+
```ts
|
33
|
+
export default {
|
34
|
+
dev: {
|
35
|
+
writeToDisk: (file) => !file.includes('.hot-update.'),
|
36
|
+
},
|
37
|
+
};
|
38
|
+
```
|
@@ -247,7 +247,7 @@ In a multi-entry (MPA) scenario, the value of `routeId` needs to include the nam
|
|
247
247
|
|
248
248
|
If you want to get the data returned by the `loader` in `entry1/routes/layout.tsx`, the value of `routeId` is `entry1_layout`.
|
249
249
|
|
250
|
-
###
|
250
|
+
### Loading UI (Experimental)
|
251
251
|
|
252
252
|
:::info
|
253
253
|
This feature is currently experimental and the API may change in the future.
|
@@ -290,7 +290,7 @@ When accessing the route, you will get the following UI layout:
|
|
290
290
|
</RootLayout>
|
291
291
|
```
|
292
292
|
|
293
|
-
### (
|
293
|
+
### Loading (Experimental)
|
294
294
|
|
295
295
|
In each directory under `routes/`, developers can create a `loading.tsx` file that exports a `<Loading>` component by default.
|
296
296
|
|
@@ -0,0 +1,27 @@
|
|
1
|
+
---
|
2
|
+
sidebar_label: liveReload
|
3
|
+
---
|
4
|
+
|
5
|
+
# dev.liveReload
|
6
|
+
|
7
|
+
- **类型:** `boolean`
|
8
|
+
- **默认值:** `true`
|
9
|
+
|
10
|
+
是否在源文件变更时自动刷新页面。
|
11
|
+
|
12
|
+
默认情况下,Modern.js 会优先使用 HMR 来更新模块。当 HMR 功能被禁用,或者某些场景 HMR 无法生效时,会自动降级到 liveReload。
|
13
|
+
|
14
|
+
请查看 [模块热更新](https://rsbuild.dev/zh/guide/advanced/hmr) 来了解更多内容。
|
15
|
+
|
16
|
+
## 禁用 liveReload
|
17
|
+
|
18
|
+
如果你需要禁用 liveReload,可以将 `dev.hmr` 和 `dev.liveReload` 同时设置为 `false`,此时页面上不会发起 Web Socket 请求到 dev server,也不会在文件变更时自动刷新页面。
|
19
|
+
|
20
|
+
```js
|
21
|
+
export default {
|
22
|
+
dev: {
|
23
|
+
hmr: false,
|
24
|
+
liveReload: false,
|
25
|
+
},
|
26
|
+
};
|
27
|
+
```
|
@@ -0,0 +1,69 @@
|
|
1
|
+
---
|
2
|
+
sidebar_label: setupMiddlewares
|
3
|
+
---
|
4
|
+
|
5
|
+
# dev.setupMiddlewares
|
6
|
+
|
7
|
+
- **类型:**
|
8
|
+
|
9
|
+
```ts
|
10
|
+
type ServerAPIs = {
|
11
|
+
sockWrite: (
|
12
|
+
type: string,
|
13
|
+
data?: string | boolean | Record<string, any>,
|
14
|
+
) => void;
|
15
|
+
};
|
16
|
+
|
17
|
+
type SetupMiddlewares = Array<
|
18
|
+
(
|
19
|
+
middlewares: {
|
20
|
+
unshift: (...handlers: RequestHandler[]) => void;
|
21
|
+
push: (...handlers: RequestHandler[]) => void;
|
22
|
+
},
|
23
|
+
server: ServerAPIs,
|
24
|
+
) => void
|
25
|
+
>;
|
26
|
+
```
|
27
|
+
|
28
|
+
- **默认值:** `undefined`
|
29
|
+
|
30
|
+
提供执行自定义函数和应用自定义中间件的能力。
|
31
|
+
|
32
|
+
中间件的执行顺序是: `unshift` => 内置中间件 => `push`。
|
33
|
+
|
34
|
+
```js
|
35
|
+
export default {
|
36
|
+
dev: {
|
37
|
+
setupMiddlewares: [
|
38
|
+
(middlewares, server) => {
|
39
|
+
middlewares.unshift((req, res, next) => {
|
40
|
+
next();
|
41
|
+
});
|
42
|
+
|
43
|
+
middlewares.push((req, res, next) => {
|
44
|
+
next();
|
45
|
+
});
|
46
|
+
},
|
47
|
+
],
|
48
|
+
},
|
49
|
+
};
|
50
|
+
```
|
51
|
+
|
52
|
+
一些特殊场景需求可能需要使用服务器 API:
|
53
|
+
|
54
|
+
- sockWrite。允许向 HMR 客户端传递一些消息,HMR 客户端将根据接收到的消息类型进行不同的处理。如果你发送一个 "content-changed " 的消息,页面将会重新加载。
|
55
|
+
|
56
|
+
```js
|
57
|
+
export default {
|
58
|
+
dev: {
|
59
|
+
setupMiddlewares: [
|
60
|
+
(middlewares, server) => {
|
61
|
+
// 添加自定义 watcher 并在文件更新时触发页面刷新
|
62
|
+
watcher.on('change', (changed) => {
|
63
|
+
server.sockWrite('content-changed');
|
64
|
+
});
|
65
|
+
},
|
66
|
+
],
|
67
|
+
},
|
68
|
+
};
|
69
|
+
```
|
@@ -0,0 +1,59 @@
|
|
1
|
+
---
|
2
|
+
sidebar_label: watchFiles
|
3
|
+
---
|
4
|
+
|
5
|
+
# dev.watchFiles
|
6
|
+
|
7
|
+
- **类型:**
|
8
|
+
|
9
|
+
```ts
|
10
|
+
type WatchFiles = {
|
11
|
+
paths: string | string[];
|
12
|
+
// chokidar 选项
|
13
|
+
options?: WatchOptions;
|
14
|
+
};
|
15
|
+
```
|
16
|
+
|
17
|
+
- **默认值:** `undefined`
|
18
|
+
|
19
|
+
监视指定文件和目录的变化。当文件发生变化时,页面将重新加载。
|
20
|
+
|
21
|
+
如果 `dev.hmr` 和 `dev.liveReload` 都设置为 false,则 `watchFiles` 将被忽略。
|
22
|
+
|
23
|
+
:::tip
|
24
|
+
WatchFiles 中文件发生变化时,不会触发配置文件的重新加载及重新编译。
|
25
|
+
:::
|
26
|
+
|
27
|
+
### 示例
|
28
|
+
|
29
|
+
你可以配置一个 glob 模式 / 目录 / 文件的列表,用于监视文件变化。
|
30
|
+
|
31
|
+
```js
|
32
|
+
export default {
|
33
|
+
dev: {
|
34
|
+
watchFiles: {
|
35
|
+
// 监视单个文件
|
36
|
+
paths: 'public/demo.txt',
|
37
|
+
// 使用 glob 模式
|
38
|
+
paths: 'src/**/*.txt',
|
39
|
+
// 监视多个文件路径
|
40
|
+
paths: ['src/**/*.txt', 'public/**/*'],
|
41
|
+
},
|
42
|
+
},
|
43
|
+
};
|
44
|
+
```
|
45
|
+
|
46
|
+
你也可以通过传入一个包含 `paths` 和 `options` 属性的对象,来指定 [chokidar](https://github.com/paulmillr/chokidar#api) 选项。
|
47
|
+
|
48
|
+
```js
|
49
|
+
export default {
|
50
|
+
dev: {
|
51
|
+
watchFiles: {
|
52
|
+
paths: 'src/**/*.txt',
|
53
|
+
options: {
|
54
|
+
usePolling: false,
|
55
|
+
},
|
56
|
+
},
|
57
|
+
},
|
58
|
+
};
|
59
|
+
```
|
@@ -0,0 +1,38 @@
|
|
1
|
+
---
|
2
|
+
sidebar_label: writeToDisk
|
3
|
+
---
|
4
|
+
|
5
|
+
# dev.writeToDisk
|
6
|
+
|
7
|
+
- **类型:** `boolean | ((filename: string) => boolean)`
|
8
|
+
- **默认值:** `(file: string) => !file.includes('.hot-update.')`
|
9
|
+
|
10
|
+
用于控制是否将开发环境的构建产物写入到磁盘上。
|
11
|
+
|
12
|
+
## 写入内存
|
13
|
+
|
14
|
+
你可以选择将构建产物构建产物保存在 dev server 的内存中,从而减少文件操作产生的开销。
|
15
|
+
|
16
|
+
只需要将 `dev.writeToDisk` 配置项设置为 `false` 即可:
|
17
|
+
|
18
|
+
```ts
|
19
|
+
export default {
|
20
|
+
dev: {
|
21
|
+
writeToDisk: false,
|
22
|
+
},
|
23
|
+
};
|
24
|
+
```
|
25
|
+
|
26
|
+
## 匹配部分文件
|
27
|
+
|
28
|
+
你也可以将 `dev.writeToDisk` 设置为函数来匹配一部分文件,函数返回 `false` 时不会写入文件,返回值 `true` 时会将文件写入磁盘。
|
29
|
+
|
30
|
+
例如,Modern.js 会默认将文件写入磁盘,并排除热更新临时文件:
|
31
|
+
|
32
|
+
```ts
|
33
|
+
export default {
|
34
|
+
dev: {
|
35
|
+
writeToDisk: (file) => !file.includes('.hot-update.'),
|
36
|
+
},
|
37
|
+
};
|
38
|
+
```
|
package/package.json
CHANGED
@@ -15,17 +15,17 @@
|
|
15
15
|
"modern",
|
16
16
|
"modern.js"
|
17
17
|
],
|
18
|
-
"version": "2.
|
18
|
+
"version": "2.56.1",
|
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.56.1"
|
26
26
|
},
|
27
27
|
"peerDependencies": {
|
28
|
-
"@modern-js/builder-doc": "^2.
|
28
|
+
"@modern-js/builder-doc": "^2.56.1"
|
29
29
|
},
|
30
30
|
"devDependencies": {
|
31
31
|
"classnames": "^2",
|
@@ -35,12 +35,12 @@
|
|
35
35
|
"ts-node": "^10.9.1",
|
36
36
|
"typescript": "^5",
|
37
37
|
"fs-extra": "^10",
|
38
|
-
"rspress": "1.
|
39
|
-
"@rspress/shared": "1.
|
38
|
+
"rspress": "1.26.1",
|
39
|
+
"@rspress/shared": "1.26.1",
|
40
40
|
"@types/node": "^16",
|
41
41
|
"@types/fs-extra": "9.0.13",
|
42
|
-
"@modern-js/doc
|
43
|
-
"@modern-js/
|
42
|
+
"@modern-js/builder-doc": "2.56.1",
|
43
|
+
"@modern-js/doc-plugin-auto-sidebar": "2.56.1"
|
44
44
|
},
|
45
45
|
"scripts": {
|
46
46
|
"dev": "rspress dev",
|