@modern-js/main-doc 2.7.0 → 2.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +17 -0
  3. package/README.md +2 -2
  4. package/en/apis/app/commands.mdx +2 -0
  5. package/en/apis/app/runtime/model/connect.mdx +1 -1
  6. package/en/apis/app/runtime/model/model_.mdx +1 -1
  7. package/en/apis/app/runtime/model/use-model.mdx +1 -1
  8. package/en/apis/app/runtime/web-server/hook.mdx +2 -2
  9. package/en/apis/app/runtime/web-server/middleware.mdx +33 -9
  10. package/en/components/enable-bff.mdx +4 -4
  11. package/en/components/init-rspack-app.mdx +7 -0
  12. package/en/configure/app/bff/enable-handle-web.mdx +24 -0
  13. package/en/configure/app/server/enable-framework-ext.mdx +1 -1
  14. package/en/guides/advanced-features/bff/_category_.json +1 -1
  15. package/en/guides/advanced-features/eslint.mdx +30 -32
  16. package/en/guides/advanced-features/low-level.mdx +1 -1
  17. package/en/guides/advanced-features/rspack-start.mdx +13 -17
  18. package/en/guides/advanced-features/web-server.mdx +87 -20
  19. package/en/guides/concept/builder.mdx +1 -1
  20. package/en/guides/topic-detail/framework-plugin/extend.mdx +20 -19
  21. package/en/guides/topic-detail/framework-plugin/hook-list.mdx +156 -155
  22. package/en/guides/topic-detail/framework-plugin/hook.mdx +58 -43
  23. package/en/guides/topic-detail/framework-plugin/implement.mdx +47 -49
  24. package/en/guides/topic-detail/framework-plugin/introduction.mdx +22 -23
  25. package/en/guides/topic-detail/framework-plugin/plugin-api.mdx +13 -13
  26. package/en/guides/topic-detail/framework-plugin/relationship.mdx +30 -30
  27. package/en/guides/topic-detail/generator/plugin/develop.mdx +1 -1
  28. package/en/guides/topic-detail/micro-frontend/c01-introduction.mdx +17 -17
  29. package/en/guides/topic-detail/micro-frontend/c02-development.mdx +76 -78
  30. package/en/guides/topic-detail/micro-frontend/c03-main-app.mdx +57 -51
  31. package/en/guides/topic-detail/micro-frontend/c04-communicate.mdx +11 -11
  32. package/en/guides/topic-detail/micro-frontend/c05-mixed-stack.mdx +13 -13
  33. package/en/guides/topic-detail/model/auto-actions.mdx +18 -21
  34. package/en/guides/topic-detail/model/computed-state.mdx +27 -25
  35. package/en/guides/topic-detail/model/define-model.mdx +14 -14
  36. package/en/guides/topic-detail/model/faq.mdx +12 -13
  37. package/en/guides/topic-detail/model/manage-effects.mdx +43 -52
  38. package/en/guides/topic-detail/model/model-communicate.mdx +47 -45
  39. package/en/guides/topic-detail/model/performance.mdx +22 -23
  40. package/en/guides/topic-detail/model/quick-start.mdx +29 -28
  41. package/en/guides/topic-detail/model/redux-integration.mdx +7 -7
  42. package/en/guides/topic-detail/model/test-model.mdx +11 -11
  43. package/en/guides/topic-detail/model/typescript-best-practice.mdx +16 -15
  44. package/en/guides/topic-detail/model/use-model.mdx +40 -45
  45. package/en/guides/topic-detail/model/use-out-of-modernjs.mdx +16 -16
  46. package/en/guides/troubleshooting/cli.mdx +2 -2
  47. package/package.json +5 -5
  48. package/zh/apis/app/commands.mdx +2 -0
  49. package/zh/apis/app/runtime/model/connect.mdx +1 -1
  50. package/zh/apis/app/runtime/model/model_.mdx +1 -1
  51. package/zh/apis/app/runtime/model/use-model.mdx +1 -1
  52. package/zh/apis/app/runtime/web-server/hook.mdx +2 -4
  53. package/zh/apis/app/runtime/web-server/middleware.mdx +30 -10
  54. package/zh/apis/monorepo/commands/gen-release-note.mdx +3 -3
  55. package/zh/components/enable-bff.mdx +4 -4
  56. package/zh/components/init-rspack-app.mdx +7 -0
  57. package/zh/components/release-note.mdx +1 -1
  58. package/zh/configure/app/bff/enable-handle-web.mdx +24 -0
  59. package/zh/configure/app/server/enable-framework-ext.mdx +1 -1
  60. package/zh/guides/advanced-features/bff/_category_.json +1 -1
  61. package/zh/guides/advanced-features/rspack-start.mdx +13 -17
  62. package/zh/guides/advanced-features/web-server.mdx +81 -16
  63. package/zh/guides/concept/builder.mdx +1 -1
  64. package/zh/guides/topic-detail/changesets/github.mdx +2 -2
  65. package/zh/guides/topic-detail/changesets/release-note.mdx +1 -1
  66. package/zh/guides/topic-detail/framework-plugin/plugin-api.mdx +2 -2
  67. package/zh/guides/topic-detail/generator/plugin/develop.mdx +1 -1
  68. package/zh/guides/topic-detail/model/faq.mdx +1 -1
  69. package/zh/guides/topic-detail/model/manage-effects.mdx +1 -1
  70. package/zh/guides/topic-detail/model/model-communicate.mdx +1 -1
  71. package/zh/guides/topic-detail/model/performance.mdx +1 -1
  72. package/zh/guides/topic-detail/model/quick-start.mdx +2 -2
  73. package/zh/guides/topic-detail/model/use-model.mdx +3 -3
@@ -9,7 +9,7 @@ import ReduckTip from "@site-docs/components/reduck-tip"
9
9
  <ReduckTip />
10
10
 
11
11
  :::tip 提示
12
- Reduck 原始类型较为复杂,以下涉及类型定义的地方,展示的是简化后的类型信息。原始类型见 [model](https://github.com/modern-js-dev/reduck/blob/main/packages/store/src/model/useModel.ts)。
12
+ Reduck 原始类型较为复杂,以下涉及类型定义的地方,展示的是简化后的类型信息。原始类型见 [model](https://github.com/web-infra-dev/reduck/blob/main/packages/store/src/model/useModel.ts)。
13
13
 
14
14
  :::
15
15
 
@@ -3,11 +3,10 @@ title: Hook
3
3
  ---
4
4
  # Hook
5
5
 
6
- 用于拓展 Modern.js 内置的 Web Server,非 BFF 请求会经过这些中 Hook 的处理。
6
+ 用于拓展 Modern.js 内置的 Web Server,所有的页面请求都会经过 Hook
7
7
 
8
8
  :::note
9
9
  更多内容可以查看[自定义 Web Server](/guides/advanced-features/web-server)。
10
-
11
10
  :::
12
11
 
13
12
  ## 使用姿势
@@ -27,7 +26,6 @@ pnpm run new
27
26
  ? 请选择你想要的操作 创建工程元素
28
27
  ? 新建「自定义 Web Server」源码目录
29
28
  ```
30
-
31
29
  :::
32
30
 
33
31
  ## 函数签名
@@ -64,7 +62,7 @@ type HookContext = {
64
62
  function Hook(context: HookContext, next: NextFunction): Promsie<void> | void;
65
63
  ```
66
64
 
67
- 另外,不同 Hook 额外提供了不同的上下文。目前 Modern.js 支持 `AtferMatch` 和 `AfterRender` 两个 Hook。
65
+ 另外,不同 Hook 额外提供了不同的上下文。目前 Modern.js 支持 `AfterMatch` 和 `AfterRender` 两个 Hook。
68
66
 
69
67
  ```ts
70
68
  type AfterMatchContext = HookContext & {
@@ -3,13 +3,10 @@ title: Middleware
3
3
  ---
4
4
  # Middleware
5
5
 
6
- 用于拓展 Modern.js 内置的 Web Server,只有 SSR 请求会经过这些中间件。
7
-
8
- 与 [Hook](/apis/app/runtime/web-server/hook) 不同的是,Middleware 可以使用 Server 运行时框架拓展。
6
+ 用于拓展 Modern.js 内置的 Web Server,与 [Hook](/apis/app/runtime/web-server/hook) 不同的是,Middleware 可以直接操作 Node 原生的请求、响应对象,并且可以使用框架拓展。
9
7
 
10
8
  :::note
11
9
  更多内容可以查看[自定义 Web Server](/guides/advanced-features/web-server)。
12
-
13
10
  :::
14
11
 
15
12
  ## 使用姿势
@@ -38,6 +35,11 @@ pnpm run new
38
35
  ## 函数签名
39
36
 
40
37
  ```ts
38
+ type Middleware = (
39
+ context: MiddlewareContext,
40
+ next: NextFunction,
41
+ ) => Promise<void> | void;
42
+
41
43
  type MiddlewareContext = {
42
44
  response: {
43
45
  set: (key: string, value: string) => void;
@@ -71,11 +73,6 @@ type MiddlewareContext = {
71
73
  res: ServerResponse;
72
74
  };
73
75
  };
74
-
75
- type RequestHandler = (
76
- context: Context,
77
- next: NextFunction,
78
- ) => Promise<void> | void;
79
76
  ```
80
77
 
81
78
  ### 参数
@@ -86,6 +83,10 @@ type RequestHandler = (
86
83
  - `source`:提供 Node.js 原生的 `req` 与 `res` 对象。
87
84
  - `next`:执行当前 Hook 的下一个监听函数(不影响整体服务端流程)。
88
85
 
86
+ :::warning
87
+ `next` 函数的执行不影响后续内置流程,只控制下一个中间件是否执行。只有当响应被写入时,后续渲染流程才会中断。
88
+ :::
89
+
89
90
  ## 示例
90
91
 
91
92
  ### 服务端耗时打点
@@ -107,5 +108,24 @@ Modern.js 提供了 `res.locals` 属性用来存放当前请求的局部变量
107
108
  export const Middleware = () => async (ctx, next) => {
108
109
  ctx.res.locals.id = 'Modern.js';
109
110
  ctx.res.locals.rpc = createRpcInstance();
110
- });
111
+ };
111
112
  ```
113
+
114
+ ### 框架拓展
115
+
116
+ Middleware 还可以和 BFF 一样,使用运行时框架拓展。Modern.js 约定,当使用框架运行时拓展时,类型信息从 `@modern-js/runtime/{namespace}` 下导出,Middleware 可以使用框架语法,例如框架中间件写法,以下是伪代码:
117
+
118
+ ```ts
119
+ import { SomeType } from '@modern-js/runtime/{namespace}';
120
+
121
+ export const middleware: SomeType = (ctx, next) => {
122
+ console.log(ctx.url);
123
+ next();
124
+ };
125
+ ```
126
+
127
+ 默认情况下,在安装框架拓展插件后,Web Server 的框架拓展能力是关闭的。如果希望使用框架拓展,可以通过 [`server.enableFrameworkExt`](/configure/app/server/enable-framework-ext.html) 开启。
128
+
129
+ :::info
130
+ 框架拓展导出的类型名不一定为 Middleware,命名由框架拓展插件。
131
+ :::
@@ -9,7 +9,7 @@ Usage: modern gen-release-note [options]
9
9
  根据当前仓库 changeset 文件生成 Release Note
10
10
 
11
11
  Options:
12
- --repo <repo> 仓库名称,用于生成 Pull Request 链接, 例如: modern-js-dev/modern.js
12
+ --repo <repo> 仓库名称,用于生成 Pull Request 链接, 例如: web-infra-dev/modern.js
13
13
  --custom <cumtom> 自定义 Release Note 生成函数
14
14
  -h, --help display help for command
15
15
  ```
@@ -24,9 +24,9 @@ Options:
24
24
  ```markdown
25
25
  ## Features:
26
26
 
27
- [[#1160](https://github.com/modern-js-dev/modern.js/pull/1160)] export ExecaError type
27
+ [[#1160](https://github.com/web-infra-dev/modern.js/pull/1160)] export ExecaError type
28
28
 
29
29
  ## Bug Fix:
30
30
 
31
- [[#1264](https://github.com/modern-js-dev/modern.js/pull/1264)] fix: conventional router app use App.init not work
31
+ [[#1264](https://github.com/web-infra-dev/modern.js/pull/1264)] fix: conventional router app use App.init not work
32
32
  ```
@@ -7,8 +7,8 @@ import { Tabs, Tab as TabItem } from "@theme";
7
7
  <TabItem value="express" label="Express.js" default>
8
8
 
9
9
  ```ts title="edenx.config.ts"
10
- import expressPlugin from '@edenx/plugin-express';
11
- import bffPlugin from '@edenx/plugin-bff';
10
+ import expressPlugin from '@modern-js/plugin-express';
11
+ import bffPlugin from '@modern-js/plugin-bff';
12
12
 
13
13
  export default defineConfig({
14
14
  plugins: [expressPlugin(), bffPlugin()],
@@ -19,8 +19,8 @@ export default defineConfig({
19
19
  <TabItem value="koa" label="Koa.js">
20
20
 
21
21
  ```ts title="edenx.config.ts"
22
- import koaPlugin from '@edenx/plugin-koa';
23
- import bffPlugin from '@edenx/plugin-bff';
22
+ import koaPlugin from '@modern-js/plugin-koa';
23
+ import bffPlugin from '@modern-js/plugin-bff';
24
24
 
25
25
  export default defineConfig({
26
26
  plugins: [koaPlugin(), bffPlugin()],
@@ -0,0 +1,7 @@
1
+ ```bash
2
+ $ npx @modern-js/create myapp
3
+ ? 请选择你想创建的工程类型 应用
4
+ ? 请选择开发语言 TS
5
+ ? 请选择包管理工具 pnpm
6
+ ? 请选择构建工具 Rspack
7
+ ```
@@ -1 +1 @@
1
- 根据官网 [Release Note](https://github.com/modern-js-dev/modern.js/releases),开发者也可以手动将项目升级到想要的版本。
1
+ 根据官网 [Release Note](https://github.com/web-infra-dev/modern.js/releases),开发者也可以手动将项目升级到想要的版本。
@@ -0,0 +1,24 @@
1
+ ---
2
+ title: enableHandleWeb
3
+ ---
4
+
5
+ # bff.enableHandleWeb
6
+
7
+ - **类型:** `boolean`
8
+ - **默认值:** `false`
9
+
10
+ :::caution 注意
11
+ 请先在当前应用项目根目录使用【[new](/apis/app/commands#modern-new)】 启用 BFF 功能。
12
+ :::
13
+
14
+ 默认情况下,BFF 服务只能处理 BFF API 的请求。
15
+
16
+ 当该值设置为 `true` 时,页面请求流量也会经过 BFF,并且 Modern.js 内置的页面渲染的逻辑默认会作为 BFF 服务的最后一个中间件运行。
17
+
18
+ ```ts title="modern.config.ts"
19
+ export default defineConfig({
20
+ bff: {
21
+ enableHandleWeb: true,
22
+ },
23
+ });
24
+ ```
@@ -35,7 +35,7 @@ export const middleware: Middleware = (ctx, next) => {
35
35
  开启后,Middleware 类型将从其他命名空间下导出,并且可以使用框架拓展的语法:
36
36
 
37
37
  ```ts title="server/index.ts"
38
- import { SomeType } from '@modern-js/runtime/{frameworknName}';
38
+ import { SomeType } from '@modern-js/runtime/{namespace}';
39
39
 
40
40
  export const middleware: SomeType = (...args) => {
41
41
  console.log(args[0].url);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "label": "BFF",
3
- "position": 1,
3
+ "position": 2,
4
4
  "link": {
5
5
  "type": "doc",
6
6
  "id": "guides/advanced-features/bff/index"
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  title: 使用 Rspack
3
- sidebar_position: 12
3
+ sidebar_position: 1
4
4
  ---
5
5
 
6
6
  # 使用 Rspack
7
7
 
8
- [Rspack](https://www.rspack.org/) 是字节跳动 Web Infra 团队自研的 Rust Bundler,核心架构对齐 webpack 实现,并对社区常用的构建能力做了开箱即用的支持。
8
+ [Rspack](https://www.rspack.dev/) 是字节跳动 Web Infra 团队自研的 Rust Bundler,核心架构对齐 webpack 实现,并对社区常用的构建能力做了开箱即用的支持。
9
9
 
10
10
  Rspack 通过以下方式来提升编译性能:
11
11
 
@@ -13,22 +13,18 @@ Rspack 通过以下方式来提升编译性能:
13
13
  - 充分利用多核优势,整个编译过程充分进行多线程优化。
14
14
  - 基于请求的按需编译(Lazy Compilation),减小每次编译的模块数目,以提升冷启动的速度。
15
15
 
16
- ## 初始化 rspack 项目
16
+ ## 初始化 Rspack 项目
17
17
 
18
- Modern.js 生成器会提供一个可交互的问答界面,只需将构建工具选择为**rspack**,即可创建一个 rspack 项目:
18
+ Modern.js 生成器会提供一个可交互的问答界面,只需将构建工具选择为 **Rspack**,即可创建一个 Rspack 项目:
19
19
 
20
- ```bash
21
- $ npx @modern-js/create myapp
22
- ? 请选择你想创建的工程类型 应用
23
- ? 请选择开发语言 TS
24
- ? 请选择包管理工具 pnpm
25
- ? 请选择构建工具 rspack
26
- ```
20
+ import InitRspackApp from "@site-docs/components/init-rspack-app"
21
+
22
+ <InitRspackApp />
27
23
 
28
24
  项目创建完成后,在项目中执行 `pnpm run dev` 即可体验项目。更多项目信息可参考[快速上手](/guides/get-started/quick-start.html)。
29
25
 
30
26
  :::tip
31
- 使用 rspack 作为打包工具时,以下功能暂不支持使用:
27
+ 使用 Rspack 作为打包工具时,以下功能暂不支持使用:
32
28
 
33
29
  - 服务端渲染(SSR)
34
30
  - 静态站点生成(SSG)
@@ -37,17 +33,17 @@ $ npx @modern-js/create myapp
37
33
 
38
34
  :::
39
35
 
40
- ## 从 webpack 迁移至 rspack
36
+ ## 从 webpack 迁移至 Rspack
41
37
 
42
- 通过执行 `pnpm run new` 可启用 rspack 构建:
38
+ 通过执行 `pnpm run new` 可启用 Rspack 构建:
43
39
 
44
40
  ```bash
45
41
  $ pnpm run new
46
42
  ? 请选择你想要的操作 启用可选功能
47
- ? 启用可选功能 启用「rspack 构建」
43
+ ? 启用可选功能 启用「Rspack 构建」
48
44
  ```
49
45
 
50
- 执行命令后,在 modern.config.ts 中开启 rspack 构建:
46
+ 执行命令后,在 modern.config.ts 中开启 Rspack 构建:
51
47
 
52
48
  ```ts title=modern.config.ts
53
49
  import appTools, { defineConfig } from '@modern-js/app-tools';
@@ -65,5 +61,5 @@ export default defineConfig<'rspack'>({
65
61
  ```
66
62
 
67
63
  :::tip
68
- 从 webpack 迁移至 rspack,会有一些构建和配置能力上的差异,详情可参考:[配置差异](https://modernjs.dev/builder/guide/advanced/rspack-start.html#从-webpack-迁移到-rspack)
64
+ 从 webpack 迁移至 Rspack,会有一些构建和配置能力上的差异,详情可参考:[配置差异](https://modernjs.dev/builder/guide/advanced/rspack-start.html#从-webpack-迁移到-rspack)
69
65
  :::
@@ -1,23 +1,35 @@
1
1
  ---
2
2
  title: 自定义 Web Server
3
- sidebar_position: 2
3
+ sidebar_position: 3
4
4
  ---
5
5
  # 自定义 Web Server
6
6
 
7
7
  Modern.js 作为以客户端为中心的开发框架,对服务端的定制能力较弱。而在有些开发场景下,需要定制特殊的服务端逻辑,例如用户鉴权、请求预处理、添加页面渲染骨架等。
8
8
 
9
- 因此 Modern.js 提供了一种功能,让项目可以在给定的范围内扩展 Modern.js 内置的 Web Server,来实现相应的需求。
9
+ 一些开发者可能会有疑惑,Modern.js 已经提供了 [BFF 能力](/guides/advanced-features/bff/function.html),为什么还需要**自定义 Web Server**。
10
10
 
11
- ## 创建自定义 Web Server
11
+ 因为在默认情况下,页面路由并不会经过 BFF,它没有办法为页面访问提供服务端的定制逻辑。之所以这样设计,是因为我们不希望控制页面的服务与 BFF 服务绑定在一起,避免 BFF 的框架限制页面的部署方式。例如将页面与 BFF 分开托管、将页面服务部署到非 Node 的环境上,或是针对部署平台做定制等。
12
12
 
13
- 在项目根目录执行 `pnpm run new` 命令,按照如下选择,开启「自定义 Web Serve」功能:
13
+ 出于上述原因,Modern.js 提供了三种方式,让项目可以在根据需求,渐进式的定制服务端能力。
14
+
15
+ :::warning
16
+ 三种扩展方式无法同时工作,开发者需要根据场景选择合适的方式。
17
+ :::
18
+
19
+ ## 使用 API 扩展 Web Server
20
+
21
+ 第一种方式是通过 Modern.js 提供的服务端运行时 API,在特定的生命周期对服务端进行定制。提供这种方式的目的是在部分情况下,开发者并不需要控制完整的 Web Server,只需要添加服务端逻辑即可。
22
+
23
+ 这种方式无法控制完整的 Web Server,并且扩展逻辑**只在请求页面时生效**。因此,它适用于服务端逻辑相对简单,不希望额外创建 BFF 或者 BFF 和页面无需公用服务端逻辑场景。
24
+
25
+ 可以在项目根目录执行 `pnpm run new` 命令,开启「自定义 Web Serve」功能:
14
26
 
15
27
  ```bash
16
28
  ? 请选择你想要的操作 创建工程元素
17
29
  ? 创建工程元素 新建「自定义 Web Server」源码目录
18
30
  ```
19
31
 
20
- 执行命令后,在 `modern.config.ts` 中注册 Server 插件:
32
+ 执行命令后,在 `modern.config.ts` 中注册 `@modern-js/plugin-server` 插件:
21
33
 
22
34
  ```ts title="modern.config.ts"
23
35
  import serverPlugin from '@modern-js/plugin-server';
@@ -27,31 +39,84 @@ export default defineConfig({
27
39
  });
28
40
  ```
29
41
 
30
- 项目目录下会新建 `server/index.ts` 文件,自定义逻辑在这个文件中编写。
42
+ 开启功能后,项目目录下会自动创建 `server/index.ts` 文件,可以在这个文件中编写自定义逻辑。Modern.js 提供了 **Hook** 与 **Middleware** 两类 API 来扩展 Web Server。
31
43
 
32
- ## 使用 API 扩展 Web Server
44
+ ### Hook
33
45
 
34
- Modern.js 提供了 **Hook** **Middleware** 两类 API 来扩展 Web Server
46
+ Modern.js 提供的 Hook 用于控制 Web Server 中的内置逻辑,所有的页面请求都会经过 Hook
35
47
 
36
- ### Hook
48
+ 目前提供了两种 Hook,分别是 `AfterMatch` 和 `AfterRender`,可以用于修改渲染结果。可以在 `server/index.ts` 中这样写:
49
+
50
+ ```ts
51
+ import type { AfterMatchHook, AfterRenderHook } from '@modern-js/runtime/server';
52
+
53
+ export const afterMatch: AfterMatchHook = (ctx, next) => {
54
+ next();
55
+ }
56
+
57
+ export const afterRender: AfterRenderHook = (ctx, next) => {
58
+ next();
59
+ }
60
+ ```
37
61
 
38
- Hook 可以控制 Web Server 对请求处理的内置逻辑,非 BFF 请求会经过 Hook 的处理。
62
+ 项目在使用 Hook 时,应该有以下最佳实践:
39
63
 
40
- Hook 不可以使用运行时框架拓展。
64
+ 1. 在 afterMatch 中做权限校验。
65
+ 2. 在 afterMatch 做 Rewrite 和 Redirect。
66
+ 3. 在 afterRender 中做 HTML 内容注入。
41
67
 
42
- 详细 API 可以查看 [Hook](/apis/app/runtime/web-server/hook)。
68
+ :::note
69
+ 详细 API 和更多用法可以查看 [Hook](/apis/app/runtime/web-server/hook)。
70
+ :::
43
71
 
44
72
  ### Middleware
45
73
 
46
- Middleware 可以为 Web Server 添加前置中间件,只有 SSR 请求会经过 Middleware 的处理。
74
+ 对于某些项目,可能在服务端有更多的需求,Modern.js 提供了 Middleware Web Server 添加前置中间件。它只能运行在 Node 环境下,因此如果项目被部署到其他环境中,如 Worker 环境,则不可以使用 Middleware
75
+
76
+ Modern.js 默认提供了一套 API 供项目使用:
47
77
 
48
- Middleware 可以使用运行时框架拓展。
78
+ ```ts
79
+ import { Middlewre } from '@modern-js/runtime/server';
49
80
 
50
- 详细 API 可以查看 [Hook](/apis/app/runtime/web-server/middleware)
81
+ export const middleware = (context, next) => {
82
+ const { source: { req, res } } = context;
83
+ console.log(req.url);
84
+ next();
85
+ };
86
+ ```
87
+
88
+ :::note
89
+ 详细 API 和更多用法可以查看 [Middleware](/apis/app/runtime/web-server/middleware)。
90
+ :::
91
+
92
+ 项目在使用 Middleware 时,应该有以下最佳实践:
93
+
94
+ 1. 在 Middleware 中可以直接操作原生的请求、响应对象,做数据打点、注入 SSR 渲染可能用到的 Node 服务(数据库、Redis 等)。
95
+ 2. 在 Middleware 里可以做类似功能打标、爬虫优化等功能。
96
+ 3. 在 Middleware 里可以无视后续默认渲染,自定义渲染流程。
97
+
98
+ **总的来说,CSR 项目中,使用 Hook 基本能满足简单场景的所有需求。SSR 项目中,可以使用 Middleware 做更复杂的 Node 扩展。**
99
+
100
+ ## 通过 BFF 托管页面请求
101
+
102
+ 第二种方式,是利用 BFF 来托管页面渲染,这种方式下,所有的请求都会先打到 BFF 的服务。
103
+
104
+ 因为这种方式可以通过 BFF 统一控制所有请求的服务端逻辑。因此,它适用于服务端逻辑复杂,BFF 和页面需要公用服务端逻辑的场景。但它整体还是依托于 Modern.js 的 Web Server 运行,无法将逻辑运行在已有的服务上。
105
+
106
+ 使用这种方式,我们需要先通过 `pnpm new` 开启「BFF」功能。然后在配置文件中添加 [`bff.enableHandleWeb`](/configure/app/bff/enable-handle-web.html) 配置:
107
+
108
+ ```ts
109
+ export default defineConfig({
110
+ bff: {
111
+ enableHandleWeb: true,
112
+ },
113
+ });
114
+ ```
115
+
116
+ 当该值设置为 `true` 时,页面请求流量也会经过 BFF,并且 Modern.js 内置的页面渲染的逻辑默认会作为 BFF 服务的最后一个中间件运行。
51
117
 
52
118
  ## 完全自定义的 Web Server
53
119
 
54
120
  :::note
55
121
  敬请期待
56
-
57
122
  :::
@@ -6,7 +6,7 @@ sidebar_position: 2
6
6
 
7
7
  **Modern.js 的构建能力由 [Modern.js Builder](https://modernjs.dev/builder) 提供。**
8
8
 
9
- Modern.js Builder 是 Modern.js 体系的核心组件之一,它是一个面向 Web 开发场景的构建引擎,可以脱离 Modern.js 被独立使用。Modern.js Builder 同时支持 webpack 和 rspack 等多种打包工具,默认情况下使用最成熟的 webpack 进行打包。
9
+ Modern.js Builder 是 Modern.js 体系的核心组件之一,它是一个面向 Web 开发场景的构建引擎,可以脱离 Modern.js 被独立使用。Modern.js Builder 同时支持 webpack 和 Rspack 等多种打包工具,默认情况下使用最成熟的 webpack 进行打包。
10
10
 
11
11
  ## 构建架构
12
12
 
@@ -72,7 +72,7 @@ jobs:
72
72
  fetch-depth: 100
73
73
 
74
74
  - name: Create Release Pull Request
75
- uses: modern-js-dev/actions@main
75
+ uses: web-infra-dev/actions@main
76
76
  with:
77
77
  # this expects you to have a script called release which does a build for your packages and calls changeset publish
78
78
  versionNumber: ${{ github.event.inputs.version }}
@@ -136,7 +136,7 @@ jobs:
136
136
  fetch-depth: 1
137
137
 
138
138
  - name: Release
139
- uses: modern-js-dev/actions@main
139
+ uses: web-infra-dev/actions@main
140
140
  with:
141
141
  # this expects you to have a script called release which does a build for your packages and calls changeset publish
142
142
  version: ${{ github.event.inputs.version }}
@@ -9,7 +9,7 @@ Modern.js 提供了 `modern gen-release-note` 命令,支持通过当前存在
9
9
  默认生成的 Release Note 格式为:
10
10
 
11
11
  ```markdown
12
- [[#1220](https://github.com/modern-js-dev/modern.js/pull/1220)] feat: support bff operators -- Ming
12
+ [[#1220](https://github.com/web-infra-dev/modern.js/pull/1220)] feat: support bff operators -- Ming
13
13
  ```
14
14
 
15
15
  根据 commit 信息获取 changeset 的 Pull Request ID,并生成 Github 的链接,内容为 changeset 的 changelog 信息和作者信息。
@@ -45,7 +45,7 @@ interface UserConfig {
45
45
  }
46
46
  ```
47
47
 
48
- 具体配置字段的意义请参考【[配置](/configure/app/source/alias)】。
48
+ 具体配置字段的意义请参考【[配置](/configure/app/usage)】。
49
49
 
50
50
  ### useAppContext
51
51
 
@@ -96,7 +96,7 @@ interface NormalizedConfig {
96
96
  }
97
97
  ```
98
98
 
99
- 具体配置字段的意义请参考【[配置](/configure/app/source/alias)】。
99
+ 具体配置字段的意义请参考【[配置](/configure/app/usage)】。
100
100
 
101
101
  ### useHookRunners
102
102
 
@@ -43,7 +43,7 @@ npx @modern-js/create plugin --plugin @modern-js/generator-plugin-plugin
43
43
  创建项目命令执行完成后,会对应的生成一个开发生成器插件的项目,`package.json` 中也会根据你的选择对应的生成 `meta` 信息。
44
44
 
45
45
  :::info
46
- 生成器插件开发可参考 `@modern-js/generator-plugin-plugin` [源码地址](https://github.com/modern-js-dev/modern.js/tree/main/packages/generator/plugins/generator-plugin)
46
+ 生成器插件开发可参考 `@modern-js/generator-plugin-plugin` [源码地址](https://github.com/web-infra-dev/modern.js/tree/main/packages/generator/plugins/generator-plugin)
47
47
 
48
48
  :::
49
49
 
@@ -10,7 +10,7 @@ title: 常见问题
10
10
  Reduck 的编译构建产物默认使用 ES6 语法,如果你需要支持更低版本的浏览器,请将 `@modern-js-reduck` 命名空间下的所有包加入到应用的编译过程。
11
11
 
12
12
  :::info 补充信息
13
- Reduck 使用的 [`@babel/preset-env`](https://babeljs.io/docs/en/babel-preset-env) 的详细[配置](https://github.com/modern-js-dev/reduck/blob/main/common/config.js#L10~L17)。
13
+ Reduck 使用的 [`@babel/preset-env`](https://babeljs.io/docs/en/babel-preset-env) 的详细[配置](https://github.com/web-infra-dev/reduck/blob/main/common/config.js#L10~L17)。
14
14
 
15
15
  :::
16
16
 
@@ -255,6 +255,6 @@ const handleClick = async () => {
255
255
  ```
256
256
 
257
257
  :::info 补充信息
258
- [示例代码](https://github.com/modern-js-dev/modern-js-examples/tree/main/series/tutorials/runtime-api/model/effects)
258
+ [示例代码](https://github.com/web-infra-dev/modern-js-examples/tree/main/series/tutorials/runtime-api/model/effects)
259
259
 
260
260
  :::
@@ -100,7 +100,7 @@ Modern.js 默认开启 [自动生成 actions](./auto-actions.mdx),所以 `step
100
100
  ![communicate-models](https://lf3-static.bytednsdoc.com/obj/eden-cn/aphqeh7uhohpquloj/modern-js/docs/models-communicate.gif)
101
101
 
102
102
  :::info 补充信息
103
- - 本节完整的[示例代码](https://github.com/modern-js-dev/modern-js-examples/tree/main/series/tutorials/runtime-api/model/models-communication)。
103
+ - 本节完整的[示例代码](https://github.com/web-infra-dev/modern-js-examples/tree/main/series/tutorials/runtime-api/model/models-communication)。
104
104
  - 相关 API 的更多介绍,请参考:[model](/apis/app/runtime/model/model_#函数类型)。
105
105
 
106
106
  :::
@@ -166,6 +166,6 @@ const barModel = model("bar").define({
166
166
  我们创建缓存函数 `createSelector`,仅当 `barModel` 的状态发生改变或 `fooModel` 的 `a` 状态发生改变时,才会重新计算 `combineA` 的值。
167
167
 
168
168
  :::info 补充信息
169
- 本节完整的[示例代码](https://github.com/modern-js-dev/modern-js-examples/tree/main/series/tutorials/runtime-api/model/performance-optimization)
169
+ 本节完整的[示例代码](https://github.com/web-infra-dev/modern-js-examples/tree/main/series/tutorials/runtime-api/model/performance-optimization)
170
170
 
171
171
  :::
@@ -8,7 +8,7 @@ import ReduckMigration from "@site-docs/components/reduck-migration"
8
8
 
9
9
  <ReduckMigration />
10
10
 
11
- [Reduck](https://github.com/modern-js-dev/reduck) 是 Modern.js 团队开发的遵循 MVC 模式的状态管理库,底层状态存储基于 [Redux](https://redux.js.org/) 实现,同时提供更高层级的抽象,并完全兼容 Redux 生态。
11
+ [Reduck](https://github.com/web-infra-dev/reduck) 是 Modern.js 团队开发的遵循 MVC 模式的状态管理库,底层状态存储基于 [Redux](https://redux.js.org/) 实现,同时提供更高层级的抽象,并完全兼容 Redux 生态。
12
12
 
13
13
  Reduck 的目标是以 MVC 模式组织 React 应用开发结构,将业务逻辑维护在 Model 层,业务逻辑与 UI 解耦,让开发业务逻辑更集中、更简单,同时通过更高层级的抽象,减少重复工作(样板代码)。
14
14
 
@@ -110,4 +110,4 @@ function Counter() {
110
110
 
111
111
  ![countModel](https://lf3-static.bytednsdoc.com/obj/eden-cn/eueh7vhojuh/modern/simple-count-model.gif)
112
112
 
113
- 这样,我们就完了一个简单的计数器应用。本节完整的示例代码可以在[这里](https://github.com/modern-js-dev/modern-js-examples/tree/main/series/tutorials/runtime-api/model/counter-model)查看。
113
+ 这样,我们就完了一个简单的计数器应用。本节完整的示例代码可以在[这里](https://github.com/web-infra-dev/modern-js-examples/tree/main/series/tutorials/runtime-api/model/counter-model)查看。
@@ -163,7 +163,7 @@ function ThreeComponent() {
163
163
 
164
164
  使用 React 的 refs 也可以实现类似效果,其实 `useStaticModel` 内部也使用到了 refs。不过直接 `useStaticModel` 有助于将状态的管理逻辑从组件中解耦,统一收敛到 Model 层。
165
165
 
166
- 完整的示例代码可以在[这里](https://github.com/modern-js-dev/modern-js-examples/tree/main/series/tutorials/runtime-api/model/static-model)查看。
166
+ 完整的示例代码可以在[这里](https://github.com/web-infra-dev/modern-js-examples/tree/main/series/tutorials/runtime-api/model/static-model)查看。
167
167
 
168
168
  ### 作为局部状态使用
169
169
 
@@ -195,7 +195,7 @@ function LocalCounter() {
195
195
 
196
196
  ![local-model](https://lf3-static.bytednsdoc.com/obj/eden-cn/eueh7vhojuh/modern/local-model.gif)
197
197
 
198
- 完整的示例代码可以在[这里](https://github.com/modern-js-dev/modern-js-examples/tree/main/series/tutorials/runtime-api/model/local-model)查看。
198
+ 完整的示例代码可以在[这里](https://github.com/web-infra-dev/modern-js-examples/tree/main/series/tutorials/runtime-api/model/local-model)查看。
199
199
 
200
200
  ## 在组件外使用
201
201
 
@@ -239,7 +239,7 @@ setInterval(() => {
239
239
  }, 1000);
240
240
  ```
241
241
 
242
- 完整的示例代码可以在[这里](https://github.com/modern-js-dev/modern-js-examples/tree/main/series/tutorials/runtime-api/model/counter-model-outof-react)查看。
242
+ 完整的示例代码可以在[这里](https://github.com/web-infra-dev/modern-js-examples/tree/main/series/tutorials/runtime-api/model/counter-model-outof-react)查看。
243
243
 
244
244
  :::info
245
245
  如果是通过 [`createStore`](/apis/app/runtime/model/create-store) 手动创建的 Store 对象,无需通过 `useStore` 在组件内获取,即可直接使用。