@modern-js/main-doc 2.0.0-beta.3 → 2.0.0-beta.5
Sign up to get free protection for your applications and to get access to all the features.
- package/.turbo/turbo-build.log +1 -1
- package/en/docusaurus-plugin-content-docs/current/apis/app/commands/dev.md +8 -3
- package/en/docusaurus-plugin-content-docs/current/apis/app/commands/inspect.md +31 -10
- package/en/docusaurus-plugin-content-docs/current/apis/app/commands/serve.md +32 -0
- package/en/docusaurus-plugin-content-docs/current/apis/app/hooks/src/server.md +31 -0
- package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/core/bootstrap.md +4 -3
- package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/core/create-app.md +2 -3
- package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/core/use-module-apps.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/components/init-app.md +42 -0
- package/en/docusaurus-plugin-content-docs/current/configure/app/builder-plugins.md +70 -0
- package/en/docusaurus-plugin-content-docs/current/configure/app/dev/with-master-app.md +0 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/plugins.md +11 -5
- package/en/docusaurus-plugin-content-docs/current/configure/app/server/routes.md +2 -4
- package/en/docusaurus-plugin-content-docs/current/configure/app/source/disable-entry-dirs.md +38 -0
- package/en/docusaurus-plugin-content-docs/current/configure/app/source/entries.md +66 -2
- package/en/docusaurus-plugin-content-docs/current/configure/app/tools/esbuild.md +16 -39
- package/en/docusaurus-plugin-content-docs/current/guides/basic-features/css/css-in-js.md +38 -0
- package/en/docusaurus-plugin-content-docs/current/guides/basic-features/css/css-modules.md +86 -0
- package/en/docusaurus-plugin-content-docs/current/guides/basic-features/css/less-sass.md +17 -0
- package/en/docusaurus-plugin-content-docs/current/guides/basic-features/css/postcss.md +81 -0
- package/en/docusaurus-plugin-content-docs/current/guides/basic-features/css/tailwindcss.md +95 -0
- package/en/docusaurus-plugin-content-docs/current/guides/basic-features/data-fetch.md +66 -0
- package/en/docusaurus-plugin-content-docs/current/guides/basic-features/routes.md +270 -0
- package/en/docusaurus-plugin-content-docs/current/guides/concept/entries.md +116 -0
- package/en/docusaurus-plugin-content-docs/current/guides/get-started/quick-start.md +162 -0
- package/en/docusaurus-plugin-content-docs/current/guides/get-started/upgrade.md +78 -0
- package/{zh/tutorials/first-app → en/docusaurus-plugin-content-docs/current/guides}/overview.md +4 -4
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/framework-plugin/_category_.json +4 -0
- package/en/docusaurus-plugin-content-docs/current/guides/topic-detail/framework-plugin/lifecycle.md +15 -0
- package/en/docusaurus-plugin-content-docs/current/tutorials/foundations/introduction.md +1 -1
- package/en/docusaurus-plugin-content-docs/current.json +11 -11
- package/package.json +4 -4
- package/zh/apis/app/commands/dev.md +9 -4
- package/zh/apis/app/commands/inspect.md +32 -11
- package/zh/apis/app/commands/new.md +1 -1
- package/zh/apis/app/commands/{start.md → serve.md} +3 -3
- package/zh/apis/app/hooks/src/index_.md +5 -4
- package/zh/apis/app/hooks/src/server.md +31 -0
- package/zh/apis/app/runtime/core/bootstrap.md +3 -4
- package/zh/apis/app/runtime/core/create-app.md +1 -18
- package/zh/apis/app/runtime/core/use-module-apps.md +64 -33
- package/zh/apis/app/runtime/web-server/hook.md +1 -1
- package/zh/apis/app/runtime/web-server/middleware.md +1 -0
- package/zh/components/debug-app.md +18 -0
- package/zh/components/default-mwa-generate.md +5 -0
- package/zh/components/deploy.md +1 -0
- package/zh/components/enable-micro-frontend.md +13 -0
- package/zh/components/global-proxy.md +28 -0
- package/zh/components/init-app.md +44 -0
- package/zh/components/micro-runtime-config.md +18 -0
- package/zh/components/prerequisites.md +19 -0
- package/zh/components/release-note.md +1 -0
- package/zh/configure/app/builder-plugins.md +72 -0
- package/zh/configure/app/deploy/_category_.json +4 -0
- package/zh/configure/app/deploy/microFrontend.md +64 -0
- package/zh/configure/app/dev/with-master-app.md +0 -2
- package/zh/configure/app/plugins.md +10 -4
- package/zh/configure/app/runtime/master-app.md +33 -36
- package/zh/configure/app/server/routes.md +2 -4
- package/zh/configure/app/source/disable-entry-dirs.md +37 -0
- package/zh/configure/app/source/entries-dir.md +0 -3
- package/zh/configure/app/source/entries.md +66 -3
- package/zh/configure/app/tools/esbuild.md +16 -39
- package/zh/guides/advanced-features/bff/bff-proxy.md +1 -1
- package/zh/guides/advanced-features/compatibility.md +14 -39
- package/zh/guides/advanced-features/eslint.md +21 -21
- package/zh/guides/advanced-features/ssg.md +20 -9
- package/zh/guides/advanced-features/ssr.md +95 -52
- package/zh/guides/advanced-features/testing.md +44 -1
- package/zh/guides/advanced-features/web-server.md +14 -3
- package/zh/guides/basic-features/css/tailwindcss.md +13 -6
- package/zh/guides/basic-features/data-fetch.md +398 -5
- package/zh/guides/basic-features/html.md +182 -0
- package/zh/guides/basic-features/mock.md +3 -9
- package/zh/guides/basic-features/proxy.md +2 -27
- package/zh/guides/basic-features/routes.md +35 -3
- package/zh/guides/concept/entries.md +108 -19
- package/zh/guides/get-started/quick-start.md +14 -83
- package/zh/guides/get-started/upgrade.md +11 -9
- package/zh/guides/{concept → topic-detail/framework-plugin}/lifecycle.md +0 -0
- package/zh/guides/topic-detail/micro-frontend/c01-introduction.md +29 -0
- package/zh/guides/topic-detail/micro-frontend/c02-development.md +191 -0
- package/zh/guides/topic-detail/micro-frontend/c03-main-app.md +246 -0
- package/zh/guides/topic-detail/micro-frontend/c04-communicate.md +54 -0
- package/zh/guides/topic-detail/micro-frontend/{mixed-stack.md → c05-mixed-stack.md} +3 -3
- package/zh/guides/topic-detail/model/quick-start.md +1 -1
- package/zh/guides/topic-detail/model/test-model.md +2 -2
- package/zh/guides/topic-detail/monorepo/create-sub-project.md +2 -2
- package/zh/guides/topic-detail/monorepo/intro.md +1 -1
- package/zh/guides/troubleshooting/dependencies.md +0 -69
- package/zh/tutorials/first-app/_category_.json +1 -1
- package/zh/tutorials/first-app/c01-start.md +99 -0
- package/zh/tutorials/first-app/{c05-component/5.1-use-ui-library.md → c02-component.md} +13 -15
- package/zh/tutorials/first-app/c03-css.md +324 -0
- package/zh/tutorials/first-app/{c08-client-side-routing/8.1-code-based-routing.md → c04-routes.md} +52 -39
- package/zh/tutorials/first-app/c05-loader.md +82 -0
- package/zh/tutorials/first-app/c06-model.md +256 -0
- package/zh/tutorials/first-app/c07-container.md +283 -0
- package/zh/tutorials/first-app/c08-entries.md +137 -0
- package/zh/tutorials/foundations/introduction.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/apis/app/commands/start.md +0 -32
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/enable-modern-mode.md +0 -34
- package/zh/apis/generator/overview.md +0 -32
- package/zh/configure/app/output/enable-modern-mode.md +0 -34
- package/zh/guides/advanced-features/custom-app.md +0 -72
- package/zh/guides/topic-detail/micro-frontend/communicate.md +0 -39
- package/zh/guides/topic-detail/micro-frontend/debugging.md +0 -168
- package/zh/guides/topic-detail/micro-frontend/introduction.md +0 -13
- package/zh/guides/topic-detail/micro-frontend/route-mode.md +0 -110
- package/zh/guides/topic-detail/monorepo/deploy.md +0 -43
- package/zh/tutorials/first-app/c01-getting-started/1.1-prerequisites.md +0 -25
- package/zh/tutorials/first-app/c01-getting-started/1.2-minimal-mwa.md +0 -118
- package/zh/tutorials/first-app/c01-getting-started/1.3-dev-command.md +0 -29
- package/zh/tutorials/first-app/c01-getting-started/1.4-enable-ssr.md +0 -47
- package/zh/tutorials/first-app/c01-getting-started/1.5-start-command.md +0 -18
- package/zh/tutorials/first-app/c01-getting-started/1.6-create-repo.md +0 -31
- package/zh/tutorials/first-app/c01-getting-started/_category_.json +0 -3
- package/zh/tutorials/first-app/c02-generator-and-studio/2.1-generator.md +0 -79
- package/zh/tutorials/first-app/c02-generator-and-studio/2.2-boilerplates.md +0 -34
- package/zh/tutorials/first-app/c02-generator-and-studio/2.3-configuration.md +0 -19
- package/zh/tutorials/first-app/c02-generator-and-studio/_category_.json +0 -3
- package/zh/tutorials/first-app/c03-ide/3.1-setting-up.md +0 -55
- package/zh/tutorials/first-app/c03-ide/3.2-hints-in-ide.md +0 -60
- package/zh/tutorials/first-app/c03-ide/3.3-autofix-in-ide.md +0 -11
- package/zh/tutorials/first-app/c03-ide/3.4-autofix-in-cli.md +0 -63
- package/zh/tutorials/first-app/c03-ide/_category_.json +0 -3
- package/zh/tutorials/first-app/c04-es6-plus-and-ts/4.1-use-es6-plus.md +0 -54
- package/zh/tutorials/first-app/c04-es6-plus-and-ts/4.2-use-typescript.md +0 -135
- package/zh/tutorials/first-app/c04-es6-plus-and-ts/4.3-compatibility.md +0 -67
- package/zh/tutorials/first-app/c04-es6-plus-and-ts/_category_.json +0 -3
- package/zh/tutorials/first-app/c05-component/5.2-use-standalone-component.md +0 -72
- package/zh/tutorials/first-app/c05-component/_category_.json +0 -3
- package/zh/tutorials/first-app/c06-css-and-component/6.1-css-in-js.md +0 -110
- package/zh/tutorials/first-app/c06-css-and-component/6.2-utility-class.md +0 -143
- package/zh/tutorials/first-app/c06-css-and-component/6.3-postcss.md +0 -84
- package/zh/tutorials/first-app/c06-css-and-component/6.4-design-system.md +0 -83
- package/zh/tutorials/first-app/c06-css-and-component/6.5-storybook.md +0 -77
- package/zh/tutorials/first-app/c06-css-and-component/6.6-testing.md +0 -104
- package/zh/tutorials/first-app/c06-css-and-component/_category_.json +0 -3
- package/zh/tutorials/first-app/c07-app-entry/7.1-intro.md +0 -69
- package/zh/tutorials/first-app/c07-app-entry/7.2-add-entry-in-cli.md +0 -100
- package/zh/tutorials/first-app/c07-app-entry/7.3-manage-entries-by-hand.md +0 -69
- package/zh/tutorials/first-app/c07-app-entry/_category_.json +0 -3
- package/zh/tutorials/first-app/c08-client-side-routing/_category_.json +0 -3
- package/zh/tutorials/first-app/c09-bff/9.1-serverless.md +0 -30
- package/zh/tutorials/first-app/c09-bff/9.2-enable-bff.md +0 -95
- package/zh/tutorials/first-app/c09-bff/9.3-fetch-bff.md +0 -131
- package/zh/tutorials/first-app/c09-bff/_category_.json +0 -3
- package/zh/tutorials/first-app/c10-model/10.1-application-architecture.md +0 -21
- package/zh/tutorials/first-app/c10-model/10.2-add-model.md +0 -185
- package/zh/tutorials/first-app/c10-model/10.3-use-model.md +0 -55
- package/zh/tutorials/first-app/c10-model/10.4-testing.md +0 -69
- package/zh/tutorials/first-app/c10-model/_category_.json +0 -3
- package/zh/tutorials/first-app/c11-container/11.1-use-model-with-app-state.md +0 -240
- package/zh/tutorials/first-app/c11-container/11.2-add-container.md +0 -109
- package/zh/tutorials/first-app/c11-container/11.3-use-loader.md +0 -63
- package/zh/tutorials/first-app/c11-container/11.4-testing.md +0 -56
- package/zh/tutorials/first-app/c11-container/_category_.json +0 -3
@@ -177,7 +177,7 @@ Modern.js 会生成 `/login` 和 `/sign` 两条路由,`__auth/layout.tsx` 组
|
|
177
177
|
|
178
178
|
`routes/` 下每一层目录中,开发者可以创建 `loading.tsx` 文件,默认导出一个 `<Loading>` 组件。
|
179
179
|
|
180
|
-
|
180
|
+
当路由目录下存在该组件和 `layout` 组件时,这一级子路由下所有的路由切换时,都会以该 `<Loading>` 组件作为 JS Chunk 加载时的 Fallback UI。例如以下文件目录:
|
181
181
|
|
182
182
|
```bash
|
183
183
|
.
|
@@ -191,7 +191,38 @@ Modern.js 会生成 `/login` 和 `/sign` 两条路由,`__auth/layout.tsx` 组
|
|
191
191
|
└── page.tsx
|
192
192
|
```
|
193
193
|
|
194
|
-
|
194
|
+
当定义 `loading.tsx` 时,就相当于以下布局:
|
195
|
+
```tsx title="当路由为 / 时"
|
196
|
+
<Layout>
|
197
|
+
<Suspense fallback={<Loading/>}>
|
198
|
+
<Page><Page>
|
199
|
+
</Suspense>
|
200
|
+
</Layout>
|
201
|
+
```
|
202
|
+
|
203
|
+
```tsx title="当路由为 /blog 时"
|
204
|
+
<Layout>
|
205
|
+
<Suspense fallback={<Loading/>}>
|
206
|
+
<BlogPage />
|
207
|
+
</Suspense>
|
208
|
+
</Layout>
|
209
|
+
```
|
210
|
+
|
211
|
+
```tsx title="当路由为 /blog/123 时"
|
212
|
+
<Layout>
|
213
|
+
<Suspense fallback={<Loading/>}>
|
214
|
+
<BlogIdPage />
|
215
|
+
</Suspense>
|
216
|
+
</Layout>
|
217
|
+
```
|
218
|
+
:::info
|
219
|
+
当目录的 layout 组件不存在时,该目录下的 loading 组件也不会生效。
|
220
|
+
:::
|
221
|
+
|
222
|
+
当路由从 `/` 跳转到 `/blog` 时,如果 `blog/page` 组件的 JS Chunk 还未加载,则会先展示 `loading.tsx` 中导出的组件 UI。
|
223
|
+
|
224
|
+
同理,当路由从 `/` 或者 `/blog` 跳转到 `/blog/123` 时,如果 `blog/[id]/page` 组件的 JS Chunk 还未加载,也会先展示 `loading.tsx` 中导出的组件 UI。
|
225
|
+
|
195
226
|
|
196
227
|
### 错误处理
|
197
228
|
|
@@ -206,7 +237,7 @@ Modern.js 会生成 `/login` 和 `/sign` 两条路由,`__auth/layout.tsx` 组
|
|
206
237
|
|
207
238
|
```tsx
|
208
239
|
import { useRouteError } from '@modern-js/runtime/router';
|
209
|
-
|
240
|
+
const ErrorBoundary = () => {
|
210
241
|
const error = useRouteError();
|
211
242
|
return (
|
212
243
|
<div>
|
@@ -215,6 +246,7 @@ export default const ErrorBoundary = () => {
|
|
215
246
|
</div>
|
216
247
|
)
|
217
248
|
}
|
249
|
+
export default ErrorBoundary;
|
218
250
|
```
|
219
251
|
|
220
252
|
## 自控式路由
|
@@ -3,7 +3,7 @@ title: 入口
|
|
3
3
|
sidebar_position: 2
|
4
4
|
---
|
5
5
|
|
6
|
-
入口是 Modern.js
|
6
|
+
入口是 Modern.js 默认的文件约定,项目的每一个入口是一张独立的页面,对应一条**服务端路由**。
|
7
7
|
|
8
8
|
很多配置,如 HTML 模板、Meta 信息、是否开启 SSR、SSG、服务端路由规则都是以入口为维度划分的。
|
9
9
|
|
@@ -13,7 +13,6 @@ Modern.js 初始化的项目是单入口的,项目结构如下:
|
|
13
13
|
|
14
14
|
```
|
15
15
|
.
|
16
|
-
├── node_modules
|
17
16
|
├── src
|
18
17
|
│ ├── modern-app-env.d.ts
|
19
18
|
│ └── routes
|
@@ -30,9 +29,9 @@ Modern.js 初始化的项目是单入口的,项目结构如下:
|
|
30
29
|
Modern.js 可以很方便的将单入口切换成多入口。可以在项目下执行 `pnpm run new`,通过生成器创建入口:
|
31
30
|
|
32
31
|
```bash
|
33
|
-
?
|
34
|
-
?
|
35
|
-
?
|
32
|
+
? 请选择你想要的操作 创建工程元素
|
33
|
+
? 创建工程元素 新建「应用入口」
|
34
|
+
? 请填写入口名称 new-entry
|
36
35
|
```
|
37
36
|
|
38
37
|
执行后,`src/` 目录将会变成如下结构:
|
@@ -57,10 +56,13 @@ Modern.js 可以很方便的将单入口切换成多入口。可以在项目下
|
|
57
56
|
执行 `pnpm run dev` 后,可以看到新增一条 `/new-entry` 的路由,并且被迁移的代码路由并未发生变化。
|
58
57
|
|
59
58
|
:::note
|
60
|
-
Modern.js 会将和 `package.json` 中 `name`
|
59
|
+
Modern.js 会将和 `package.json` 中 `name` 字段同名的入口作为主入口,默认路由为 `/`,其他入口默认路由为 `/{entryName}`。
|
61
60
|
:::
|
62
61
|
|
63
|
-
|
62
|
+
|
63
|
+
## 入口类型
|
64
|
+
|
65
|
+
不同的入口类型具有不同的编译和运行时行为。在 Modern.js 创建项目时,开发者可以手动选择创建**框架模式**或是**构建模式**的项目。完成创建后,可以看到不同模式的项目样板文件是不同的。
|
64
66
|
|
65
67
|
默认情况下,Modern.js 启动项目前会对 `src/` 下的文件进行扫描,识别入口,并生成对应的服务端路由。
|
66
68
|
|
@@ -73,7 +75,7 @@ Modern.js 会将和 `package.json` 中 `name` 同名的目录作为主入口,
|
|
73
75
|
1. 具有 `routes/` 目录
|
74
76
|
2. 具有 `App.[jt]sx?` 文件
|
75
77
|
3. 具有 `index.[jt]sx?` 文件
|
76
|
-
2. 具有 `pages/`
|
78
|
+
2. 具有 `pages/` 目录(兼容 Modern.js 1.0)
|
77
79
|
|
78
80
|
当 `src/` 目录满足入口特征时,Modern.js 会认为当前项目为单入口应用。
|
79
81
|
|
@@ -83,34 +85,121 @@ Modern.js 会将和 `package.json` 中 `name` 同名的目录作为主入口,
|
|
83
85
|
|
84
86
|
当项目不是单入口应用时,Modern.js 会进一步查看 `src/` 下的一级目录。
|
85
87
|
|
86
|
-
|
88
|
+
### 框架模式入口
|
87
89
|
|
88
|
-
|
90
|
+
框架模式指需要使用 Modern.js 框架能力,例如 Router、SSR、一体化调用等。这类入口约定下,开发者定义的入口并不是真正的 Webpack 编译入口。Modern.js 在启动时会生成一个封装过的入口,可以在 `node_modules/.modern/{entryName}/index.js` 找到真正的入口。
|
89
91
|
|
90
|
-
|
92
|
+
#### 约定式路由
|
91
93
|
|
92
|
-
|
94
|
+
如果入口中存在 `routes/` 目录,Modern.js 会在启动时扫描 `routes/` 下的文件,基于文件约定,自动生成客户端路由(react-router)。
|
93
95
|
|
94
96
|
详细内容可以参考[路由](/docs/guides/basic-features/routes)。
|
95
97
|
|
96
|
-
|
98
|
+
#### 自定义路由
|
97
99
|
|
98
|
-
|
100
|
+
如果入口中存在 `App.[jt]sx?` 文件,开发者可以在这个文件中自由的设置客户端路由,或者不设置客户端路由。
|
99
101
|
|
100
102
|
详细内容可以参考[路由](/docs/guides/basic-features/routes)。
|
101
103
|
|
102
|
-
|
104
|
+
#### 自定义 App
|
105
|
+
|
106
|
+
如果入口中存在 `index.[jt]sx` 文件,并且当文件默认导出函数时,Modern.js 还是会根据 runtime 的设置情况生成 createApp 包裹后的代码。在渲染过程中,将 createApp 包裹后的组件作为参数传递给 index 文件导出的函数,这样开发者可以自定义将组件挂载到 DOM 节点上,或在挂载前添加自定义行为。例如:
|
107
|
+
|
108
|
+
```tsx
|
109
|
+
import ReactDOM from 'react-dom/client'
|
110
|
+
import { bootstrap } from '@modern-js/runtime';
|
111
|
+
|
112
|
+
|
113
|
+
export default (App: React.ComponentType) => {
|
114
|
+
// do something before bootstrap...
|
115
|
+
bootstrap(App, 'root', undefined, ReactDOM);
|
116
|
+
};
|
117
|
+
```
|
118
|
+
|
119
|
+
:::warning
|
120
|
+
由于 bootstrap 函数需要兼容 React17 和 React18 的用法,调用 bootstrap 函数时需要手动传入 ReactDOM 参数。
|
121
|
+
:::
|
122
|
+
|
123
|
+
Modern.js 生成的文件内容如下:
|
124
|
+
|
125
|
+
```js
|
126
|
+
import React from 'react';
|
127
|
+
import ReactDOM from 'react-dom/client';
|
128
|
+
import customBootstrap from '@_edenx_src/index.tsx';
|
129
|
+
import App from '@_edenx_src/App';
|
130
|
+
import { router, state } from '@edenx/runtime/plugins';
|
131
|
+
|
132
|
+
const IS_BROWSER = typeof window !== 'undefined' && window.name !== 'nodejs';
|
133
|
+
const MOUNT_ID = 'root';
|
134
|
+
|
135
|
+
let AppWrapper = null;
|
136
|
+
|
137
|
+
function render() {
|
138
|
+
AppWrapper = createApp({
|
139
|
+
// runtime 的插件参数...
|
140
|
+
})(App)
|
141
|
+
if (IS_BROWSER) {
|
142
|
+
customBootstrap(AppWrapper);
|
143
|
+
}
|
144
|
+
return AppWrapper
|
145
|
+
}
|
146
|
+
|
147
|
+
AppWrapper = render();
|
148
|
+
|
149
|
+
export default AppWrapper;;
|
150
|
+
```
|
151
|
+
|
152
|
+
### 构建模式入口
|
153
|
+
|
154
|
+
构建模式是指不使用任何 Modern.js 运行时的能力,完全由开发者自己定义项目 Webpack 的入口。
|
155
|
+
|
156
|
+
如果入口中存在 `index.[jt]sx` ,并且没有默认导出函数时,这时候该文件就是真正的 Webpack 入口文件。这里和 [Create React App](https://github.com/facebook/create-react-app) 类似,需要自己将组件挂载到 DOM 节点、添加热更新代码等。例如:
|
103
157
|
|
104
|
-
|
158
|
+
```js title=src/index.jsx
|
159
|
+
import React from 'react';
|
160
|
+
import ReactDOM from 'react-dom';
|
161
|
+
import App from './App';
|
105
162
|
|
106
|
-
|
163
|
+
ReactDOM.render(<App />, document.getElementById('root'));
|
164
|
+
```
|
165
|
+
|
166
|
+
Modern.js **不推荐**使用这种方式,这种方式丧失了框架的一些能力,如 **`modern.config.js` 文件中的 `runtime` 配置将不会再生效**。但是在项目从其他框架迁移到 Modern.js,例如 CRA,或是自己手动搭建的 webpack 时,这种方式会非常有用。
|
107
167
|
|
108
|
-
|
168
|
+
## 使用配置文件定义入口
|
109
169
|
|
110
|
-
|
170
|
+
有些时候,已有的项目并不是按照 Modern.js 的目录结构来搭建的。如果强行要按照这种结构来工作,会有比较大的迁移成本。
|
111
171
|
|
112
172
|
在 Modern.js 中,除了使用文件约定生成入口外,还可以在 `modern.config.[jt]s` 中手动配置入口。
|
113
173
|
|
174
|
+
```ts
|
175
|
+
export default defineConfig({
|
176
|
+
source: {
|
177
|
+
entries: {
|
178
|
+
// 指定一个名称为 entry_customize 的新入口
|
179
|
+
entry_customize: './src/home/test/index.js',
|
180
|
+
},
|
181
|
+
},
|
182
|
+
});
|
183
|
+
```
|
184
|
+
|
114
185
|
:::tip
|
115
186
|
详情可以查看 [source.entries](/docs/configure/app/source/entries)。
|
116
187
|
:::
|
188
|
+
|
189
|
+
## 禁用默认入口扫描
|
190
|
+
|
191
|
+
另外,项目的部分结构可能恰巧命中了 Modern.js 的约定,但实际上这部分并不是真实的入口。
|
192
|
+
|
193
|
+
Modern.js 提供了配置,来禁用默认的入口扫描。与配置的入口结合使用,大部分项目可以在不修改目录结构的情况下,快速的进行迁移。
|
194
|
+
|
195
|
+
```ts
|
196
|
+
export default defineConfig({
|
197
|
+
source: {
|
198
|
+
disableDefaultEntries: true,
|
199
|
+
},
|
200
|
+
});
|
201
|
+
```
|
202
|
+
|
203
|
+
:::tip
|
204
|
+
详情可以查看 [source.disableDefaultEntries](/docs/configure/app/source/disable-default-entries)。
|
205
|
+
:::
|
@@ -5,25 +5,9 @@ sidebar_position: 1
|
|
5
5
|
|
6
6
|
## 环境准备
|
7
7
|
|
8
|
-
|
8
|
+
import Prerequisites from '@site-docs/components/prerequisites.md'
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
Modern.js 推荐在开发环境里先安装 [nvm](https://github.com/nvm-sh/nvm#install--update-script),在 shell 里集成[自动切换 node 版本的脚本](https://github.com/nvm-sh/nvm#deeper-shell-integration)。
|
13
|
-
|
14
|
-
然后只要仓库根目录下有内容为 `lts/fermium` 或 `lts/gallium` 的 `.nvmrc` 文件,进入这个仓库时就会自动安装或切换到正确的 Node.js 版本。
|
15
|
-
|
16
|
-
### pnpm
|
17
|
-
|
18
|
-
推荐使用 [pnpm](https://pnpm.io/installation) 来管理依赖:
|
19
|
-
|
20
|
-
```bash
|
21
|
-
npm install -g pnpm
|
22
|
-
```
|
23
|
-
|
24
|
-
:::note
|
25
|
-
Modern.js 同样支持使用 `yarn`、`npm` 进行依赖管理。
|
26
|
-
:::
|
10
|
+
<Prerequisites />
|
27
11
|
|
28
12
|
## 安装
|
29
13
|
|
@@ -44,72 +28,16 @@ npx @modern-js/create myapp
|
|
44
28
|
|
45
29
|
## 初始化项目
|
46
30
|
|
47
|
-
Modern.js 生成器会提供一个可交互的问答界面,根据结果初始化项目,按照默认的选择进行初始化:
|
48
|
-
|
49
|
-
```bash
|
50
|
-
? 请选择你想创建的工程类型 应用
|
51
|
-
? 请选择开发语言 TS
|
52
|
-
? 请选择包管理工具 pnpm
|
53
|
-
```
|
54
|
-
|
55
|
-
在生成项目后,Modern.js 会自动安装依赖、创建 git 仓库。
|
56
|
-
|
57
|
-
```bash
|
58
|
-
[INFO] 依赖自动安装成功
|
59
|
-
[INFO] git 仓库初始化成功
|
60
|
-
[INFO] 创建成功!
|
61
|
-
可在新项目的目录下运行以下命令:
|
62
|
-
pnpm run dev # 按开发环境的要求,运行和调试项目
|
63
|
-
pnpm run build # 按产品环境的要求,构建项目
|
64
|
-
pnpm run start # 按产品环境的要求,运行项目
|
65
|
-
pnpm run lint # 检查和修复所有代码
|
66
|
-
pnpm run new # 继续创建更多项目要素,比如应用入口
|
67
|
-
```
|
68
|
-
|
69
|
-
:::note
|
70
|
-
Modern.js 生成器除了在项目初始化时工作外,也能在后续研发中生成项目各种粒度的模块,并非一用即抛开。
|
71
|
-
:::
|
72
31
|
|
73
|
-
|
32
|
+
import InitApp from '@site-docs/components/init-app.md'
|
74
33
|
|
75
|
-
|
76
|
-
.
|
77
|
-
├── node_modules
|
78
|
-
├── src
|
79
|
-
│ ├── modern-app-env.d.ts
|
80
|
-
│ └── routes
|
81
|
-
│ ├── index.css
|
82
|
-
│ ├── layout.tsx
|
83
|
-
│ └── page.tsx
|
84
|
-
├── modern.config.ts
|
85
|
-
├── package.json
|
86
|
-
├── pnpm-lock.yaml
|
87
|
-
├── README.md
|
88
|
-
└── tsconfig.json
|
89
|
-
```
|
34
|
+
<InitApp />
|
90
35
|
|
91
36
|
## 启动项目
|
92
37
|
|
93
|
-
|
94
|
-
|
95
|
-
```bash
|
96
|
-
$ pnpm run dev
|
97
|
-
|
98
|
-
> modern dev
|
99
|
-
|
100
|
-
info Starting dev server...
|
101
|
-
info App running at:
|
102
|
-
|
103
|
-
> Local: http://localhost:8080/
|
104
|
-
> Network: http://10.94.58.87:8080/
|
105
|
-
> Network: http://10.254.68.105:8080/
|
106
|
-
|
107
|
-
Client ✔ done in 76.10ms
|
108
|
-
```
|
109
|
-
|
110
|
-
在浏览器中打开 `http://localhost:8000/`,能看到以下内容:
|
38
|
+
import DebugApp from '@site-docs/components/debug-app.md'
|
111
39
|
|
112
|
-
|
40
|
+
<DebugApp />
|
113
41
|
|
114
42
|
## 使用配置
|
115
43
|
|
@@ -118,7 +46,7 @@ info App running at:
|
|
118
46
|
可以通过配置文件来开启功能,或覆盖 Modern.js 的默认行为。例如添加如下配置,开启 SSR:
|
119
47
|
|
120
48
|
```ts
|
121
|
-
import { defineConfig } from '@modern-js/app-tools';
|
49
|
+
import AppToolsPlugin, { defineConfig } from '@modern-js/app-tools';
|
122
50
|
|
123
51
|
// https://modernjs.dev/docs/apis/app/config
|
124
52
|
export default defineConfig({
|
@@ -129,6 +57,7 @@ export default defineConfig({
|
|
129
57
|
server: {
|
130
58
|
ssr: true,
|
131
59
|
},
|
60
|
+
plugins: [AppToolsPlugin()],
|
132
61
|
});
|
133
62
|
```
|
134
63
|
|
@@ -180,12 +109,12 @@ info File sizes after production build:
|
|
180
109
|
|
181
110
|
## 本地验证
|
182
111
|
|
183
|
-
在项目中执行 `pnpm run
|
112
|
+
在项目中执行 `pnpm run serve` 即可在本地验证构建产物是否正常运行:
|
184
113
|
|
185
114
|
```bash
|
186
|
-
$ pnpm run
|
115
|
+
$ pnpm run serve
|
187
116
|
|
188
|
-
> modern
|
117
|
+
> modern serve
|
189
118
|
|
190
119
|
Starting the modern server...
|
191
120
|
info App running at:
|
@@ -199,4 +128,6 @@ info App running at:
|
|
199
128
|
|
200
129
|
## 部署
|
201
130
|
|
202
|
-
|
131
|
+
import Deploy from '@site-docs/components/deploy.md'
|
132
|
+
|
133
|
+
<Deploy />
|
@@ -16,28 +16,30 @@ $ pnpm run upgrade
|
|
16
16
|
|
17
17
|
[INFO] [项目类型]: 应用
|
18
18
|
[INFO] [Modern.js 最新版本]: 2.0.0
|
19
|
-
[INFO]
|
19
|
+
[INFO] 已更新 Modern.js 依赖至最新版本!
|
20
20
|
```
|
21
21
|
|
22
|
-
可以看到项目 `package.json`
|
22
|
+
可以看到项目 `package.json` 中的依赖已经更改到最新。
|
23
23
|
|
24
24
|
## 指定版本升级
|
25
25
|
|
26
|
-
Modern.js
|
26
|
+
Modern.js 所有的官方包目前都使用**统一版本号**进行发布。
|
27
27
|
|
28
|
-
|
28
|
+
import ReleaseNote from '@site-docs/components/release-note.md'
|
29
|
+
|
30
|
+
<ReleaseNote />
|
29
31
|
|
30
32
|
:::tip
|
31
|
-
|
33
|
+
当升级时,需要对 Modern.js 官方提供的所有包做统一升级,而不是升级单个依赖。
|
32
34
|
:::
|
33
35
|
|
34
36
|
## 锁定子依赖
|
35
37
|
|
36
38
|
当项目某个子依赖出现问题,而 Modern.js 无法立即更新时,可以使用包管理器锁定子依赖版本。
|
37
39
|
|
38
|
-
###
|
40
|
+
### pnpm
|
39
41
|
|
40
|
-
对于使用
|
42
|
+
对于使用 pnpm 的项目,请在**项目根目录**的 `package.json` 中添加以下配置,然后重新执行 `pnpm install`:
|
41
43
|
|
42
44
|
```json
|
43
45
|
{
|
@@ -51,7 +53,7 @@ Modern.js 所有的官方包目前都使用统一版本号进行发布。
|
|
51
53
|
|
52
54
|
### Yarn
|
53
55
|
|
54
|
-
对于使用 Yarn 的项目,请在**项目根目录**的 `package.json` 中添加以下配置,然后重新执行 `yarn
|
56
|
+
对于使用 Yarn 的项目,请在**项目根目录**的 `package.json` 中添加以下配置,然后重新执行 `yarn install`:
|
55
57
|
|
56
58
|
```json
|
57
59
|
{
|
@@ -63,7 +65,7 @@ Modern.js 所有的官方包目前都使用统一版本号进行发布。
|
|
63
65
|
|
64
66
|
### Npm
|
65
67
|
|
66
|
-
对于使用 Npm 的项目,请在**项目根目录**的 `package.json` 中添加以下配置,然后重新执行 `npm
|
68
|
+
对于使用 Npm 的项目,请在**项目根目录**的 `package.json` 中添加以下配置,然后重新执行 `npm install`:
|
67
69
|
|
68
70
|
```json
|
69
71
|
{
|
File without changes
|
@@ -0,0 +1,29 @@
|
|
1
|
+
---
|
2
|
+
sidebar_position: 1
|
3
|
+
title: 微前端介绍
|
4
|
+
---
|
5
|
+
|
6
|
+
微前端是一种类似于微服务的架构,是一种由独立交付的多个前端应用组成整体的架构风格,将前端应用分解成一些更小、更简单的能够独立开发、测试、部署的应用,而在用户看来仍然是内聚的单个产品。
|
7
|
+
|
8
|
+
它主要解决了两个问题:
|
9
|
+
|
10
|
+
* 随着项目迭代应用越来越庞大,难以维护。
|
11
|
+
* 跨团队或跨部门协作开发项目导致效率低下的问题。
|
12
|
+
|
13
|
+
## 微前端关键词
|
14
|
+
|
15
|
+
在微前端研发模式中,应用会被分成 **主应用**、和 **子应用**。
|
16
|
+
|
17
|
+
- 主应用:微前端项目的基座工程,所有子应用都会由它来加载。
|
18
|
+
- 子应用:独立开发、独立部署的应用,最终会被主应用加载。
|
19
|
+
|
20
|
+
## 功能简介
|
21
|
+
|
22
|
+
* 基于 [Garfish](https://www.garfishjs.org/guide)
|
23
|
+
* 生成器支持微前端应用
|
24
|
+
* 支持 React 组件式引用微前端子应用
|
25
|
+
* 支持 loading
|
26
|
+
* 支持主应用线上、子应用线下调试模式
|
27
|
+
|
28
|
+
可以在 [体验微前端](/docs/guides/topic-detail/micro-frontend/c02-development) 一节学习如何开发微前端主子应用。
|
29
|
+
|
@@ -0,0 +1,191 @@
|
|
1
|
+
---
|
2
|
+
sidebar_position: 2
|
3
|
+
title: 体验微前端
|
4
|
+
---
|
5
|
+
|
6
|
+
通过本章你可以了解到:
|
7
|
+
|
8
|
+
- 如何创建微前端项目的主应用、子应用。
|
9
|
+
- 微前端项目开发的基本流程。
|
10
|
+
|
11
|
+
## 创建应用
|
12
|
+
|
13
|
+
在这次的实践中,我们需要创建三个应用,分别为1个主应用,2个子应用:
|
14
|
+
|
15
|
+
- main 主应用
|
16
|
+
- dashboard 子应用
|
17
|
+
- table 子应用
|
18
|
+
|
19
|
+
### 创建 main 主应用
|
20
|
+
|
21
|
+
通过命令行工具初始化项目:
|
22
|
+
|
23
|
+
```bash
|
24
|
+
mkdir main && cd main
|
25
|
+
npx @modern-js/create
|
26
|
+
```
|
27
|
+
|
28
|
+
import DefaultMWAGenerate from '@site-docs/components/default-mwa-generate.md';
|
29
|
+
|
30
|
+
<DefaultMWAGenerate />
|
31
|
+
|
32
|
+
完成项目创建后我们可以通过 `pnpm run new` 来开启 `微前端` 功能:
|
33
|
+
|
34
|
+
```bash
|
35
|
+
? 请选择你想要的操作 启用可选功能
|
36
|
+
? 启用可选功能 启用「微前端」模式
|
37
|
+
```
|
38
|
+
|
39
|
+
接下来,让我们注册微前端插件并添加开启微前端主应用,并增加子应用列表:
|
40
|
+
|
41
|
+
import EnableMicroFrontend from '@site-docs/components/enable-micro-frontend.md';
|
42
|
+
|
43
|
+
<EnableMicroFrontend />
|
44
|
+
|
45
|
+
import MicroRuntimeConfig from '@site-docs/components/micro-runtime-config.md';
|
46
|
+
|
47
|
+
<MicroRuntimeConfig />
|
48
|
+
|
49
|
+
|
50
|
+
### 创建 dashboard 子应用
|
51
|
+
|
52
|
+
通过命令行工具初始化项目:
|
53
|
+
|
54
|
+
```bash
|
55
|
+
mkdir dashboard && cd dashboard
|
56
|
+
npx @modern-js/create
|
57
|
+
```
|
58
|
+
|
59
|
+
按照如下选择,生成项目:
|
60
|
+
|
61
|
+
<DefaultMWAGenerate/>
|
62
|
+
|
63
|
+
我们执行 `pnpm run new` 来开启 `微前端` 功能:
|
64
|
+
|
65
|
+
```bash
|
66
|
+
? 请选择你想要的操作 启用可选功能
|
67
|
+
? 启用可选功能 启用「微前端」模式
|
68
|
+
```
|
69
|
+
接下来,让我们注册微前端插件并修改 `modern.config.ts`,添加微前端子应用的配置 `deploy.microFrontend`:
|
70
|
+
|
71
|
+
```javascript title="modern.config.ts"
|
72
|
+
import AppToolPlugin, { defineConfig } from '@modern-js/app-tools';
|
73
|
+
import GarfishPlugin from '@modern-js/plugin-garfish';
|
74
|
+
|
75
|
+
export default defineConfig({
|
76
|
+
runtime: {
|
77
|
+
router: true,
|
78
|
+
state: true
|
79
|
+
},
|
80
|
+
deploy: {
|
81
|
+
microFrontend: true
|
82
|
+
},
|
83
|
+
plugins: [AppToolPlugin(), GarfishPlugin()],
|
84
|
+
});
|
85
|
+
```
|
86
|
+
|
87
|
+
### 创建 table 子应用
|
88
|
+
|
89
|
+
通过命令行工具初始化项目:
|
90
|
+
|
91
|
+
```bash
|
92
|
+
mkdir table && cd table
|
93
|
+
npx @modern-js/create
|
94
|
+
```
|
95
|
+
|
96
|
+
按照如下选择,生成项目:
|
97
|
+
|
98
|
+
<DefaultMWAGenerate/>
|
99
|
+
|
100
|
+
我们执行 `pnpm run new` 来开启 `微前端`:
|
101
|
+
|
102
|
+
```bash
|
103
|
+
? 请选择你想要的操作 启用可选功能
|
104
|
+
? 启用可选功能 启用「微前端」模式
|
105
|
+
```
|
106
|
+
|
107
|
+
接下来,让我们注册微前端插件并修改 `modern.config.ts`,添加微前端子应用的配置 `deploy.microFrontend`:
|
108
|
+
|
109
|
+
```javascript title="modern.config.ts"
|
110
|
+
import AppToolPlugin, { defineConfig } from '@modern-js/app-tools';
|
111
|
+
import GarfishPlugin from '@modern-js/plugin-garfish';
|
112
|
+
|
113
|
+
export default defineConfig({
|
114
|
+
runtime: {
|
115
|
+
router: true,
|
116
|
+
state: true
|
117
|
+
},
|
118
|
+
deploy: {
|
119
|
+
microFrontend: true
|
120
|
+
},
|
121
|
+
plugins: [AppToolPlugin(), GarfishPlugin()],
|
122
|
+
});
|
123
|
+
```
|
124
|
+
|
125
|
+
## 添加代码
|
126
|
+
|
127
|
+
### main 主应用
|
128
|
+
|
129
|
+
删除 `src/routers` 目录, 创建 `src/App.tsx`,并添加如下内容:
|
130
|
+
|
131
|
+
```tsx
|
132
|
+
import { Link } from '@modern-js/runtime/router';
|
133
|
+
import { useModuleApps } from '@modern-js/runtime/garfish';
|
134
|
+
|
135
|
+
const App = () => {
|
136
|
+
const { DashBoard, TableList } = useModuleApps();
|
137
|
+
return (
|
138
|
+
<div>
|
139
|
+
<div>
|
140
|
+
<Link to='/dashboard'>Dashboard</Link>
|
141
|
+
<Link to='/table'>Table</Link>
|
142
|
+
</div>
|
143
|
+
<Route path='/dashboard'>
|
144
|
+
<DashBoard />
|
145
|
+
</Route>
|
146
|
+
<Route path='/table'>
|
147
|
+
<TableList />
|
148
|
+
</Route>
|
149
|
+
</div>
|
150
|
+
);
|
151
|
+
};
|
152
|
+
|
153
|
+
export default App;
|
154
|
+
```
|
155
|
+
|
156
|
+
### dashboard 子应用
|
157
|
+
|
158
|
+
删除 `src/routers` 目录, 创建 `src/App.tsx`,并添加如下内容:
|
159
|
+
|
160
|
+
```tsx
|
161
|
+
export default () => <div>Dashboard Page</div>;
|
162
|
+
```
|
163
|
+
|
164
|
+
### table 子应用
|
165
|
+
|
166
|
+
删除 `src/routers` 目录, 创建 `src/App.tsx`,并添加如下内容:
|
167
|
+
|
168
|
+
```tsx
|
169
|
+
export default () => <div>Table Page</div>;
|
170
|
+
```
|
171
|
+
|
172
|
+
## 调试
|
173
|
+
|
174
|
+
按顺序在 `main`、 `dashboard`、 `table` 目录执行 `pnpm run dev` 命令启动应用:
|
175
|
+
|
176
|
+
- main - `http://localhost:8080`
|
177
|
+
- dashboard - `http://localhost:8081`
|
178
|
+
- table - `http://localhost:8082`
|
179
|
+
|
180
|
+
访问主应用地址 `http://localhost:8080`,效果如下:
|
181
|
+
|
182
|
+

|
183
|
+
|
184
|
+
在完成了微前端整体开发流程的体验后,你可以进一步了解如何 [开发主应用](./c03-main-app.md)
|
185
|
+
|
186
|
+
|
187
|
+
## 常见问题
|
188
|
+
|
189
|
+
自查手册: https://www.garfishjs.org/issues/
|
190
|
+
|
191
|
+
|