@modern-js/main-doc 2.10.0 → 2.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/docs/en/apis/app/hooks/src/server.mdx +1 -28
  3. package/docs/en/configure/app/source/config-dir.mdx +2 -2
  4. package/docs/en/configure/app/source/design-system.mdx +2 -2
  5. package/docs/en/configure/app/source/disable-default-entries.mdx +12 -12
  6. package/docs/en/configure/app/source/disable-entry-dirs.mdx +3 -4
  7. package/docs/en/configure/app/source/enable-async-entry.mdx +2 -2
  8. package/docs/en/configure/app/source/entries-dir.mdx +10 -10
  9. package/docs/en/configure/app/source/entries.mdx +83 -26
  10. package/docs/en/configure/app/source/plugin-import.mdx +13 -0
  11. package/docs/en/configure/app/source/transform-import.mdx +13 -0
  12. package/docs/en/configure/app/tools/esbuild.mdx +9 -4
  13. package/docs/en/configure/app/tools/jest.mdx +2 -3
  14. package/docs/en/configure/app/tools/swc.mdx +6 -2
  15. package/docs/en/guides/advanced-features/ssr.mdx +4 -3
  16. package/docs/en/guides/advanced-features/web-server.mdx +1 -1
  17. package/docs/en/guides/concept/entries.mdx +130 -39
  18. package/docs/en/guides/topic-detail/framework-plugin/hook-list.mdx +7 -3
  19. package/docs/en/guides/topic-detail/model/typescript-best-practice.mdx +4 -4
  20. package/docs/en/tutorials/first-app/c06-model.mdx +15 -12
  21. package/docs/en/tutorials/first-app/c07-container.mdx +22 -19
  22. package/docs/zh/apis/app/hooks/src/server.mdx +1 -28
  23. package/docs/zh/configure/app/source/config-dir.mdx +2 -2
  24. package/docs/zh/configure/app/source/design-system.mdx +3 -3
  25. package/docs/zh/configure/app/source/disable-default-entries.mdx +11 -10
  26. package/docs/zh/configure/app/source/disable-entry-dirs.mdx +2 -3
  27. package/docs/zh/configure/app/source/enable-async-entry.mdx +3 -3
  28. package/docs/zh/configure/app/source/entries-dir.mdx +10 -11
  29. package/docs/zh/configure/app/source/entries.mdx +84 -23
  30. package/docs/zh/configure/app/source/plugin-import.mdx +13 -0
  31. package/docs/zh/configure/app/source/transform-import.mdx +13 -0
  32. package/docs/zh/configure/app/tools/esbuild.mdx +9 -5
  33. package/docs/zh/configure/app/tools/jest.mdx +2 -3
  34. package/docs/zh/configure/app/tools/swc.mdx +6 -2
  35. package/docs/zh/guides/advanced-features/ssr.mdx +6 -3
  36. package/docs/zh/guides/advanced-features/web-server.mdx +10 -5
  37. package/docs/zh/guides/concept/entries.mdx +36 -35
  38. package/docs/zh/guides/topic-detail/framework-plugin/hook-list.mdx +6 -2
  39. package/docs/zh/tutorials/first-app/c06-model.mdx +14 -12
  40. package/docs/zh/tutorials/first-app/c07-container.mdx +22 -19
  41. package/modern.config.ts +1 -1
  42. package/package.json +5 -5
@@ -4,26 +4,29 @@ sidebar_position: 1
4
4
 
5
5
  # Entries
6
6
 
7
- Entries are Modern.js default file convention, and each entry in the project is a separate page, corresponding to a server level route.
7
+ Through this chapter, you can learn about the entry convention in Modern.js and how to customize the entry.
8
8
 
9
- Many configurations, such as HTML templates, Meta information, whether SSR is enabled, SSG, server level routing rules are divided by the entry dimension.
9
+ ## What is an Entry
10
+
11
+ **Entry is the starting module of a page.**
12
+
13
+ In the Modern.js project, each entry corresponds to an independent page, and also corresponds to a server route. By default, Modern.js will automatically determine the entry of the page based on the directory convention, and also supports customizing the entry through configuration items.
14
+
15
+ Many configuration items provided by Modern.js are divided by entry, such as page title, HTML template, page Meta information, whether to enable SSR/SSG, server-side routing rules, etc.
10
16
 
11
17
  ## Single Entry and Multiple Entries
12
18
 
13
- Modern.js initialization project is a single entry, the project structure is as follows:
19
+ The project initialized by Modern.js is single-entry (SPA), and the project structure is as follows:
14
20
 
15
21
  ```
16
22
  .
17
23
  ├── src
18
- │ ├── modern-app-env.d.ts
19
24
  │ └── routes
20
25
  │ ├── index.css
21
26
  │ ├── layout.tsx
22
27
  │ └── page.tsx
23
28
  ├── package.json
24
29
  ├── modern.config.ts
25
- ├── pnpm-lock.yaml
26
- ├── README.md
27
30
  └── tsconfig.json
28
31
  ```
29
32
 
@@ -35,17 +38,16 @@ Modern.js can easily switch from single entry to multiple entry. You can execute
35
38
  ? Entry name: new-entry
36
39
  ```
37
40
 
38
- After execution, the `src/` directory will become the following structure:
41
+ After execution, Modern.js will automatically generate a new entry directory, and you can see that the `src/` directory has the following structure:
39
42
 
40
- ```
43
+ ```bash
41
44
  .
42
- ├── modern-app-env.d.ts
43
- ├── myapp
45
+ ├── myapp # Original entry
44
46
  │ └── routes
45
47
  │ ├── index.css
46
48
  │ ├── layout.tsx
47
49
  │ └── page.tsx
48
- └── new-entry
50
+ └── new-entry # New entry
49
51
  └── routes
50
52
  ├── index.css
51
53
  ├── layout.tsx
@@ -56,65 +58,154 @@ The original code was moved to the directory with the same name as the `name` in
56
58
 
57
59
  After executing `pnpm run dev`, you can see that a `/new-entry` route has been added, and the migrated code route has not changed.
58
60
 
59
- :::note
60
- Modern.js will use the directory with the same name as the `name` in the `package.json` as the main entry, the default route is `/`, and the default route for other entries is `/{entryName}`.
61
+ :::tip
62
+ Modern.js will use the entry with the same name as the `name` field in the package.json file as the main entry, the route of the main entry is `/`, and the route of other entries is `/{entryName}`.
63
+
64
+ For example, when `name` in package.json is `myapp`, `src/myapp` will be used as the main entry of the project.
61
65
 
62
66
  :::
63
67
 
64
- ## Entry conditions
68
+ ## Entry Type
65
69
 
66
- By default, the Modern.js entry currently scans the file under `src/`, identifies the entry, and generates the corresponding server level route.
70
+ Different entry types have different compile and run-time behaviors. When creating a project in Modern.js, developers can manually choose to create a project in **framework mode** or **build mode**. After the creation is complete, you can see that the project template files for different modes are different.
71
+
72
+ By default, Modern.js will scan the files under `src/` before starting the project, identify the entry, and generate the corresponding server-side route.
67
73
 
68
74
  :::tip
69
- You can change the entry directory to another directory by [source.entriesDir](/configure/app/source/entries-dir).
75
+ You can change the entry directory to another directory through [source.entriesDir](/configure/app/source/entries-dir).
70
76
 
71
77
  :::
72
78
 
73
- Not all first-level directories under `src/` will become project entrances. The directory where the entry is located must meet one of the following four conditions:
79
+ Not all first-level directories under `src/` will become project entries, and the directory where the entry is located must meet one of the following four conditions:
74
80
 
75
- 1. Directory with `routes/`
76
- 2. Has the `App.[jt]sx?` file
77
- 3. With `index.[jt]sx?` file
78
- 4. With `pages/` directory (compatible Modern.js 1.0)
81
+ 1. Have a `routes/` directory
82
+ 2. Has `App.[jt]sx?` file
83
+ 3. Has `index.[jt]sx?` file
84
+ 4. Has a `pages/` directory (Modern.js 1.0 compatible)
79
85
 
80
- When the `src/` directory satisfies the entry feature, the Modern.js considers the current project to be a single entry application.
86
+ When the `src/` directory meets the entry characteristics, Modern.js will consider the current project as a single-entry application.
81
87
 
82
88
  :::tip
83
- Single entry The default entry name is `main`.
89
+ In single-entry applications, the default entry is named `main`.
84
90
 
85
91
  :::
86
92
 
87
- When the project is not a single-entry application, Modern.js further look at the first-level directory under `src/`.
93
+ When the project is not a single-entry application, Modern.js will further check the first-level directory under `src/`.
94
+
95
+ ### Framework Mode Entry
88
96
 
89
- ## Difference between entries
97
+ Framework mode refers to the need to use the capabilities of the Modern.js framework, such as Router, SSR, integrated calls, etc. Under this kind of entry agreement, the entry defined by the developer is not the real Webpack compilation entry. Modern.js will generate an encapsulated entry when it starts, and the real entry can be found in `node_modules/.modern/{entryName}/index.js`.
90
98
 
91
- Entries to different conventions have different behaviors.
99
+ #### Conventional Routing
92
100
 
93
- ### routes
101
+ If there is a `routes/` directory in the entry, Modern.js will scan the files under `routes/` at startup, and automatically generate client-side routes (react-router) based on file conventions.
94
102
 
95
- If the entry is the `routes/` convention, Modern.js will scan the files under `routes` at startup, and automatically generate the client route based on the file convention(react-router).
103
+ For details, please refer to [routing](/guides/basic-features/routes).
96
104
 
97
- For details, please refer to [Routing](/guides/basic-features/routes).
105
+ #### Custom Routing
98
106
 
99
- ### App
107
+ If there is an `App.[jt]sx?` file in the entry, the developer can freely set the client route in this file, or not set the client route.
100
108
 
101
- If the entry is the `App.[jt]sx?` convention, the developer can freely set the client route in this file, or not set the client route.
109
+ For details, please refer to [routing](/guides/basic-features/routes).
102
110
 
103
- For details, please refer to [Routing](/guides/basic-features/routes).
111
+ #### Custom App
104
112
 
105
- ### Index
113
+ If there is an `index.[jt]sx` file in the entry, and when the file exports functions by default, Modern.js will still generate the code wrapped by createApp according to the runtime settings. In the rendering process, the component wrapped by createApp is passed as a parameter to the function exported by the index file, so that developers can customize the component to be mounted on the DOM node, or add custom behavior before mounting. For example:
106
114
 
107
- Typically, the above two modes are sufficient, but when developers need to take over the React mount logic themselves, or take over the Webpack entry entirely, the `index.[jt]sx?`convention can be used.
115
+ ```tsx
116
+ import ReactDOM from 'react-dom/client';
117
+ import { bootstrap } from '@modern-js/runtime';
108
118
 
109
- If the entry is the `index.[jt]sx?` convention, the Modern.js determines the build behavior based on whether the file has a default component export.
119
+ export default (App: React.ComponentType) => {
120
+ // do something before bootstrap...
121
+ bootstrap(App, 'root', undefined, ReactDOM);
122
+ };
123
+ ```
124
+
125
+ :::warning
126
+ Since the bootstrap function needs to be compatible with React17 and React18, you need to manually pass in ReactDOM parameters when calling the bootstrap function.
127
+
128
+ :::
129
+
130
+ The content of the file generated by Modern.js is as follows:
110
131
 
111
- For details, please refer to [customized App](/guides/concept/entries#自定义-app).
132
+ ```js
133
+ import React from 'react';
134
+ import ReactDOM from 'react-dom/client';
135
+ import customBootstrap from '@_edenx_src/index.tsx';
136
+ import App from '@_edenx_src/App';
137
+ import { router, state } from '@edenx/runtime/plugins';
112
138
 
113
- ## configuration
139
+ const IS_BROWSER = typeof window !== 'undefined' && window.name !== 'nodejs';
140
+ const MOUNT_ID = 'root';
114
141
 
115
- In Modern.js, you can manually configure the entry in `modern.config.[jt]s`, in addition to using the file convention to generate the entry.
142
+ let AppWrapper = null;
143
+
144
+ function render() {
145
+ AppWrapper = createApp({
146
+ // plugin parameters for runtime...
147
+ })(App);
148
+ if (IS_BROWSER) {
149
+ customBootstrap(AppWrapper);
150
+ }
151
+ return AppWrapper;
152
+ }
153
+
154
+ AppWrapper = render();
155
+
156
+ export default AppWrapper;
157
+ ```
158
+
159
+ ### Build Mode Entry
160
+
161
+ Build mode refers to the ability not to use any Modern.js runtime, and the developer defines the entry of the project Webpack completely by himself.
162
+
163
+ If `index.[jt]sx` exists in the entry and there is no default export function, then this file is the real Webpack entry file. This is similar to [Create React App](https://github.com/facebook/create-react-app), you need to mount components to DOM nodes, add hot update code, etc. For example:
164
+
165
+ ```js title=src/index.jsx
166
+ import React from 'react';
167
+ import ReactDOM from 'react-dom';
168
+ import App from './App';
169
+
170
+ ReactDOM.render(<App />, document.getElementById('root'));
171
+ ```
172
+
173
+ Modern.js **not recommended** to use this method, this method loses some capabilities of the framework, such as the `runtime` configuration in the **`modern.config.js` file will no longer take effect**. But this method will be very useful when the project is migrated from other frameworks to Modern.js, such as CRA, or webpack that is manually built by yourself.
174
+
175
+ ## Custom Entry
176
+
177
+ Most existing projects are not built according to the directory convention of Modern.js. If you want to change to the directory structure agreed by Modern.js, there will be a certain migration cost.
178
+
179
+ In this case, instead of generating the entry using file conventions, you can manually configure the entry in `modern.config.[jt]s`.
180
+
181
+ ```ts title="modern.config.ts"
182
+ export default defineConfig({
183
+ source: {
184
+ entries: {
185
+ // Specify a new entry named entry_customize
186
+ entry_customize: './src/home/test/index.ts',
187
+ },
188
+ // Disable default ingress scanning
189
+ disableDefaultEntries: true,
190
+ },
191
+ });
192
+ ```
193
+
194
+ ### Disable Default Entries
195
+
196
+ When using a custom entry, part of the project structure may happen to hit the directory convention of Modern.js, but in fact this part of the directory is not the real entry.
197
+
198
+ Modern.js provides `disableDefaultEntries` config to disable default entry scanning rules. When you need to customize the entry, you generally need to use `disableDefaultEntries` with `entries`. In this way, some existing projects can be quickly migrated without modifying the directory structure.
199
+
200
+ ```ts title="modern.config.ts"
201
+ export default defineConfig({
202
+ source: {
203
+ disableDefaultEntries: true,
204
+ },
205
+ });
206
+ ```
116
207
 
117
208
  :::tip
118
- Details can be found in [source.entries](/configure/app/source/entries).
209
+ For detailed usage, please refer to [source.entries](/configure/app/source/entries) and [source.disableDefaultEntries](/configure/app/source/disable-default-entries).
119
210
 
120
211
  :::
@@ -191,8 +191,8 @@ foo
191
191
 
192
192
  - Functionality: Reset some file states before exiting the process.
193
193
  - Execution phase: Before the process exits.
194
- - Hook model: AsyncWorkflow
195
- - Type: `AsyncWorkflow<void, void>`
194
+ - Hook model: Workflow
195
+ - Type: `Workflow<void, void>`
196
196
  - Example usage:
197
197
 
198
198
  ```ts
@@ -209,6 +209,10 @@ export default (): CliPlugin => ({
209
209
  });
210
210
  ```
211
211
 
212
+ :::tip
213
+ Since the callback function when exiting the process in Node.js is synchronous, the type of `beforeExit` Hook is `Workflow` and cannot perform asynchronous operations.
214
+ :::
215
+
212
216
  ### `beforeDev`
213
217
 
214
218
  - Functionality: Tasks before running the main dev process.
@@ -442,7 +446,7 @@ export default (): CliPlugin => ({
442
446
  modifyEntryRuntimePlugins({ entrypoint, plugins }) {
443
447
  const name = 'customPlugin';
444
448
  const options = {
445
- /** 可序列化的内容 */
449
+ /** serializable content */
446
450
  };
447
451
 
448
452
  return {
@@ -47,7 +47,7 @@ export const bar = model<State>('bar').define({
47
47
  data: '',
48
48
  },
49
49
  computed: {
50
- // fooState 指定类型
50
+ // specify the type for fooState
51
51
  withFoo: [foo, (state, fooState: FooState) => state.data + fooState.data],
52
52
  },
53
53
  });
@@ -62,11 +62,11 @@ Reduck provides a set of utility types for getting Model type information:
62
62
 
63
63
  ```ts
64
64
  export const foo = model<State2>('foo').define({
65
- // 省略
65
+ // skip some codes
66
66
  });
67
67
 
68
- // 获取 foo State 类型
68
+ // get the State type of foo
69
69
  let fooActions: GetModelActions<typeof foo>;
70
- // 获取 foo Actions 类型
70
+ // get the Actions type of foo
71
71
  let fooState: GetModelState<typeof foo>;
72
72
  ```
@@ -195,18 +195,10 @@ const Item = ({
195
195
  export default Item;
196
196
  ```
197
197
 
198
- Next, we modify `src/routes/page.tsx` to pass more parameters to the `<Item>` component:
198
+ Next, we add `src/routes.page.loader` and modify `src/routes/page.tsx` to pass more parameters to the `<Item>` component:
199
199
 
200
- ```tsx
201
- import { Helmet } from '@modern-js/runtime/head';
202
- import { useModel } from '@modern-js/runtime/model';
203
- import { useLoaderData } from '@modern-js/runtime/router';
204
- import { List } from 'antd';
205
- import { name, internet } from 'faker';
206
- import Item from '../components/Item';
207
- import contacts from '../models/contacts';
208
-
209
- type LoaderData = {
200
+ ```tsx title="src/routes/page.loader.ts"
201
+ export type LoaderData = {
210
202
  code: number;
211
203
  data: {
212
204
  name: string;
@@ -215,7 +207,7 @@ type LoaderData = {
215
207
  }[];
216
208
  };
217
209
 
218
- export const loader = async (): Promise<LoaderData> => {
210
+ export default async (): Promise<LoaderData> => {
219
211
  const data = new Array(20).fill(0).map(() => {
220
212
  const firstName = name.firstName();
221
213
  return {
@@ -231,6 +223,17 @@ export const loader = async (): Promise<LoaderData> => {
231
223
  data,
232
224
  };
233
225
  };
226
+ ```
227
+
228
+ ```tsx title="src/routes/page.tsx"
229
+ import { Helmet } from '@modern-js/runtime/head';
230
+ import { useModel } from '@modern-js/runtime/model';
231
+ import { useLoaderData } from '@modern-js/runtime/router';
232
+ import { List } from 'antd';
233
+ import { name, internet } from 'faker';
234
+ import Item from '../components/Item';
235
+ import contacts from '../models/contacts';
236
+ import type { LoaderData } from './page.loader';
234
237
 
235
238
  function Index() {
236
239
  const { data } = useLoaderData() as LoaderData;
@@ -15,24 +15,8 @@ Because the two pages need to share the same set of state (point of contact tabu
15
15
 
16
16
  Modern.js support obtaining data through Data Loader in `layout.tsx`, we first move the data acquisition part of the code to `src/routes/layout.tsx`:
17
17
 
18
- ```tsx
19
- import { name, internet } from 'faker';
20
- import {
21
- Outlet,
22
- useLoaderData,
23
- useLocation,
24
- useNavigate,
25
- } from '@modern-js/runtime/router';
26
- import { useState } from 'react';
27
- import { Radio, RadioChangeEvent } from 'antd';
28
- import { useModel } from '@modern-js/runtime/model';
29
- import contacts from '../models/contacts';
30
- import 'tailwindcss/base.css';
31
- import 'tailwindcss/components.css';
32
- import 'tailwindcss/utilities.css';
33
- import '../styles/utils.css';
34
-
35
- type LoaderData = {
18
+ ```ts title="src/routes/layout.loader.ts"
19
+ export type LoaderData = {
36
20
  code: number;
37
21
  data: {
38
22
  name: string;
@@ -41,7 +25,7 @@ type LoaderData = {
41
25
  }[];
42
26
  };
43
27
 
44
- export const loader = async (): Promise<LoaderData> => {
28
+ export default async (): Promise<LoaderData> => {
45
29
  const data = new Array(20).fill(0).map(() => {
46
30
  const firstName = name.firstName();
47
31
  return {
@@ -56,6 +40,25 @@ export const loader = async (): Promise<LoaderData> => {
56
40
  data,
57
41
  };
58
42
  };
43
+ ```
44
+
45
+ ```tsx title="src/routes/layout.tsx"
46
+ import { name, internet } from 'faker';
47
+ import {
48
+ Outlet,
49
+ useLoaderData,
50
+ useLocation,
51
+ useNavigate,
52
+ } from '@modern-js/runtime/router';
53
+ import { useState } from 'react';
54
+ import { Radio, RadioChangeEvent } from 'antd';
55
+ import { useModel } from '@modern-js/runtime/model';
56
+ import contacts from '../models/contacts';
57
+ import 'tailwindcss/base.css';
58
+ import 'tailwindcss/components.css';
59
+ import 'tailwindcss/utilities.css';
60
+ import '../styles/utils.css';
61
+ import type { LoaderData } from './layout.loader';
59
62
 
60
63
  export default function Layout() {
61
64
  const { data } = useLoaderData() as LoaderData;
@@ -4,31 +4,4 @@ sidebar_position: 8
4
4
  ---
5
5
  # *.[server|node].[tj]sx
6
6
 
7
- 应用项目中使用,用于放置服务端代码,一般有以下两个作用:
8
-
9
- 1. 当 `*.tsx` 和 `*.[server|node].tsx` 共存时,SSR 在服务端执行渲染时,会优先使用 `*.[server|node].tsx` 文件,而不是 `*.tsx` 文件。
10
-
11
- 2. 在使用 [data loader](/guides/basic-features/data-fetch) 时,需要将服务端的依赖从该文件中做重导出
12
-
13
- ```tsx
14
- // routes/user/avatar.tsx
15
- import { useLoaderData } from '@modern-js/runtime/router';
16
- import { readFile } from './utils.server';
17
-
18
- type ProfileData = {
19
- /* some type declarations */
20
- };
21
-
22
- export const loader = async (): ProfileData => {
23
- const profile = await readFile('profile.json');
24
- return profile;
25
- };
26
-
27
- export default function UserPage() {
28
- const profileData = useLoaderData() as ProfileData;
29
- return <div>{profileData}</div>;
30
- }
31
-
32
- // routes/user/utils.server.ts
33
- export * from 'fs-extra';
34
- ```
7
+ 应用项目中使用,用于放置服务端代码,当 `*.tsx` 和 `*.[server|node].tsx` 共存时,SSR 在服务端执行渲染时,会优先使用 `*.[server|node].tsx` 文件,而不是 `*.tsx` 文件。
@@ -1,8 +1,8 @@
1
1
  ---
2
- title: source.configDir
3
2
  sidebar_label: configDir
4
3
  ---
5
- # configDir
4
+
5
+ # source.configDir
6
6
 
7
7
  - **类型:** `string`
8
8
  - **默认值:** `./config`
@@ -1,11 +1,11 @@
1
1
  ---
2
- title: source.designSystem
3
2
  sidebar_label: designSystem
4
3
  ---
5
- # designSystem
4
+
5
+ # source.designSystem
6
6
 
7
7
  - **类型:** `Object`
8
- - **默认值:**见下方配置详情。
8
+ - **默认值:** 见下方配置详情。
9
9
 
10
10
  :::caution 注意
11
11
  需要先通过 `pnpm run new` 启用 Tailwind CSS 功能。
@@ -1,22 +1,16 @@
1
1
  ---
2
- title: source.disableDefaultEntries
3
2
  sidebar_label: disableDefaultEntries
4
3
  ---
5
- # disableDefaultEntries
4
+
5
+ # source.disableDefaultEntries
6
6
 
7
7
  - **类型:** `boolean`
8
8
  - **默认值:** `false`
9
9
 
10
- 关闭根据项目目录结构自动识别应用构建入口的功能,默认情况下,Modern.js 会根据项目目录结构得到对应构建入口。
10
+ 用于关闭基于目录结构来自动识别页面入口的功能。
11
11
 
12
12
  :::info
13
- 默认情况下,Modern.js 会根据项目目录结构得到对应入口信息。具体可参考[入口](/guides/concept/entries)。
14
- 配置关闭改机制后,需要使用 [`source.entries`](/configure/app/source/entries) 配置自定义入口。
15
-
16
- :::
17
-
18
- :::warning 警告
19
- 推荐按照 Modern.js 提供的目录规范组织代码可以更好使用框架的功能,避免一些冗余的配置。
13
+ 默认情况下,Modern.js 会基于目录约定来自动确定页面的入口,具体可参考[入口](/guides/concept/entries)。
20
14
 
21
15
  :::
22
16
 
@@ -29,3 +23,10 @@ export default defineConfig({
29
23
  },
30
24
  });
31
25
  ```
26
+
27
+ 关闭默认行为后,你需要使用 [`source.entries`](/configure/app/source/entries) 配置自定义的入口。
28
+
29
+ :::warning
30
+ 我们推荐使用 Modern.js 提供的目录规范来组织代码,从而更好地使用框架功能,避免一些冗余的配置。
31
+
32
+ :::
@@ -1,9 +1,8 @@
1
1
  ---
2
- title: source.disableEntryDirs
3
-
4
2
  sidebar_label: disableEntryDirs
5
3
  ---
6
- # disableEntryDirs
4
+
5
+ # source.disableEntryDirs
7
6
 
8
7
  - **类型:** `string[]`
9
8
  - **默认值:** `[]`
@@ -1,13 +1,13 @@
1
1
  ---
2
- title: source.enableAsyncEntry
3
2
  sidebar_label: enableAsyncEntry
4
3
  ---
5
- # enableAsyncEntry
4
+
5
+ # source.enableAsyncEntry
6
6
 
7
7
  - **类型:** `boolean`
8
8
  - **默认值:** `false`
9
9
 
10
- 该选项用于 webpack 模块联邦 (Module Federation)场景。
10
+ 该选项用于 webpack 模块联邦(Module Federation)场景。
11
11
 
12
12
  开启此选项后,Modern.js 会通过 Dynamic Import 来包裹自动生成的入口文件(asynchronous boundary),使页面代码可以消费模块联邦生成的远程模块。
13
13
 
@@ -1,14 +1,13 @@
1
1
  ---
2
- title: source.entriesDir
3
-
4
2
  sidebar_label: entriesDir
5
3
  ---
6
- # entriesDir
4
+
5
+ # source.entriesDir
7
6
 
8
7
  - **类型:** `string`
9
8
  - **默认值:** `./src`
10
9
 
11
- 默认会根据 `src` 目录识别应用入口,可通过该选项自定义应用入口的识别目录。
10
+ Modern.js 默认会扫描 `src` 目录来识别页面入口,你可以通过该选项自定义页面入口的识别目录。
12
11
 
13
12
  例如,当配置与目录结构如下时:
14
13
 
@@ -25,16 +24,16 @@ export default defineConfig({
25
24
  └── src
26
25
  └── pages
27
26
  ├── a
28
- │ └── App.jsx
27
+ │ └── App.tsx
29
28
  └── b
30
- └── App.jsx
29
+ └── App.tsx
31
30
  ```
32
31
 
33
- Modern.js 会根据 `./src/pages` 目录结构生成构建入口 `a` 和入口 `b`,结果如下:
32
+ Modern.js 会扫描 `./src/pages` 目录,自动生成构建入口 `a` 和入口 `b`,结果如下:
34
33
 
35
34
  ```js
36
- {
37
- a: './src/pages/a/App.jsx',
38
- b: './src/pages/b/App.jsx'
39
- }
35
+ const entry = {
36
+ a: './src/pages/a/App.tsx',
37
+ b: './src/pages/b/App.tsx',
38
+ };
40
39
  ```