@modern-js/main-doc 2.67.5 → 2.67.7

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 (208) hide show
  1. package/docs/en/apis/app/hooks/server/server.mdx +10 -0
  2. package/docs/en/apis/app/hooks/src/routes.mdx +3 -73
  3. package/docs/en/apis/app/runtime/bff/use-hono-context.mdx +30 -0
  4. package/docs/en/components/enable-bff.mdx +1 -27
  5. package/docs/en/components/rsbuild-config-tooltip.mdx +2 -2
  6. package/docs/en/components/tech-stack-node-framework.mdx +1 -1
  7. package/docs/en/configure/app/dev/asset-prefix.mdx +2 -3
  8. package/docs/en/configure/app/dev/client.mdx +2 -3
  9. package/docs/en/configure/app/dev/hmr.mdx +2 -3
  10. package/docs/en/configure/app/dev/live-reload.mdx +2 -3
  11. package/docs/en/configure/app/dev/progress-bar.mdx +2 -3
  12. package/docs/en/configure/app/dev/setup-middlewares.mdx +2 -3
  13. package/docs/en/configure/app/dev/watch-files.mdx +2 -3
  14. package/docs/en/configure/app/dev/write-to-disk.mdx +2 -3
  15. package/docs/en/configure/app/html/app-icon.mdx +2 -3
  16. package/docs/en/configure/app/html/crossorigin.mdx +2 -3
  17. package/docs/en/configure/app/html/favicon.mdx +2 -3
  18. package/docs/en/configure/app/html/inject.mdx +2 -3
  19. package/docs/en/configure/app/html/meta.mdx +2 -3
  20. package/docs/en/configure/app/html/mount-id.mdx +2 -3
  21. package/docs/en/configure/app/html/output-structure.mdx +2 -3
  22. package/docs/en/configure/app/html/script-loading.mdx +2 -3
  23. package/docs/en/configure/app/html/tags.mdx +2 -3
  24. package/docs/en/configure/app/html/template-parameters.mdx +2 -3
  25. package/docs/en/configure/app/html/template.mdx +2 -3
  26. package/docs/en/configure/app/html/title.mdx +2 -3
  27. package/docs/en/configure/app/output/asset-prefix.mdx +2 -3
  28. package/docs/en/configure/app/output/charset.mdx +2 -3
  29. package/docs/en/configure/app/output/copy.mdx +2 -3
  30. package/docs/en/configure/app/output/css-modules.mdx +2 -3
  31. package/docs/en/configure/app/output/data-uri-limit.mdx +2 -3
  32. package/docs/en/configure/app/output/dist-path.mdx +2 -4
  33. package/docs/en/configure/app/output/externals.mdx +2 -3
  34. package/docs/en/configure/app/output/filename-hash.mdx +2 -3
  35. package/docs/en/configure/app/output/filename.mdx +2 -3
  36. package/docs/en/configure/app/output/inject-styles.mdx +2 -3
  37. package/docs/en/configure/app/output/inline-scripts.mdx +2 -3
  38. package/docs/en/configure/app/output/inline-styles.mdx +2 -3
  39. package/docs/en/configure/app/output/legal-comments.mdx +2 -3
  40. package/docs/en/configure/app/output/minify.mdx +2 -3
  41. package/docs/en/configure/app/output/override-browserslist.mdx +2 -3
  42. package/docs/en/configure/app/output/polyfill.mdx +2 -3
  43. package/docs/en/configure/app/output/source-map.mdx +2 -3
  44. package/docs/en/configure/app/performance/build-cache.mdx +2 -3
  45. package/docs/en/configure/app/performance/bundle-analyze.mdx +2 -3
  46. package/docs/en/configure/app/performance/chunk-split.mdx +2 -3
  47. package/docs/en/configure/app/performance/dns-prefetch.mdx +2 -3
  48. package/docs/en/configure/app/performance/preconnect.mdx +2 -3
  49. package/docs/en/configure/app/performance/prefetch.mdx +2 -3
  50. package/docs/en/configure/app/performance/preload.mdx +2 -3
  51. package/docs/en/configure/app/performance/print-file-size.mdx +2 -3
  52. package/docs/en/configure/app/performance/profile.mdx +2 -3
  53. package/docs/en/configure/app/performance/remove-console.mdx +2 -3
  54. package/docs/en/configure/app/performance/remove-moment-locale.mdx +2 -3
  55. package/docs/en/configure/app/performance/transform-lodash.mdx +4 -1
  56. package/docs/en/configure/app/security/nonce.mdx +2 -3
  57. package/docs/en/configure/app/security/sri.mdx +0 -1
  58. package/docs/en/configure/app/server/port.mdx +2 -3
  59. package/docs/en/configure/app/source/alias-strategy.mdx +2 -3
  60. package/docs/en/configure/app/source/alias.mdx +2 -3
  61. package/docs/en/configure/app/source/decorators.mdx +2 -3
  62. package/docs/en/configure/app/source/define.mdx +2 -3
  63. package/docs/en/configure/app/source/exclude.mdx +2 -3
  64. package/docs/en/configure/app/source/include.mdx +2 -3
  65. package/docs/en/configure/app/source/module-scopes.mdx +4 -1
  66. package/docs/en/configure/app/source/pre-entry.mdx +2 -3
  67. package/docs/en/configure/app/source/transform-import.mdx +2 -3
  68. package/docs/en/configure/app/tools/css-extract.mdx +2 -3
  69. package/docs/en/configure/app/tools/css-loader.mdx +2 -2
  70. package/docs/en/configure/app/tools/html-plugin.mdx +7 -3
  71. package/docs/en/configure/app/tools/lightningcss-loader.mdx +2 -3
  72. package/docs/en/configure/app/tools/postcss.mdx +2 -3
  73. package/docs/en/configure/app/tools/rspack.mdx +2 -3
  74. package/docs/en/configure/app/tools/style-loader.mdx +2 -3
  75. package/docs/en/configure/app/tools/swc.mdx +1 -1
  76. package/docs/en/configure/app/tools/terser.mdx +4 -2
  77. package/docs/en/configure/app/tools/ts-loader.mdx +4 -1
  78. package/docs/en/configure/app/tools/webpack-chain.mdx +4 -1
  79. package/docs/en/configure/app/tools/webpack.mdx +4 -1
  80. package/docs/en/guides/advanced-features/_meta.json +0 -1
  81. package/docs/en/guides/advanced-features/bff/extend-server.mdx +33 -82
  82. package/docs/en/guides/advanced-features/bff/frameworks.mdx +12 -68
  83. package/docs/en/guides/advanced-features/page-performance/_meta.json +1 -1
  84. package/docs/en/guides/advanced-features/page-performance/react-compiler.mdx +44 -0
  85. package/docs/en/guides/advanced-features/web-server.mdx +223 -20
  86. package/docs/en/guides/basic-features/data/data-cache.mdx +1 -1
  87. package/docs/en/guides/basic-features/deploy.mdx +3 -3
  88. package/docs/en/guides/basic-features/output-files.mdx +0 -28
  89. package/docs/en/guides/basic-features/render/ssr.mdx +1 -1
  90. package/docs/en/guides/basic-features/render/streaming-ssr.mdx +2 -2
  91. package/docs/en/guides/basic-features/routes.mdx +72 -0
  92. package/docs/en/guides/basic-features/static-assets/wasm-assets.mdx +1 -1
  93. package/docs/en/guides/topic-detail/module-federation/deploy.mdx +83 -7
  94. package/docs/en/guides/topic-detail/module-federation/usage.mdx +2 -4
  95. package/docs/en/plugin/cli-plugins/api.mdx +1 -1
  96. package/docs/en/tutorials/first-app/c04-routes.mdx +4 -2
  97. package/docs/en/tutorials/first-app/c05-loader.mdx +4 -1
  98. package/docs/zh/apis/app/hooks/server/server.mdx +10 -0
  99. package/docs/zh/apis/app/hooks/src/routes.mdx +3 -3
  100. package/docs/zh/apis/app/runtime/bff/use-hono-context.mdx +31 -0
  101. package/docs/zh/components/enable-bff.mdx +2 -27
  102. package/docs/zh/components/rsbuild-config-tooltip.mdx +2 -2
  103. package/docs/zh/components/tech-stack-node-framework.mdx +1 -1
  104. package/docs/zh/configure/app/dev/asset-prefix.mdx +2 -3
  105. package/docs/zh/configure/app/dev/client.mdx +2 -3
  106. package/docs/zh/configure/app/dev/hmr.mdx +2 -3
  107. package/docs/zh/configure/app/dev/live-reload.mdx +2 -3
  108. package/docs/zh/configure/app/dev/progress-bar.mdx +2 -3
  109. package/docs/zh/configure/app/dev/setup-middlewares.mdx +2 -3
  110. package/docs/zh/configure/app/dev/watch-files.mdx +2 -3
  111. package/docs/zh/configure/app/dev/write-to-disk.mdx +2 -3
  112. package/docs/zh/configure/app/html/app-icon.mdx +2 -3
  113. package/docs/zh/configure/app/html/crossorigin.mdx +2 -3
  114. package/docs/zh/configure/app/html/favicon.mdx +2 -3
  115. package/docs/zh/configure/app/html/inject.mdx +2 -3
  116. package/docs/zh/configure/app/html/meta.mdx +2 -3
  117. package/docs/zh/configure/app/html/mount-id.mdx +2 -3
  118. package/docs/zh/configure/app/html/output-structure.mdx +2 -3
  119. package/docs/zh/configure/app/html/script-loading.mdx +2 -3
  120. package/docs/zh/configure/app/html/tags.mdx +2 -3
  121. package/docs/zh/configure/app/html/template-parameters.mdx +2 -3
  122. package/docs/zh/configure/app/html/template.mdx +2 -3
  123. package/docs/zh/configure/app/html/title.mdx +2 -3
  124. package/docs/zh/configure/app/output/asset-prefix.mdx +2 -3
  125. package/docs/zh/configure/app/output/charset.mdx +2 -3
  126. package/docs/zh/configure/app/output/copy.mdx +2 -3
  127. package/docs/zh/configure/app/output/css-modules.mdx +2 -3
  128. package/docs/zh/configure/app/output/data-uri-limit.mdx +2 -3
  129. package/docs/zh/configure/app/output/dist-path.mdx +2 -4
  130. package/docs/zh/configure/app/output/externals.mdx +2 -3
  131. package/docs/zh/configure/app/output/filename-hash.mdx +2 -3
  132. package/docs/zh/configure/app/output/filename.mdx +2 -3
  133. package/docs/zh/configure/app/output/inject-styles.mdx +2 -3
  134. package/docs/zh/configure/app/output/inline-scripts.mdx +2 -3
  135. package/docs/zh/configure/app/output/inline-styles.mdx +2 -3
  136. package/docs/zh/configure/app/output/legal-comments.mdx +2 -3
  137. package/docs/zh/configure/app/output/minify.mdx +2 -3
  138. package/docs/zh/configure/app/output/override-browserslist.mdx +2 -3
  139. package/docs/zh/configure/app/output/polyfill.mdx +2 -3
  140. package/docs/zh/configure/app/output/source-map.mdx +2 -3
  141. package/docs/zh/configure/app/performance/build-cache.mdx +2 -3
  142. package/docs/zh/configure/app/performance/bundle-analyze.mdx +2 -3
  143. package/docs/zh/configure/app/performance/chunk-split.mdx +2 -3
  144. package/docs/zh/configure/app/performance/dns-prefetch.mdx +2 -3
  145. package/docs/zh/configure/app/performance/preconnect.mdx +2 -3
  146. package/docs/zh/configure/app/performance/prefetch.mdx +2 -3
  147. package/docs/zh/configure/app/performance/preload.mdx +2 -3
  148. package/docs/zh/configure/app/performance/print-file-size.mdx +2 -3
  149. package/docs/zh/configure/app/performance/profile.mdx +2 -3
  150. package/docs/zh/configure/app/performance/remove-console.mdx +2 -3
  151. package/docs/zh/configure/app/performance/remove-moment-locale.mdx +2 -3
  152. package/docs/zh/configure/app/performance/transform-lodash.mdx +4 -1
  153. package/docs/zh/configure/app/security/nonce.mdx +2 -3
  154. package/docs/zh/configure/app/security/sri.mdx +0 -1
  155. package/docs/zh/configure/app/server/port.mdx +2 -3
  156. package/docs/zh/configure/app/source/alias-strategy.mdx +2 -3
  157. package/docs/zh/configure/app/source/alias.mdx +2 -3
  158. package/docs/zh/configure/app/source/decorators.mdx +2 -3
  159. package/docs/zh/configure/app/source/define.mdx +2 -3
  160. package/docs/zh/configure/app/source/exclude.mdx +2 -3
  161. package/docs/zh/configure/app/source/include.mdx +2 -3
  162. package/docs/zh/configure/app/source/module-scopes.mdx +4 -1
  163. package/docs/zh/configure/app/source/pre-entry.mdx +2 -3
  164. package/docs/zh/configure/app/source/transform-import.mdx +2 -3
  165. package/docs/zh/configure/app/tools/css-extract.mdx +2 -3
  166. package/docs/zh/configure/app/tools/css-loader.mdx +2 -3
  167. package/docs/zh/configure/app/tools/html-plugin.mdx +6 -3
  168. package/docs/zh/configure/app/tools/lightningcss-loader.mdx +2 -3
  169. package/docs/zh/configure/app/tools/postcss.mdx +2 -3
  170. package/docs/zh/configure/app/tools/rspack.mdx +2 -3
  171. package/docs/zh/configure/app/tools/style-loader.mdx +2 -3
  172. package/docs/zh/configure/app/tools/swc.mdx +1 -1
  173. package/docs/zh/configure/app/tools/terser.mdx +4 -2
  174. package/docs/zh/configure/app/tools/ts-loader.mdx +4 -1
  175. package/docs/zh/configure/app/tools/webpack-chain.mdx +4 -1
  176. package/docs/zh/configure/app/tools/webpack.mdx +4 -1
  177. package/docs/zh/guides/advanced-features/_meta.json +0 -1
  178. package/docs/zh/guides/advanced-features/bff/extend-server.mdx +28 -76
  179. package/docs/zh/guides/advanced-features/bff/frameworks.mdx +6 -66
  180. package/docs/zh/guides/advanced-features/page-performance/_meta.json +1 -1
  181. package/docs/zh/guides/advanced-features/page-performance/react-compiler.mdx +44 -0
  182. package/docs/zh/guides/advanced-features/web-server.mdx +221 -24
  183. package/docs/zh/guides/basic-features/data/data-cache.mdx +1 -1
  184. package/docs/zh/guides/basic-features/deploy.mdx +4 -3
  185. package/docs/zh/guides/basic-features/output-files.mdx +0 -28
  186. package/docs/zh/guides/basic-features/render/ssr.mdx +1 -1
  187. package/docs/zh/guides/basic-features/render/streaming-ssr.mdx +1 -1
  188. package/docs/zh/guides/basic-features/static-assets/wasm-assets.mdx +1 -1
  189. package/docs/zh/guides/topic-detail/module-federation/deploy.mdx +83 -7
  190. package/docs/zh/guides/topic-detail/module-federation/usage.mdx +2 -4
  191. package/docs/zh/plugin/cli-plugins/api.mdx +1 -1
  192. package/docs/zh/tutorials/first-app/c04-routes.mdx +4 -2
  193. package/docs/zh/tutorials/first-app/c05-loader.mdx +4 -1
  194. package/package.json +7 -4
  195. package/rspress.config.ts +16 -1
  196. package/src/components/RsbuildLink/index.tsx +2 -2
  197. package/src/index.ts +1 -5
  198. package/src/pages/index.tsx +3 -3
  199. package/docs/en/apis/app/hooks/api/middleware.mdx +0 -11
  200. package/docs/en/apis/app/runtime/bff/hook.mdx +0 -44
  201. package/docs/en/apis/app/runtime/bff/use-context.mdx +0 -38
  202. package/docs/en/configure/app/bff/enable-handle-web.mdx +0 -24
  203. package/docs/en/guides/advanced-features/custom-server.mdx +0 -218
  204. package/docs/zh/apis/app/hooks/api/middleware.mdx +0 -11
  205. package/docs/zh/apis/app/runtime/bff/hook.mdx +0 -44
  206. package/docs/zh/apis/app/runtime/bff/use-context.mdx +0 -38
  207. package/docs/zh/configure/app/bff/enable-handle-web.mdx +0 -24
  208. package/docs/zh/guides/advanced-features/custom-server.mdx +0 -216
@@ -1,6 +1,5 @@
1
1
  ---
2
2
  title: styleLoader
3
- configName: tools.styleLoader
4
3
  ---
5
4
 
6
5
  # tools.styleLoader
@@ -10,6 +9,6 @@ configName: tools.styleLoader
10
9
 
11
10
  The config of [style-loader](https://github.com/webpack-contrib/style-loader) can be set through `tools.styleLoader`.
12
11
 
13
- import RsbuildConig from '@site-docs-en/components/rsbuild-config-tooltip';
12
+ import RsbuildConfig from '@site-docs-en/components/rsbuild-config-tooltip';
14
13
 
15
- <RsbuildConig />
14
+ <RsbuildConfig configName="tools.styleLoader" />
@@ -21,7 +21,7 @@ When using Rspack as the bundler, SWC will be used for transpiling and compressi
21
21
 
22
22
  You can set the options of [builtin:swc-loader](https://rspack.dev/guide/features/builtin-swc-loader) through `tools.swc`.
23
23
 
24
- ```
24
+ ```ts
25
25
  import { defineConfig } from '@modern-js/app-tools';
26
26
 
27
27
  export default defineConfig<'rspack'>({
@@ -4,6 +4,10 @@ title: terser
4
4
 
5
5
  # tools.terser
6
6
 
7
+ import { Badge } from '@theme';
8
+
9
+ <Badge type="danger" >Webpack Only</Badge>
10
+
7
11
  - **Type:** `Object | Function | undefined`
8
12
  - **Default:**
9
13
 
@@ -17,8 +21,6 @@ const defaultTerserOptions = {
17
21
  };
18
22
  ```
19
23
 
20
- - **Bundler:** `only support webpack`
21
-
22
24
  When building for production, Modern.js will minimize the JavaScript code through [terser-webpack-plugin](https://github.com/webpack-contrib/terser-webpack-plugin). The config of [terser-webpack-plugin](https://github.com/webpack-contrib/terser-webpack-plugin) can be modified via `tools.terser`.
23
25
 
24
26
  ### Object Type
@@ -4,9 +4,12 @@ title: tsLoader
4
4
 
5
5
  # tools.tsLoader
6
6
 
7
+ import { Badge } from '@theme';
8
+
9
+ <Badge type="danger" >Webpack Only</Badge>
10
+
7
11
  - **Type:** `Object | Function | undefined`
8
12
  - **Default:** `undefined`
9
- - **Bundler:** `only support webpack`
10
13
 
11
14
  :::warning Deprecated
12
15
 
@@ -4,9 +4,12 @@ title: webpackChain
4
4
 
5
5
  # tools.webpackChain
6
6
 
7
+ import { Badge } from '@theme';
8
+
9
+ <Badge type="danger" >Webpack Only</Badge>
10
+
7
11
  - **Type:** `Function | undefined`
8
12
  - **Default:** `undefined`
9
- - **Bundler:** `only support webpack`
10
13
 
11
14
  You can modify the webpack configuration by configuring `tools.webpackChain` which is type of `Function`. The function receives two parameters, the first is the original webpack chain object, and the second is an object containing some utils.
12
15
 
@@ -4,9 +4,12 @@ title: webpack
4
4
 
5
5
  # tools.webpack
6
6
 
7
+ import { Badge } from '@theme';
8
+
9
+ <Badge type="danger" >Webpack Only</Badge>
10
+
7
11
  - **Type:** `Object | Function | undefined`
8
12
  - **Default:** `undefined`
9
- - **Bundler:** `only support webpack`
10
13
 
11
14
  `tools.webpack` is used to configure [webpack](https://webpack.js.org/).
12
15
 
@@ -23,6 +23,5 @@
23
23
  "label": "server-monitor",
24
24
  "collapsed": true
25
25
  },
26
- "custom-server",
27
26
  "web-server"
28
27
  ]
@@ -1,35 +1,41 @@
1
1
  # Extend BFF Server
2
2
 
3
- In some applications, developers may want to handle all BFF functions uniformly, such as for authentication, logging, data processing, etc.
3
+ In some applications, developers may want to handle all BFF functions uniformly, such as authentication, logging, data processing, etc.
4
4
 
5
- Modern.js provides two methods that allow developers to extend the BFF Server freely according to the runtime framework.
5
+ Modern.js allows users to freely extend the BFF Server through [Middleware](/guides/advanced-features/web-server.html#middleware) method.
6
6
 
7
- ## Middleware
7
+ ## Using Middleware
8
8
 
9
- Developers can write middleware in the `api/_app.ts` file to extend the BFF Server. Taking Express as the runtime framework, here is an example of how to write a middleware to add permission checks:
9
+ Developers can use middleware by configuring middlewares in `server/modern.server.ts`. The following describes how to write a BFF middleware manually to add permission verification:
10
10
 
11
- ```ts title="api/_app.ts"
12
- import { hook } from '@modern-js/runtime/server';
13
- import { Request, Response, NextFunction } from 'express';
11
+ ```ts title="server/modern.server.ts"
12
+ import {
13
+ type MiddlewareHandler,
14
+ defineServerConfig,
15
+ } from '@modern-js/server-runtime';
14
16
 
15
- export default hook(({ addMiddleware }) => {
16
- addMiddleware(async (req: Request, res: Response, next: NextFunction) => {
17
- if (req.url !== '/api/login') {
18
- const sid = req?.cookies?.sid;
19
- if (!sid) {
20
- res.status(400);
21
- res.json({ code: -1, message: 'need login' });
22
- } else {
23
- next();
24
- }
25
- } else {
26
- next();
17
+ const requireAuthForApi: MiddlewareHandler = async (c, next) => {
18
+ if (c.req.path.startsWith('/api') && c.req.path !== '/api/login') {
19
+ const sid = c.req.cookie('sid');
20
+ if (!sid) {
21
+ return c.json({ code: -1, message: 'need login' }, 400);
27
22
  }
28
- });
23
+ }
24
+ await next();
25
+ };
26
+
27
+ export default defineServerConfig({
28
+ middlewares: [
29
+ {
30
+ name: 'require-auth-for-api',
31
+ handler: requireAuthForApi,
32
+ },
33
+ ]
29
34
  });
35
+
30
36
  ```
31
37
 
32
- Then add a standard BFF function `api/lambda/hello.ts`:
38
+ Then add a regular BFF function `api/lambda/hello.ts`:
33
39
 
34
40
  ```ts title="api/lambda/hello.ts"
35
41
  export default async () => {
@@ -37,7 +43,7 @@ export default async () => {
37
43
  };
38
44
  ```
39
45
 
40
- Next, in the frontend, add the code to access the API in `src/routes/page.tsx`, directly using the integrated method for the call:
46
+ Next, in the frontend `src/routes/page.tsx`, add the interface access code and directly use the integrated method to call:
41
47
 
42
48
  ```ts title="src/routes/page.tsx"
43
49
  import { useState, useEffect } from 'react';
@@ -59,14 +65,14 @@ export default () => {
59
65
  };
60
66
  ```
61
67
 
62
- Now run the `dev` command to start the project, and visit `http://localhost:8080/`. You will find that the request to `/api/hello` is intercepted:
68
+ Now run the `dev` command to start the project, and access `http://localhost:8080/` to find that the request for `/api/hello` has been intercepted:
63
69
 
64
70
  ![Network](https://lf3-static.bytednsdoc.com/obj/eden-cn/aphqeh7uhohpquloj/modern-js/docs/network2.png)
65
71
 
66
- Finally, modify the frontend code in `src/routes/page.tsx` to call the login interface before accessing `/api/hello`:
72
+ Finally, modify the frontend code `src/routes/page.tsx`, and call the login interface before accessing `/api/hello`:
67
73
 
68
74
  :::note
69
- Here the login interface is not actually implemented; the code is just for demonstration.
75
+ This part does not implement a real login interface; the code is just for demonstration.
70
76
  :::
71
77
 
72
78
  ```ts
@@ -92,63 +98,8 @@ export default () => {
92
98
  };
93
99
  ```
94
100
 
95
- Refresh the page to see that the access to `/api/hello` is successful:
101
+ Refresh the page, and you can see that the access to `/api/hello` is successful:
96
102
 
97
103
  ![Network](https://lf3-static.bytednsdoc.com/obj/eden-cn/aphqeh7uhohpquloj/modern-js/docs/network3.png)
98
104
 
99
- The above code simulates adding middleware in `api/_app.ts` to implement simple login functionality. Similarly, other functionalities can be implemented in this hook file to extend the BFF Server.
100
-
101
- :::info
102
- The way middleware is written may differ depending on the runtime framework. For details, see [Runtime Frameworks](/guides/advanced-features/bff/frameworks).
103
- :::
104
-
105
- ## Define Server Instance
106
-
107
- In addition to middleware, you can also define a BFF Server instance via the `api/app.ts`. Developers need to export an instance that can be recognized by the runtime framework plugin. Here is a simple demonstration of how to define a server instance with Koa and Express.
108
-
109
- import { Tabs, Tab as TabItem } from "@theme";
110
-
111
- <Tabs>
112
- <TabItem value="express" label="Express.js" default>
113
-
114
- ```ts title="api/app.ts"
115
- import express from 'express';
116
-
117
- const app = express();
118
- app.use(async (req, res, next) => {
119
- console.info(`access url: ${req.url}`);
120
- next();
121
- });
122
-
123
- export default app;
124
- ```
125
-
126
- </TabItem>
127
- <TabItem value="koa" label="Koa.js">
128
-
129
- ```ts title="api/app.ts"
130
- import koa from 'koa';
131
-
132
- const app = new Koa();
133
- app.use(async (ctx, next) => {
134
- console.info(`access url: ${ctx.url}`);
135
- await next();
136
- });
137
-
138
- export default app;
139
- ```
140
-
141
- </TabItem>
142
- </Tabs>
143
-
144
- In complex BFF logic, defining a server instance allows for easier organization of code logic and directory structure design through a single entry point. In this file, you can perform initialization logic, add global middleware, declare routes, and even extend the original framework.
145
-
146
- The routes defined by the BFF functions will be registered after the routes defined in the `app.ts` file. Therefore, you can also intercept the routes defined by the BFF functions here for preprocessing or early responses.
147
-
148
- :::note
149
- At this time, if `api/_app.ts` exists in the application, the defined middleware will be executed after the middleware exported by the `api/app.ts` instance. In most cases, middleware can cover most customization needs for BFF functions. Only when the application's server-side logic is more complex do you need to customize the server instance.
150
- :::
151
-
152
- :::caution
153
- When `api/app.ts` does not exist in the application, Modern.js will default to adding [koa-body](https://www.npmjs.com/package/koa-body). When `api/app.ts` does exist in the application, if developers wish to use BFF functions with bodies, they will need to **add `koa-body` themselves**.
154
- :::
105
+ The above code simulates defining middleware in `server/Modern.server.ts` and implements a simple login function. Similarly, other functionalities can be implemented in this configuration file to extend the BFF Server.
@@ -1,81 +1,25 @@
1
- # Runtime Framework
2
-
3
- Modern.js BFF supports different runtime frameworks. Currently, Modern.js BFF supports two runtime frameworks: [Express.js](https://expressjs.com/) and [Koa.js](https://koajs.com/).
1
+ ---
2
+ sidebar_position: 3
3
+ title: Runtime Framework
4
+ ---
4
5
 
5
- When using different runtime frameworks, some APIs may differ.
6
-
7
- ## Accessing Request Context
6
+ # Runtime Framework
8
7
 
9
- In BFF functions, you may need to access the request context to handle more logic. Depending on the runtime framework, you need to use different APIs:
8
+ Modern.js uses [Hono.js](https://hono.dev/) as the BFF and Server runtime framework, so you can [extend BFF Server](/guides/advanced-features/bff/extend-server.html) based on the Hono.js ecosystem.
10
9
 
11
- import { Tabs, Tab as TabItem } from "@theme";
10
+ ## Getting Request Context
12
11
 
13
- <Tabs>
14
- <TabItem value="express" label="Express.js" default>
12
+ Sometimes in BFF functions, it's necessary to obtain the request context to handle more logic. In such cases, you can use `useHonoContext` to get it:
15
13
 
16
14
  ```ts title="api/lambda/hello.ts"
17
- import { useContext } from '@modern-js/runtime/express'
15
+ import { useHonoContext } from '@modern-js/plugin-bff/hono'
18
16
  export const get = async () => {
19
- const { req } = useContext();
20
- console.info(`access url: ${req.url}`);
17
+ const c = useHonoContext();
18
+ console.info(`access url: ${c.req.url}`);
21
19
  return 'Hello Modern.js'
22
20
  };
23
21
  ```
24
22
 
25
- </TabItem>
26
- <TabItem value="koa" label="Koa.js">
27
-
28
- ```ts title="api/lambda/hello.ts"
29
- import { useContext } from '@modern-js/runtime/koa'
30
- export const get = async () => {
31
- const ctx = useContext();
32
- console.info(`access url: ${req.url}`);
33
- return 'Hello Modern.js'
34
- };
35
- ```
36
-
37
- </TabItem>
38
- </Tabs>
39
-
40
- :::info
41
- For more details, refer to [useContext](/apis/app/runtime/bff/use-context).
42
- :::
43
-
44
- ## Using Middleware
45
-
46
- In BFF functions, you may need to use middleware to handle more logic. Depending on the runtime framework, you need to use different APIs:
47
-
48
- <Tabs>
49
- <TabItem value="express" label="Express.js" default>
50
-
51
- ```ts title="api/_app.ts"
52
- import { hook } from '@modern-js/runtime/express';
53
-
54
- export default hook(({ addMiddleware }) => {
55
- addMiddleware((req, res, next) => {
56
- req.query.id = 'koa';
57
- next();
58
- });
59
- });
60
- ```
61
-
62
- </TabItem>
63
- <TabItem value="koa" label="Koa.js">
64
-
65
- ```ts title="api/_app.ts"
66
- import { hook } from '@modern-js/runtime/koa';
67
-
68
- export default hook(({ addMiddleware }) => {
69
- addMiddleware(async (ctx, next) => {
70
- ctx.req.query.id = 'koa';
71
- await next();
72
- });
73
- });
74
- ```
75
-
76
- </TabItem>
77
- </Tabs>
78
-
79
23
  :::info
80
- For more details, refer to [hook](/apis/app/runtime/bff/hook).
24
+ For more details, refer to [useHonoContext](/apis/app/runtime/bff/use-hono-context).
81
25
  :::
@@ -1 +1 @@
1
- ["code-split", "inline-assets", "optimize-bundle"]
1
+ ["code-split", "inline-assets", "optimize-bundle", "react-compiler"]
@@ -0,0 +1,44 @@
1
+ # React Compiler
2
+
3
+ The React Compiler is an experimental compiler introduced in React 19 that can automatically optimize your React code.
4
+
5
+ Before starting to use the React Compiler, it is recommended to read the [React Compiler documentation](https://zh-hans.react.dev/learn/react-compiler) to understand its features, current status, and usage.
6
+
7
+ ## How to Use
8
+
9
+ The steps to use the React Compiler in Modern.js are as follows:
10
+
11
+ 1. Modern.js does not officially support React 19 yet, but you can install `react-compiler-runtime@rc` in React 17 or 18 projects to allow the compiled code to run on versions before 19.
12
+
13
+ 2. Currently, the React Compiler only provides a Babel plugin, so you need to install `babel-plugin-react-compiler`.
14
+
15
+ 3. Register the Babel plugin in your Modern.js configuration file:
16
+
17
+ ```ts title="modern.config.ts"
18
+ import { appTools, defineConfig } from '@modern-js/app-tools';
19
+
20
+ export default defineConfig({
21
+ runtime: {
22
+ router: true,
23
+ },
24
+ tools: {
25
+ babel(_, { addPlugins }) {
26
+ addPlugins([
27
+ [
28
+ 'babel-plugin-react-compiler',
29
+ {
30
+ target: '18',
31
+ },
32
+ ],
33
+ ]);
34
+ },
35
+ },
36
+ plugins: [
37
+ appTools({
38
+ bundler: 'rspack',
39
+ }),
40
+ ],
41
+ });
42
+ ```
43
+
44
+ > For detailed code, you can refer to the [Modern.js & React Compiler example project](https://github.com/web-infra-dev/modern-js-examples/tree/main/examples/react-compiler)
@@ -2,42 +2,245 @@
2
2
  sidebar_position: 16
3
3
  ---
4
4
 
5
- # Custom Web Server (Not Recommended)
6
-
7
- :::warning
8
- Custom Web Server is compatible but no longer recommended. For extending Server capabilities, please refer to [Custom Server](/guides/advanced-features/custom-server.html). For migration guide, see [Migrate to the New Version of Custom Server](/guides/advanced-features/web-server.html#migrate-to-the-new-version-of-custom-server).
9
- :::
5
+ # Custom Web Server
10
6
 
11
7
  Modern.js encapsulates most server-side capabilities required by projects, typically eliminating the need for server-side development. However, in certain scenarios such as user authentication, request preprocessing, or adding page skeletons, custom server-side logic may still be necessary.
12
8
 
13
- Modern.js provides two types of APIs to extend the Web Server: **Middleware** and **Lifecycle Hooks**.
9
+ ## Starting a Custom Web Server
14
10
 
15
- :::note
16
- Middleware and Hooks only take effect when users request page routes, and BFF routes won't pass through these APIs.
11
+ :::info
12
+ You must ensure that the Modern.js version is x.67.5 or above.
17
13
  :::
18
14
 
19
- ## Enabling Custom Web Server
20
-
21
- Developers can execute the `pnpm run new` command in the project root directory to enable the "Custom Web Server" feature:
15
+ Developers can execute the `pnpm run new` command in the project root directory to start the "Custom Web Server" feature:
22
16
 
23
17
  ```bash
24
18
  ? Select operation: Create project element
25
19
  ? Select element type: Create "Custom Web Server" source directory
26
20
  ```
27
21
 
28
- After executing the command, register the `@modern-js/plugin-server` plugin in `modern.config.ts`:
22
+ After executing the command, a `server/modern.server.ts` file will be automatically created in the project directory, where you can write custom logic.
23
+
24
+
25
+ ## Capabilities of the Custom Web Server
26
+
27
+ In the `server/modern.server.ts` file, you can add the following configurations to extend the Server:
28
+ - **Middleware**
29
+ - **Render Middleware**
30
+ - **Server-side Plugin**
31
+
32
+ In the **Plugin**, you can define **Middleware** and **RenderMiddleware**. The middleware loading process is illustrated in the following diagram:
33
+
34
+ <img
35
+ src="https://lf3-static.bytednsdoc.com/obj/eden-cn/10eh7nuhpenuhog/server-md-wf.png"
36
+ style={{ width: '100%', maxWidth: '540px' }}
37
+ />
38
+
39
+ ### Basic Configuration
40
+
41
+ ```ts title="server/modern.server.ts"
42
+ import { defineServerConfig } from '@modern-js/server-runtime';
43
+
44
+ export default defineServerConfig({
45
+ middlewares: [],
46
+ renderMiddlewares: [],
47
+ plugins: [],
48
+ });
49
+ ```
50
+
51
+
52
+ ### Type Definition
53
+
54
+ `defineServerConfig` type definition is as follows:
55
+
56
+ ```ts
57
+ import type { MiddlewareHandler } from 'hono';
58
+
59
+ type MiddlewareOrder = 'pre' | 'post' | 'default';
60
+ type MiddlewareObj = {
61
+ name: string;
62
+ path?: string;
63
+ method?: 'options' | 'get' | 'post' | 'put' | 'delete' | 'patch' | 'all';
64
+ handler: MiddlewareHandler | MiddlewareHandler[];
65
+ before?: Array<MiddlewareObj['name']>;
66
+ order?: MiddlewareOrder;
67
+ };
68
+ type ServerConfig = {
69
+ middlewares?: MiddlewareObj[];
70
+ renderMiddlewares?: MiddlewareObj[];
71
+ plugins?: (ServerPlugin | ServerPluginLegacy)[];
72
+ }
73
+ ```
74
+
75
+
76
+ ### Middleware
77
+
78
+ Middleware supports executing custom logic before and after the **request handling** and **page routing** processes in Modern.js services.
79
+ If custom logic needs to handle both API routes and page routes, Middleware is the clear choice.
80
+
81
+ :::note
82
+ If you only need to handle BFF API routes, you can determine whether a request is for a BFF API by checking if `req.path` starts with the BFF `prefix`.
83
+ :::
84
+
85
+ Usage is as follows:
86
+
87
+ ```ts title="server/modern.server.ts"
88
+ import { defineServerConfig, type MiddlewareHandler } from '@modern-js/server-runtime';
89
+
90
+ export const handler: MiddlewareHandler = async (c, next) => {
91
+ const monitors = c.get('monitors');
92
+ const start = Date.now();
93
+
94
+ await next();
95
+
96
+ const end = Date.now();
97
+ // Report Duration
98
+ monitors.timing('request_timing', end - start);
99
+ };
100
+
101
+ export default defineServerConfig({
102
+ middlewares: [
103
+ {
104
+ name: 'request-timing',
105
+ handler,
106
+ },
107
+ ],
108
+ });
109
+ ```
110
+
111
+ :::warning
112
+ You must execute the `next` function to proceed with the subsequent Middleware.
113
+ :::
114
+
115
+
116
+ ### RenderMiddleware
117
+
118
+ If you only need to handle the logic before and after page rendering, modern.js also provides rendering middleware, which can be used as follows:
119
+
120
+ ```ts title="server/modern.server.ts"
121
+ import { defineServerConfig, type MiddlewareHandler } from '@modern-js/server-runtime';
122
+
123
+ // Inject render performance metrics
124
+ const renderTiming: MiddlewareHandler = async (c, next) => {
125
+ const start = Date.now();
126
+
127
+ await next();
128
+
129
+ const end = Date.now();
130
+ c.res.headers.set('server-timing', `render; dur=${end - start}`);
131
+ };
132
+
133
+ // Modify the Response Body
134
+ const modifyResBody: MiddlewareHandler = async (c, next) => {
135
+ await next();
136
+
137
+ const { res } = c;
138
+ const text = await res.text();
139
+ const newText = text.replace('<body>', '<body> <h3>bytedance</h3>');
140
+
141
+ c.res = c.body(newText, {
142
+ status: res.status,
143
+ headers: res.headers,
144
+ });
145
+ };
146
+
147
+ export default defineServerConfig({
148
+ renderMiddlewares: [
149
+ {
150
+ name: 'render-timing',
151
+ handler: renderTiming,
152
+ },
153
+ {
154
+ name: 'modify-res-body',
155
+ handler: modifyResBody,
156
+ },
157
+ ],
158
+ });
159
+ ```
160
+
161
+
162
+ ### Plugin
163
+
164
+ Modern.js supports adding the aforementioned middleware and rendering middleware for the Server in custom plugins, which can be used as follows:
165
+
166
+
167
+ ```ts title="server/plugins/server.ts"
168
+ import type { ServerPluginLegacy } from '@modern-js/server-runtime';
169
+
170
+ export default (): ServerPluginLegacy => ({
171
+ name: 'serverPlugin',
172
+ setup(api) {
173
+ return {
174
+ prepare(serverConfig) {
175
+ const { middlewares, renderMiddlewares } = api.useAppContext();
176
+
177
+ // Inject server-side data for page dataLoader consumption
178
+ middlewares?.push({
179
+ name: 'server-plugin-middleware',
180
+ handler: async (c, next) => {
181
+ c.set('message', 'hi modern.js');
182
+ await next();
183
+ // ...
184
+ },
185
+ });
186
+
187
+ // redirect
188
+ renderMiddlewares?.push({
189
+ name: 'server-plugin-render-middleware',
190
+ handler: async (c, next) => {
191
+ const user = getUser(c.req);
192
+ if (!user) {
193
+ return c.redirect('/login');
194
+ }
195
+
196
+ await next();
197
+ },
198
+ });
199
+ return serverConfig;
200
+ },
201
+ };
202
+ },
203
+ });
204
+ ```
205
+
29
206
 
30
- ```ts title="modern.config.ts"
31
- import { serverPlugin } from '@modern-js/plugin-server';
207
+ ```ts title="server/modern.server.ts"
208
+ import { defineServerConfig } from '@modern-js/server-runtime';
209
+ import serverPlugin from './plugins/serverPlugin';
32
210
 
33
- export default defineConfig({
34
- plugins: [..., serverPlugin()],
211
+ export default defineServerConfig({
212
+ plugins: [serverPlugin()],
35
213
  });
36
214
  ```
37
215
 
38
- Once enabled, a `server/index.ts` file will be automatically created in the project directory where custom logic can be implemented.
39
216
 
40
- ## Custom Web Server Capabilities
217
+ ```ts title="src/routes/page.data.ts"
218
+ import { useHonoContext } from '@modern-js/server-runtime';
219
+ import { defer } from '@modern-js/runtime/router';
220
+
221
+ export default () => {
222
+ const ctx = useHonoContext();
223
+ // SSR scenario consumes data injected by the Server Side
224
+ const message = ctx.get('message');
225
+
226
+ // ...
227
+ };
228
+
229
+ ```
230
+
231
+
232
+ ## Legacy API (Deprecated)
233
+
234
+ :::warning
235
+ The legacy API is compatible but no longer recommended. For extending server capabilities, please refer to [Custom Web Server](/guides/advanced-features/web-server.html#custom-web-server). For migration guidelines, see [Migrating to the New Version of Custom Web Server](/guides/advanced-features/web-server.html#migrate-to-the-new-version-of-custom-web-server).
236
+ :::
237
+
238
+ ### Enable
239
+ To enable the custom Web Server feature, follow these steps:
240
+ 1. Add `@modern-js/plugin-server`、`tsconfig-paths` and `ts-node` to `devDependencies` and install them.
241
+ 2. Add `server` to the `include` section of `tsconfig`.
242
+ 3. Register the `@modern-js/plugin-server` plugin in `modern.config.ts`.
243
+ 4. Create a `server/index.ts` file in the project directory, where you can write custom logic.
41
244
 
42
245
  ### Unstable Middleware
43
246
 
@@ -102,7 +305,7 @@ For detailed API and more usage, see [Hook](/apis/app/runtime/web-server/hook).
102
305
  :::
103
306
 
104
307
 
105
- ## Migrate to the New Version of Custom Server
308
+ ## Migrate to the New Version of Custom Web Server
106
309
 
107
310
  ### Migration Background
108
311
 
@@ -153,7 +356,7 @@ Differences between UnstableMiddleware Context and Hono Context:
153
356
  | `c.request` | `c.req.raw` | Refer to [HonoRequest raw](https://hono.dev/docs/api/request#raw) documentation |
154
357
  | `c.response` | `c.res` | Refer to [Hono Context res](https://hono.dev/docs/api/context#res) documentation |
155
358
  | `c.route` | `c.get('route')` | Get application context information. |
156
- | `loaderContext.get` | `honoContext.get` | After injecting data using `c.set`, consume in dataLoader: the old version uses `loaderContext.get`, refer to the new version in [Plugin](/guides/advanced-features/custom-server.html#using-posture-2) example |
359
+ | `loaderContext.get` | `honoContext.get` | After injecting data using `c.set`, consume in dataLoader: the old version uses `loaderContext.get`, refer to the new version in [Plugin](/guides/advanced-features/web-server.html#plugin) example |
157
360
 
158
361
 
159
362
  #### Middleware