@modern-js/main-doc 2.0.0-beta.1 → 2.0.0-beta.2
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.
- package/.turbo/turbo-build.log +1 -1
- package/en/docusaurus-plugin-content-docs/current/apis/app/commands/build.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/apis/app/commands/dev.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/apis/app/commands/lint.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/apis/app/commands/new.md +1 -2
- package/en/docusaurus-plugin-content-docs/current/apis/app/commands/start.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/apis/app/commands/test.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/apis/app/overview.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/model/auto-actions.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/model/connect.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/model/create-app.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/model/create-store.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/model/handle-effect.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/model/model_.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/model/use-local-model.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/model/use-model.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/model/use-static-model.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/model/use-store.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/components/command-tip.md +56 -0
- package/en/docusaurus-plugin-content-docs/current/components/reduck-tip.md +5 -0
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/disable-css-extract.md +12 -0
- package/en/docusaurus-plugin-content-docs/current/configure/app/runtime/router.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/_category_.json +4 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/codesmith/_category_.json +4 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/codesmith/api/_category_.json +4 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/codesmith/api/app.md +152 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/codesmith/api/ejs.md +56 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/codesmith/api/fs.md +54 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/codesmith/api/git.md +49 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/codesmith/api/handlebars.md +58 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/codesmith/api/json.md +59 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/codesmith/api/npm.md +49 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/codesmith/develop.md +52 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/codesmith/introduce.md +46 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/codesmith/run-in-js.md +48 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/codesmith/structure.md +87 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/config/_category_.json +4 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/config/common.md +106 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/config/module.md +39 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/config/monorepo.md +28 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/config/mwa.md +89 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/_category_.json +4 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/abstract.md +26 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/_category_.json +4 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/file/_category_.json +4 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/file/addFile.md +52 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/file/addHelper.md +26 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/file/addManyFile.md +58 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/file/addPartial.md +26 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/file/introduce.md +38 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/file/rmDir.md +24 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/file/rmFile.md +24 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/file/updateJSONFile.md +54 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/file/updateModernConfig.md +26 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/file/updateTextRawFile.md +33 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/git/_category_.json +4 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/git/gitAddAndCommit.md +20 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/git/initGitRepo.md +16 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/git/isInGitRepo.md +16 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/hook/_category_.json +4 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/hook/afterForged.md +35 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/hook/onForged.md +36 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/info/_category_.json +4 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/info/isFileExit.md +22 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/info/locale.md +17 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/info/readDir.md +22 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/input/_category_.json +4 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/input/addInputAfter.md +57 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/input/addInputBefore.md +56 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/input/setInput.md +42 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/input/setInputValue.md +30 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/input/type.md +65 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/introduce.md +91 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/new/_category_.json +4 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/new/createElement.md +33 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/new/createSubProject.md +35 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/new/enableFunc.md +44 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/new/introduce.md +15 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/npm/_category_.json +4 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/api/npm/install.md +18 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/develop.md +125 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/plugin/use.md +61 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/generator/project.md +118 -0
- package/en/docusaurus-plugin-content-docs/current.json +39 -3
- package/package.json +3 -3
- package/scripts/summary.en.json +1 -1
- package/scripts/summary.zh.json +1 -1
- package/zh/apis/app/commands/new.md +0 -1
- package/zh/apis/app/hooks/server/test.md +2 -2
- package/zh/apis/app/runtime/web-server/hook.md +4 -4
- package/zh/apis/app/runtime/web-server/middleware.md +4 -4
- package/zh/configure/app/output/disable-css-extract.md +12 -0
- package/zh/guides/advanced-features/bff/_category_.json +5 -1
- package/zh/guides/advanced-features/bff/bff-proxy.md +5 -3
- package/zh/guides/advanced-features/bff/frameworks.md +72 -51
- package/zh/guides/advanced-features/bff/function.md +16 -30
- package/zh/guides/advanced-features/bff/index.md +20 -0
- package/zh/guides/advanced-features/bff/type.md +43 -0
- package/zh/guides/advanced-features/custom-app.md +63 -1
- package/zh/guides/advanced-features/web-server.md +21 -110
- package/zh/guides/basic-features/data-fetch.md +61 -0
- package/zh/guides/basic-features/env-vars.md +88 -41
- package/zh/guides/basic-features/routes.md +267 -0
- package/zh/guides/concept/entries.md +112 -0
- package/zh/guides/concept/lifecycle.md +10 -0
- package/zh/guides/get-started/quick-start.md +199 -1
- package/zh/guides/get-started/upgrade.md +75 -1
- package/zh/guides/topic-detail/generator/codesmith/api/_category_.json +4 -0
- package/zh/guides/topic-detail/generator/codesmith/api/app.md +152 -0
- package/zh/guides/topic-detail/generator/codesmith/api/ejs.md +56 -0
- package/zh/guides/topic-detail/generator/codesmith/api/fs.md +54 -0
- package/zh/guides/topic-detail/generator/codesmith/api/git.md +48 -0
- package/zh/guides/topic-detail/generator/codesmith/api/handlebars.md +56 -0
- package/zh/guides/topic-detail/generator/codesmith/api/json.md +58 -0
- package/zh/guides/topic-detail/generator/codesmith/api/npm.md +45 -0
- package/zh/guides/topic-detail/generator/codesmith/develop.md +52 -0
- package/zh/guides/topic-detail/generator/codesmith/introduce.md +42 -1
- package/zh/guides/topic-detail/generator/codesmith/run-in-js.md +48 -0
- package/zh/guides/topic-detail/generator/codesmith/structure.md +86 -0
- package/zh/guides/topic-detail/generator/config/mwa.md +4 -8
- package/zh/guides/topic-detail/generator/plugin/api/file/addFile.md +1 -1
- package/zh/guides/topic-detail/generator/plugin/api/file/addHelper.md +1 -1
- package/zh/guides/topic-detail/generator/plugin/api/file/addPartial.md +2 -2
- package/zh/guides/topic-detail/generator/plugin/api/file/introduce.md +1 -1
- package/zh/guides/topic-detail/generator/plugin/api/file/rmDir.md +1 -1
- package/zh/guides/topic-detail/generator/plugin/api/file/rmFile.md +1 -1
- package/zh/guides/topic-detail/generator/plugin/api/file/updateJSONFile.md +3 -2
- package/zh/guides/topic-detail/generator/plugin/api/file/updateModernConfig.md +2 -2
- package/zh/guides/topic-detail/generator/plugin/api/file/updateTextRawFile.md +1 -1
- package/zh/guides/topic-detail/generator/plugin/api/hook/afterForged.md +3 -3
- package/zh/guides/topic-detail/generator/plugin/api/hook/onForged.md +3 -3
- package/zh/guides/topic-detail/generator/plugin/api/input/addInputAfter.md +1 -1
- package/zh/guides/topic-detail/generator/plugin/api/input/addInputBefore.md +1 -1
- package/zh/guides/topic-detail/generator/plugin/api/input/type.md +1 -1
- package/zh/guides/topic-detail/generator/plugin/api/new/createElement.md +1 -1
- package/zh/guides/topic-detail/generator/plugin/api/new/createSubProject.md +1 -1
- package/zh/guides/topic-detail/generator/plugin/api/new/enableFunc.md +1 -1
- package/zh/guides/topic-detail/generator/plugin/api/npm/install.md +1 -1
- package/zh/guides/topic-detail/generator/plugin/develop.md +11 -7
- package/zh/guides/topic-detail/monorepo/sub-project-interface.md +0 -2
- package/zh/tutorials/first-app/c01-getting-started/1.1-prerequisites.md +2 -2
- package/zh/tutorials/first-app/c02-generator-and-studio/2.1-generator.md +0 -8
- package/zh/tutorials/first-app/c02-generator-and-studio/2.2-boilerplates.md +15 -7
- package/zh/tutorials/first-app/c07-app-entry/7.1-intro.md +1 -1
- package/zh/tutorials/first-app/c07-app-entry/7.2-add-entry-in-cli.md +1 -5
- package/zh/tutorials/first-app/c08-client-side-routing/8.2-file-based-routing.md +0 -8
- package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/env.md +0 -72
- package/zh/apis/app/runtime/env.md +0 -70
- package/zh/components/deploy.md +0 -60
- package/zh/components/dev-ide.md +0 -1
- package/zh/components/entry-name.md +0 -15
- package/zh/components/env-prepare.md +0 -1
- package/zh/components/launch-bff-choices.md +0 -6
- package/zh/guides/advanced-features/bff/bff-server.md +0 -142
- package/zh/guides/advanced-features/typescript.md +0 -4
- package/zh/guides/concept/integrated.md +0 -4
- package/zh/guides/concept/solutions.md +0 -4
@@ -0,0 +1,20 @@
|
|
1
|
+
---
|
2
|
+
title: BFF
|
3
|
+
---
|
4
|
+
|
5
|
+
在**前后端分离**概念出现后一段时间发展中,前端部分能够做的事越来越多,前端需要一些面向 UI 的数据接口,因此业界引入了 BFF(Backends for Frontends)这一概念。
|
6
|
+
|
7
|
+
它主要为了解决的问题包括:
|
8
|
+
|
9
|
+
* 根据自身业务需求,对更底层 API 的聚合、映射、裁剪、代理。
|
10
|
+
* 对一些特定场景的数据进行缓存,提高性能,进而提升用户体验。
|
11
|
+
* 根据已有接口快速开发新产品。
|
12
|
+
* 与第三方系统对接,例如登陆鉴权。
|
13
|
+
|
14
|
+
Modern.js 官方支持了 BFF,并提供了**一体化 BFF 方案**来进一步强化 BFF 能力,主要包括以下能力:
|
15
|
+
|
16
|
+
* 快速开发调试上线,在同一项目中运行、构建、部署 BFF 代码。
|
17
|
+
* 极简的纯函数调用,在前端直接 import BFF 函数,调用时能自动转换成 HTTP 请求。
|
18
|
+
* 无私有协议,遵循 RESTful API 规范,所有 BFF 接口都是标准化的。
|
19
|
+
* 完善的 TypeScript 支持。
|
20
|
+
* 满足用户使用偏好,支持多框架扩展写法。
|
@@ -0,0 +1,43 @@
|
|
1
|
+
---
|
2
|
+
sidebar_position: 2
|
3
|
+
title: 函数写法 & 框架写法
|
4
|
+
---
|
5
|
+
|
6
|
+
运行时框架支持也是 **BFF** 中重要的一环。Modern.js 支持通过插件扩展 BFF 的运行时框架,并提供了一系列内置插件,开发者可以直接使用对应框架的约定和生态。
|
7
|
+
|
8
|
+
插件中兼容了这些框架大部分的规范,每一种框架都需要提供两类扩展写法 BFF 函数的方式,分别是**函数写法**和**框架写法**。
|
9
|
+
|
10
|
+
:::note
|
11
|
+
当前 `api/` 目录结构是否为框架写法由对应的插件决定,Modern.js 并不关心。
|
12
|
+
:::
|
13
|
+
|
14
|
+
## 函数写法
|
15
|
+
|
16
|
+
当插件认为当前为函数写法时,必须支持在 `api/_app.ts` 中编写中间件,用来扩展 BFF 函数。
|
17
|
+
|
18
|
+
Modern.js 会收集 `api/_app.ts` 中的中间件,并传递给插件,由插件将中间件注入运行时,例如:
|
19
|
+
|
20
|
+
```ts
|
21
|
+
import { hook } from '@modern-js/runtime/server';
|
22
|
+
|
23
|
+
export default hook(({ addMiddleware }) => {
|
24
|
+
addMiddleware(myMiddleware);
|
25
|
+
});
|
26
|
+
```
|
27
|
+
|
28
|
+
:::note
|
29
|
+
不同插件的中间件的写法不一定相同,详情可见[运行时框架](/docs/guides/advanced-features/bff/frameworks)。
|
30
|
+
:::
|
31
|
+
|
32
|
+
## 框架写法
|
33
|
+
|
34
|
+
框架写法是一种使用框架结构来扩展 BFF 函数的方式。和函数写法相比,框架写法虽然能够利用更多框架的结构,在复杂场景下让整个 BFF Server 更加清晰,但也相的更加复杂,需要关心更多框架层面的内容。
|
35
|
+
|
36
|
+
框架写法中,所有的 BFF 函数都需要写在 `api/lambda/` 目录下,并且无法使用钩子文件 `_app.[tj]s`。
|
37
|
+
|
38
|
+
多数情况下,函数写法就能覆盖大多数 BFF 函数的定制需求。只有当你的项目服务端逻辑比较复杂,代码需要分层,或者需要使用更多框架的元素时,才需要使用框架写法。
|
39
|
+
|
40
|
+
:::note
|
41
|
+
不同插件框架写法的目录结构不一定相同,详情可见[运行时框架](/docs/guides/advanced-features/bff/frameworks)。
|
42
|
+
:::
|
43
|
+
|
@@ -1,4 +1,66 @@
|
|
1
1
|
---
|
2
|
-
title:
|
2
|
+
title: 自定义 App
|
3
3
|
sidebar_position: 7
|
4
4
|
---
|
5
|
+
|
6
|
+
在[入口](/docs/guides/concept/entries)概念中提到, Modern.js 提供了三种文件约定来标记入口。
|
7
|
+
|
8
|
+
通常情况下,`routes/` 与 `App.[jt]sx` 两种模式已经能够满足需求。当开发者需要在根组件挂载前做些操作,或者完全接管 Webpack 入口时,可以在入口目录下放置 `index.[jt]sx` 文件,我们称为**自定义 App**。
|
9
|
+
|
10
|
+
## 添加自定义行为
|
11
|
+
|
12
|
+
当 `index` 文件默认导出**函数**是,Modern.js 还是会根据 `runtime.features` 的设置情况生成 `createApp` 包裹后的代码。在渲染过程中,将 `createApp` 包裹后的组件作为参数传递给 `index` 文件导出的函数,这样开发者可以自定义将组件挂载到 DOM 节点上,或在挂载前添加自定义行为。例如:
|
13
|
+
|
14
|
+
```js title=src/index.jsx
|
15
|
+
import { bootstrap } from '@modern-js/runtime';
|
16
|
+
|
17
|
+
export default App => {
|
18
|
+
// do something before bootstrap...
|
19
|
+
bootstrap(App, 'root');
|
20
|
+
};
|
21
|
+
```
|
22
|
+
|
23
|
+
Modern.js 生成的文件内容如下:
|
24
|
+
|
25
|
+
```js
|
26
|
+
import customRender from '@/src/index.js';
|
27
|
+
import { createApp, bootstrap } from '@modern-js/runtime';
|
28
|
+
import React from 'react';
|
29
|
+
import App from '@/src/App';
|
30
|
+
|
31
|
+
const IS_BROWSER = typeof window !== 'undefined';
|
32
|
+
const MOUNT_ID = 'root';
|
33
|
+
|
34
|
+
let AppWrapper = null;
|
35
|
+
|
36
|
+
const renderApp = () => {
|
37
|
+
AppWrapper = createApp({
|
38
|
+
// runtime 的插件参数...
|
39
|
+
})(App);
|
40
|
+
customRender(AppWrapper);
|
41
|
+
};
|
42
|
+
|
43
|
+
renderApp();
|
44
|
+
|
45
|
+
export default AppWrapper;
|
46
|
+
|
47
|
+
if (IS_BROWSER && module.hot) {
|
48
|
+
module.hot.accept('<path>/src/App', () => {
|
49
|
+
renderApp();
|
50
|
+
});
|
51
|
+
}
|
52
|
+
```
|
53
|
+
|
54
|
+
## 完全接管 Webpack 入口
|
55
|
+
|
56
|
+
当 `index.[jt]sx` 文件没有导出函数时,这时候该文件就是真正的 Webpack 入口文件。这里和 [Create React App](https://github.com/facebook/create-react-app) 类似,需要自己将组件挂载到 DOM 节点、添加热更新代码等。例如:
|
57
|
+
|
58
|
+
```js title=src/index.jsx
|
59
|
+
import React from 'react';
|
60
|
+
import ReactDOM from 'react-dom';
|
61
|
+
import App from './App';
|
62
|
+
|
63
|
+
ReactDOM.render(<App />, document.getElementById('root'));
|
64
|
+
```
|
65
|
+
|
66
|
+
Modern.js **不推荐**使用这种方式,这种方式丧失了框架的一些能力,如 **`modern.config.js` 文件中的 `runtime` 配置将不会再生效**。
|
@@ -1,135 +1,46 @@
|
|
1
1
|
---
|
2
|
-
title:
|
2
|
+
title: 自定义 Web Server
|
3
3
|
sidebar_position: 2
|
4
4
|
---
|
5
5
|
|
6
|
-
|
6
|
+
Modern.js 作为以客户端为中心的开发框架,对服务端的定制能力较弱。而在有些开发场景下,需要定制特殊的服务端逻辑,例如用户鉴权、请求预处理、添加页面渲染骨架等。
|
7
7
|
|
8
|
-
|
8
|
+
因此 Modern.js 提供了一种功能,让项目可以在给定的范围内扩展 Modern.js 内置的 Web Server,来实现相应的需求。
|
9
9
|
|
10
|
+
## 创建自定义 Web Server
|
10
11
|
|
11
|
-
在项目根目录执行 `pnpm run new`
|
12
|
-
|
12
|
+
在项目根目录执行 `pnpm run new` 命令,按照如下选择,开启「自定义 Web Serve」功能:
|
13
13
|
|
14
14
|
```bash
|
15
15
|
? 请选择你想要的操作: 创建工程元素
|
16
|
-
? 创建工程元素:
|
17
|
-
? 请选择运行时框架: Express/Koa/Egg/Nest
|
16
|
+
? 创建工程元素: 新建「自定义 Web Server」源码目录
|
18
17
|
```
|
19
18
|
|
20
|
-
目前 Modern.js 默认支持 4 种主流的 Node.js Server 框架:[Express](https://expressjs.com/)、[Koa](https://koajs.com/)、[Egg.js](https://eggjs.org/zh-cn/)、[Nest](https://nestjs.com/),选择运行时框架时,可根据自身偏好进行选择。
|
21
|
-
|
22
19
|
执行命令后,项目目录下会新建 `server/index.ts` 文件,自定义逻辑在这个文件中编写。
|
23
20
|
|
24
|
-
##
|
21
|
+
## 使用 API 扩展 Web Server
|
25
22
|
|
26
|
-
|
23
|
+
Modern.js 提供了 **Hook** 与 **Middleware** 两类 API 来扩展 Web Server。
|
27
24
|
|
28
|
-
|
29
|
-
目前 Modern.js 只支持前置中间件的扩展。
|
30
|
-
:::
|
25
|
+
### Hook
|
31
26
|
|
32
|
-
|
33
|
-
|
34
|
-
```ts
|
35
|
-
import { hook } from '@modern-js/runtime/server';
|
36
|
-
import type { Request, Response, NextFunction } from 'express';
|
37
|
-
|
38
|
-
export default hook(({ addMiddleware }) => {
|
39
|
-
addMiddleware((request: Request, response: Response, next: NextFunction) => {
|
40
|
-
if (request.headers.cookies['login-token']) {
|
41
|
-
return next();
|
42
|
-
} else {
|
43
|
-
response.status = 401;
|
44
|
-
response.end();
|
45
|
-
}
|
46
|
-
});
|
47
|
-
});
|
48
|
-
```
|
27
|
+
Hook 可以控制 Web Server 对请求处理的内置逻辑,非 BFF 请求会经过 Hook 的处理。
|
49
28
|
|
50
|
-
|
51
|
-
|
52
|
-
```ts
|
53
|
-
import { hook } from '@modern-js/runtime/server';
|
54
|
-
import type { Context, Next } from 'koa';
|
55
|
-
|
56
|
-
export default hook(({ addMiddleware }) => {
|
57
|
-
addMiddleware(async (ctx: Context, next: Next) => {
|
58
|
-
if (ctx.cookies['login-token']) {
|
59
|
-
await next();
|
60
|
-
} else {
|
61
|
-
ctx.status = 401;
|
62
|
-
}
|
63
|
-
});
|
64
|
-
});
|
65
|
-
```
|
29
|
+
Hook 不可以使用运行时框架拓展。
|
66
30
|
|
67
|
-
|
31
|
+
详细 API 可以查看 [Hook](/docs/apis/app/runtime/web-server/hook)。
|
68
32
|
|
69
|
-
Egg 添加中间件的方式与 Koa 相同。
|
70
33
|
|
71
|
-
|
72
|
-
import { hook } from '@modern-js/runtime/server';
|
73
|
-
import type { Context, Next } from 'koa';
|
34
|
+
### Middleware
|
74
35
|
|
75
|
-
|
76
|
-
addMiddleware(async (ctx: Context, next: Next) => {
|
77
|
-
if (ctx.cookies['login-token']) {
|
78
|
-
await next();
|
79
|
-
} else {
|
80
|
-
ctx.status = 401;
|
81
|
-
}
|
82
|
-
});
|
83
|
-
});
|
84
|
-
```
|
36
|
+
Middleware 可以为 Web Server 添加前置中间件,只有 SSR 请求会经过 Middleware 的处理。
|
85
37
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
```ts
|
93
|
-
import { hook } from '@modern-js/runtime/server';
|
94
|
-
import { Module, Injectable, Controller, Get } from '@nestjs/common';
|
95
|
-
|
96
|
-
@Controller('cats')
|
97
|
-
export class CatsController {
|
98
|
-
constructor(private readonly catsService: CatsService) {}
|
99
|
-
|
100
|
-
@Get()
|
101
|
-
getHello() {
|
102
|
-
return this.catsService.getHello();
|
103
|
-
}
|
104
|
-
}
|
105
|
-
|
106
|
-
@Injectable()
|
107
|
-
class CatsService {
|
108
|
-
getHello(): string {
|
109
|
-
return '<div>Hello world!</div>';;
|
110
|
-
}
|
111
|
-
}
|
112
|
-
|
113
|
-
@Module({
|
114
|
-
controllers: [CatsController],
|
115
|
-
providers: [CatsService],
|
116
|
-
})
|
117
|
-
class CatsModule {}
|
118
|
-
|
119
|
-
export default hook(({ addMiddleware }) => {
|
120
|
-
addMiddleware((request: Request, response: Response, next: NextFunction) => {
|
121
|
-
if (request.headers.cookies['login-token']) {
|
122
|
-
return next();
|
123
|
-
} else {
|
124
|
-
response.status = 401;
|
125
|
-
response.end();
|
126
|
-
}
|
127
|
-
});
|
128
|
-
|
129
|
-
addMiddleware(CatsModule);
|
130
|
-
});
|
131
|
-
```
|
38
|
+
Middleware 可以使用运行时框架拓展。
|
39
|
+
|
40
|
+
详细 API 可以查看 [Hook](/docs/apis/app/runtime/web-server/middleware)。
|
41
|
+
|
42
|
+
## 完全自定义的 Web Server
|
132
43
|
|
133
|
-
:::
|
134
|
-
|
44
|
+
:::note
|
45
|
+
敬请期待
|
135
46
|
:::
|
@@ -2,3 +2,64 @@
|
|
2
2
|
title: 数据获取
|
3
3
|
sidebar_position: 2
|
4
4
|
---
|
5
|
+
|
6
|
+
Modern.js 中提供了开箱即用的数据获取能力,开发者可以通过这些 API,在 CSR 和 SSR 环境同构的进行开发。
|
7
|
+
|
8
|
+
需要注意的是,这些 API 并不帮助应用发起请求,而是帮助开发者更好的管理数据与路由的关系。
|
9
|
+
|
10
|
+
## useLoader(旧版)
|
11
|
+
|
12
|
+
**`useLoader`** 是 Modern.js 老版本中的 API。该 API 是一个 React Hook,专门提供给 SSR 应用使用,让开发者能同构的在组件中获取数据。
|
13
|
+
|
14
|
+
:::tip
|
15
|
+
CSR 的项目没有必要使用 `useLoader` 获取数据。
|
16
|
+
:::
|
17
|
+
|
18
|
+
以下是一个最简单的例子:
|
19
|
+
|
20
|
+
```tsx
|
21
|
+
import { useLoader } from '@modern-js/runtime';
|
22
|
+
|
23
|
+
export default () => {
|
24
|
+
const { data } = useLoader(async () => {
|
25
|
+
console.log('fetch in useLoader');
|
26
|
+
|
27
|
+
// 这里没有发送真实的请求,只是返回了一个写死的数据。
|
28
|
+
// 真实项目中,应该返回从远端获取的数据。
|
29
|
+
return {
|
30
|
+
name: 'modern.js',
|
31
|
+
};
|
32
|
+
});
|
33
|
+
|
34
|
+
return <div>Hello, {data?.name}</div>;
|
35
|
+
};
|
36
|
+
```
|
37
|
+
|
38
|
+
上述代码启动后,访问页面。可以看到在终端输出了日志,而在浏览器终端却没有打印日志。
|
39
|
+
|
40
|
+
这是因为 Modern.js 在服务端渲染时,在会收集 `useLoader` 返回的数据,并将数据注入到响应的 HTML 中。如果 SSR 渲染成功,在 HTML 中可以看到如下代码片段:
|
41
|
+
|
42
|
+
```html
|
43
|
+
<script>
|
44
|
+
window._SSR_DATA = {};
|
45
|
+
</script>
|
46
|
+
```
|
47
|
+
|
48
|
+
在这全局变量中,记录了每一份数据,而在浏览器端渲染的过程中,会优先使用这份数据。如果数据不存在,则会重新执行 `useLoader` 函数。
|
49
|
+
|
50
|
+
:::note
|
51
|
+
在构建阶段,Modern.js 会自动为每个 `useLoader` 生成一个 Loader ID,并注入到 SSR 和 CSR 的 JS Bundle 中,用来关联 Loader 和数据。
|
52
|
+
:::
|
53
|
+
|
54
|
+
相比于 Next.js 中的 `getServerSideProps`,在渲染前预先获取数据。使用 `useLoader`,可以在组件中获取局部 UI 所需要的数据,而不用将数据层层传递。同样,也不会因为不同路由需要不同数据请求,而在最外层的数据获取函数中添加冗余的逻辑。当然 `useLoader` 也存在一些问题,例如服务端代码 Treeshaking 困难,服务端需要多一次预渲染等。
|
55
|
+
|
56
|
+
Modern.js 在新版本中,设计了全新的 Loader 方案。新方案解决了这些问题,并能够配合**嵌套路由**,对页面性能做优化。
|
57
|
+
|
58
|
+
:::note
|
59
|
+
详细 API 可以查看 [useLoader](/docs/apis/app/runtime/core/use-loader)。
|
60
|
+
:::
|
61
|
+
## Route Loader
|
62
|
+
|
63
|
+
:::note
|
64
|
+
敬请期待
|
65
|
+
:::
|
@@ -3,9 +3,65 @@ title: 环境变量
|
|
3
3
|
sidebar_position: 7
|
4
4
|
---
|
5
5
|
|
6
|
+
Modern.js 提供了对环境变量的支持,包含内置的环境变量和自定义的环境变量。
|
7
|
+
|
8
|
+
## 内置的环境变量
|
9
|
+
|
10
|
+
### NODE_ENV
|
11
|
+
|
12
|
+
表示当前的执行环境,是**只读的**的环境变量,其值在不同的执行命令下具有不同的值:
|
13
|
+
|
14
|
+
- `production`:执行 `modern build`、`modern preview` 命令时的默认值。
|
15
|
+
- `test`:执行 `modern test` 命令时的默认值。
|
16
|
+
- `development`:执行 `modern dev` 命令时的默认值,同时也是其他所有情况下的默认值。
|
17
|
+
|
18
|
+
### MODERN_ENV
|
19
|
+
|
20
|
+
手动设置当前的执行环境。除了上述 NODE_ENV 对应的值之外,这里支持自定义环境名称,例如 `staging`、`boe` 等。
|
21
|
+
|
22
|
+
:::tip
|
23
|
+
MODERN_ENV 的优先级高于 NODE_ENV。
|
24
|
+
:::
|
25
|
+
|
26
|
+
## 自定义环境变量
|
27
|
+
|
28
|
+
环境变量支持通过 `shell` 和 `.env` 文件两种方式指定。
|
29
|
+
|
30
|
+
### 通过 `shell` 指定
|
31
|
+
|
32
|
+
在命令前添加自定义环境变量:
|
33
|
+
|
34
|
+
```shell
|
35
|
+
REACT_APP_FOO=123 BAR=456 pnpm run dev
|
36
|
+
```
|
37
|
+
|
38
|
+
### 通过 `.env` 文件指定
|
39
|
+
|
40
|
+
在项目根目录创建 `.env` 文件,并添加自定义环境变量,这些环境变量会默认添加到启动项目的 Node.js 进程中,例如:
|
41
|
+
|
42
|
+
```env
|
43
|
+
REACT_APP_FOO=123
|
44
|
+
BAR=456
|
45
|
+
```
|
46
|
+
|
47
|
+
`.env` 文件遵循以下规则加载规则:
|
48
|
+
|
49
|
+
* `.env`:默认加载。
|
50
|
+
* `.env.{ MODERN_ENV | NODE_ENV }`:针对具体环境设置环境变量,会覆盖 `.env` 中的设置。
|
51
|
+
|
52
|
+
当需要根据环境使用不同的配置时,可以把环境变量定义到对应环境名称的 `.env` 文件中,并在启动项目时手动设置执行环境。例如使用以下命令启动项目时,将会加载 `.env` 和 `.env.staging`:
|
53
|
+
|
54
|
+
```shell
|
55
|
+
MODERN_ENV=staging pnpm run dev
|
56
|
+
```
|
57
|
+
|
6
58
|
## 使用环境变量
|
7
59
|
|
8
|
-
|
60
|
+
### 约定命名
|
61
|
+
|
62
|
+
在前端代码中可以直接使用 `NODE_ENV` 环境变量。另外,以 `MODERN_` 开头的自定义环境变量,也可以在代码中直接使用。
|
63
|
+
|
64
|
+
例如:
|
9
65
|
|
10
66
|
```js
|
11
67
|
if (process.env.NODE_ENV === 'development') {
|
@@ -13,7 +69,7 @@ if (process.env.NODE_ENV === 'development') {
|
|
13
69
|
}
|
14
70
|
```
|
15
71
|
|
16
|
-
执行 `dev`
|
72
|
+
执行 `pnpm run dev` 命令之后可以看到如下构建产物:
|
17
73
|
|
18
74
|
```js
|
19
75
|
if (true) {
|
@@ -21,62 +77,53 @@ if (true) {
|
|
21
77
|
}
|
22
78
|
```
|
23
79
|
|
24
|
-
同样在自定义的 HTML
|
80
|
+
同样在自定义的 HTML 模板中,也可以直接使用这类环境变量。如 `config/html/head.html`:
|
25
81
|
|
26
82
|
```js
|
27
83
|
<meta name="test" content="<process.env.NODE_ENV>">
|
28
84
|
```
|
29
85
|
|
30
|
-
|
86
|
+
### 任意命名
|
87
|
+
|
88
|
+
如果需要在代码中使用任意名称的环境变量,可以在 [`source.globalVars`](/docs/configure/app/source/global-vars) 配置指定, 例如:
|
89
|
+
|
31
90
|
```typescript title="modern.config.ts"
|
32
91
|
export default defineConfig({
|
33
92
|
source: {
|
34
|
-
|
35
|
-
|
36
|
-
}
|
37
|
-
|
38
|
-
|
39
|
-
`VERSION` 环境变量需要在编译之前设置好, 可以在执行命令时添加:
|
40
|
-
|
41
|
-
```bash
|
42
|
-
// linux, macOS
|
43
|
-
$ VERSION=1.0.0 npm run dev
|
44
|
-
|
45
|
-
// windows
|
46
|
-
$ set VERSION=1.0.0&&npm run dev
|
47
|
-
```
|
48
|
-
|
49
|
-
Modern.js 也支持在 `.env` 文件中定义环境变量:
|
50
|
-
|
51
|
-
```js title=".env"
|
52
|
-
VERSION=1.0.0
|
93
|
+
globalVars: {
|
94
|
+
'process.env.VERSION': process.env.VERSION,
|
95
|
+
}.
|
96
|
+
},
|
97
|
+
});
|
53
98
|
```
|
54
99
|
|
55
|
-
|
100
|
+
此时,在代码中的 `process.env.VERSION`,将会被替换为环境变量中 `VERSION` 的值。
|
56
101
|
|
57
|
-
|
58
|
-
|
102
|
+
:::note
|
103
|
+
`source.globalVars` 也支持将其他表达式或字符串替换为指定的值,不仅限于环境变量。
|
104
|
+
:::
|
59
105
|
|
106
|
+
## 使用全局替换
|
60
107
|
|
61
|
-
|
108
|
+
除了环境变量,Modern.js 也支持将代码中的变量替换成其它值或者表达式,可以用于在代码逻辑中区分开发环境与生产环境等场景。
|
62
109
|
|
63
|
-
|
110
|
+
例如将代码中的 `TWO` 转换为 `1 + 1` 的表达式:
|
64
111
|
|
65
|
-
```
|
66
|
-
export default
|
112
|
+
```ts
|
113
|
+
export default {
|
67
114
|
source: {
|
68
|
-
|
69
|
-
|
70
|
-
}
|
71
|
-
}
|
72
|
-
}
|
115
|
+
define: {
|
116
|
+
TWO: '1 + 1',
|
117
|
+
},
|
118
|
+
},
|
119
|
+
};
|
73
120
|
```
|
74
121
|
|
75
|
-
|
122
|
+
```ts
|
123
|
+
const foo = TWO;
|
76
124
|
|
77
|
-
|
78
|
-
|
79
|
-
declare const VERSION: string;
|
80
|
-
|
81
|
-
const a = VERSION;
|
125
|
+
// ⬇️ Turn into being...
|
126
|
+
const foo = 1 + 1;
|
82
127
|
```
|
128
|
+
|
129
|
+
在大多数情况下,`source.globalVars` 已经能满足替换变量的需求。但 `source.globalVars` 传入的值都会默认被 JSON 序列化,因此无法做出像上面例子中 `1 + 1` 的替换,此时就需要使用 [`source.define`](/docs/configure/app/source/define)。
|