@modern-js/main-doc 2.42.1 → 2.43.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/docs/en/apis/app/runtime/web-server/middleware.mdx +3 -3
  2. package/docs/en/configure/app/server/ssr.mdx +2 -0
  3. package/docs/en/guides/advanced-features/inline-assets.mdx +161 -0
  4. package/docs/en/guides/advanced-features/optimize-bundle.mdx +8 -7
  5. package/docs/en/guides/advanced-features/ssr/_category_.json +8 -0
  6. package/docs/en/guides/advanced-features/ssr/cache.mdx +186 -0
  7. package/docs/en/guides/advanced-features/ssr/index.mdx +22 -0
  8. package/docs/en/guides/advanced-features/ssr/stream.mdx +236 -0
  9. package/docs/en/guides/advanced-features/ssr/usage.mdx +341 -0
  10. package/docs/en/guides/basic-features/alias.mdx +80 -2
  11. package/docs/en/guides/basic-features/css-modules.mdx +228 -0
  12. package/docs/en/guides/basic-features/css.mdx +2 -13
  13. package/docs/en/guides/basic-features/json-files.mdx +106 -0
  14. package/docs/en/guides/basic-features/output-files.mdx +173 -0
  15. package/docs/en/guides/basic-features/static-assets.mdx +165 -0
  16. package/docs/en/guides/basic-features/svg-assets.mdx +155 -0
  17. package/docs/en/guides/basic-features/wasm-assets.mdx +66 -0
  18. package/docs/en/guides/get-started/quick-start.mdx +1 -1
  19. package/docs/en/guides/get-started/tech-stack.mdx +1 -1
  20. package/docs/en/guides/topic-detail/framework-plugin/introduction.mdx +63 -16
  21. package/docs/zh/apis/app/runtime/web-server/middleware.mdx +4 -4
  22. package/docs/zh/configure/app/server/ssr.mdx +2 -0
  23. package/docs/zh/guides/advanced-features/inline-assets.mdx +162 -0
  24. package/docs/zh/guides/advanced-features/optimize-bundle.mdx +8 -7
  25. package/docs/zh/guides/advanced-features/ssr/_category_.json +8 -0
  26. package/docs/zh/guides/advanced-features/ssr/cache.mdx +189 -0
  27. package/docs/zh/guides/advanced-features/ssr/index.mdx +22 -0
  28. package/docs/zh/guides/advanced-features/ssr/stream.mdx +240 -0
  29. package/docs/zh/guides/advanced-features/{ssr.mdx → ssr/usage.mdx} +7 -225
  30. package/docs/zh/guides/basic-features/alias.mdx +80 -2
  31. package/docs/zh/guides/basic-features/css-modules.mdx +229 -0
  32. package/docs/zh/guides/basic-features/css.mdx +2 -13
  33. package/docs/zh/guides/basic-features/data/data-write.mdx +1 -1
  34. package/docs/zh/guides/basic-features/json-files.mdx +106 -0
  35. package/docs/zh/guides/basic-features/output-files.mdx +173 -0
  36. package/docs/zh/guides/basic-features/static-assets.mdx +165 -0
  37. package/docs/zh/guides/basic-features/svg-assets.mdx +157 -0
  38. package/docs/zh/guides/basic-features/wasm-assets.mdx +66 -0
  39. package/docs/zh/guides/get-started/quick-start.mdx +1 -1
  40. package/docs/zh/guides/get-started/tech-stack.mdx +1 -1
  41. package/docs/zh/guides/topic-detail/framework-plugin/introduction.mdx +61 -16
  42. package/package.json +7 -7
@@ -4,9 +4,87 @@ sidebar_position: 4
4
4
 
5
5
  # 路径别名
6
6
 
7
- import Alias from '@modern-js/builder-doc/docs/zh/shared/alias';
7
+ 路径别名(alias)允许开发者为模块定义别名,以便于在代码中更方便的引用它们。当你想要使用一个简短、易于记忆的名称来代替冗长复杂的路径时,这将非常有用。
8
8
 
9
- <Alias />
9
+ 例如,假如你在项目中经常引用 `src/common/request.ts` 模块,你可以为它定义一个别名 `@request`,然后在代码中通过 `import request from '@request'` 来引用它,而不需要每次都写出完整的相对路径。同时,这也允许你将模块移动到不同的位置,而不需要更新代码中的所有 import 语法。
10
+
11
+ 在 Modern.js 中,你有两种方式可以设置路径别名:
12
+
13
+ - 通过 `tsconfig.json` 中的 `paths` 配置。
14
+ - 通过 [source.alias](/configure/app/source/alias) 配置。
15
+
16
+ ## 通过 `tsconfig.json` 的 `paths` 配置
17
+
18
+ 你可以通过 `tsconfig.json` 中的 `paths` 来配置别名,这是我们在 TypeScript 项目中推荐使用的方式,因为它可以解决路径别名的 TS 类型问题。
19
+
20
+ 比如:
21
+
22
+ ```json title="tsconfig.json"
23
+ {
24
+ "compilerOptions": {
25
+ "paths": {
26
+ "@common/*": ["./src/common/*"]
27
+ }
28
+ }
29
+ }
30
+ ```
31
+
32
+ 以上配置完成后,如果你在代码中引用 `@common/Foo.tsx`, 则会映射到 `<project>/src/common/Foo.tsx` 路径上。
33
+
34
+ :::tip
35
+ 你可以阅读 [TypeScript - paths](https://www.typescriptlang.org/tsconfig#paths) 文档来了解更多用法。
36
+ :::
37
+
38
+ ## 通过 `source.alias` 配置
39
+
40
+ Modern.js 提供了 [source.alias](/configure/app/source/alias) 配置项,对应 webpack / Rspack 原生的 [resolve.alias](https://webpack.js.org/configuration/resolve/#resolvealias) 配置,你可以通过对象或者函数的方式来配置这个选项。
41
+
42
+ ### 使用场景
43
+
44
+ 由于 `tsconfig.json` 的 `paths` 配置是写在静态 JSON 文件里的,因此它不具备动态性。
45
+
46
+ 而 `source.alias` 则可以弥补这一不足,你可以通过 JavaScript 代码来动态设置 `source.alias`(比如基于环境变量来设置)。
47
+
48
+ ### 对象用法
49
+
50
+ 你可以通过对象的方式来配置 `source.alias`,其中的相对路径会被自动补全为绝对路径。
51
+
52
+ 比如:
53
+
54
+ ```js
55
+ export default {
56
+ source: {
57
+ alias: {
58
+ '@common': './src/common',
59
+ },
60
+ },
61
+ };
62
+ ```
63
+
64
+ 以上配置完成后,如果你在代码中引用 `@common/Foo.tsx`, 则会映射到 `<project>/src/common/Foo.tsx` 路径上。
65
+
66
+ ### 函数用法
67
+
68
+ 你也可以将 `source.alias` 配置为一个函数,拿到内置的 `alias` 对象,对其进行修改。
69
+
70
+ 比如:
71
+
72
+ ```js
73
+ export default {
74
+ source: {
75
+ alias: alias => {
76
+ alias['@common'] = './src/common';
77
+ return alias;
78
+ },
79
+ },
80
+ };
81
+ ```
82
+
83
+ ### 优先级
84
+
85
+ `tsconfig.json` 的 `paths` 配置的优先级高于 `source.alias`,当一个路径同时匹配到这两者定义的规则时,会优先使用 `tsconfig.json` 的 `paths` 定义的值。
86
+
87
+ 你可以通过 [source.aliasStrategy](/configure/app/source/alias-strategy) 来调整这两个选项的优先级。
10
88
 
11
89
  ## 默认别名
12
90
 
@@ -0,0 +1,229 @@
1
+ ---
2
+ sidebar_position: 14
3
+ ---
4
+
5
+ # 使用 CSS Modules
6
+
7
+ [CSS Modules](https://github.com/css-modules/css-modules) 让我们能以模块化的方式编写 CSS 代码,并且可以在 JavaScript 文件中导入和使用这些样式。使用 CSS Modules 可以自动生成唯一的类名,隔离不同模块之间的样式,避免类名冲突。
8
+
9
+ Builder 默认支持使用 CSS Modules,无需添加额外的配置。我们约定使用 `[name].module.css` 文件名来启用 CSS Modules。
10
+
11
+ 以下样式文件会被视为 CSS Modules:
12
+
13
+ - `*.module.scss`
14
+ - `*.module.less`
15
+ - `*.module.css`
16
+
17
+ ## 示例
18
+
19
+ - 编写样式:
20
+
21
+ ```css
22
+ /* button.module.css */
23
+ .error {
24
+ background: red;
25
+ }
26
+ ```
27
+
28
+ - 使用样式:
29
+
30
+ ```tsx
31
+ // Button.tsx
32
+ import React, { Component } from 'react';
33
+ // 引入样式文件
34
+ import styles from './button.module.css';
35
+
36
+ export default () => {
37
+ return <button className={styles.error}>Error Button</button>;
38
+ };
39
+ ```
40
+
41
+ ## 为所有样式文件启用 CSS Modules
42
+
43
+ 在默认情况下,只有 `*.module.css` 结尾的文件才被视为 CSS Modules 模块。
44
+
45
+ 如果你想将源码目录下的所有 CSS 文件当做 CSS Modules 模块进行处理,可以通过开启 [output.disableCssModuleExtension](/configure/app/output/disable-css-module-extension) 来实现,比如:
46
+
47
+ ```ts
48
+ export default {
49
+ output: {
50
+ disableCssModuleExtension: true,
51
+ },
52
+ };
53
+ ```
54
+
55
+ 设置后,以下两个文件都会被视为 CSS Modules:
56
+
57
+ ```ts
58
+ import styles1 from './foo.module.css';
59
+ import styles2 from './bar.css';
60
+ ```
61
+
62
+ :::tip
63
+ 我们不推荐开启此配置项,因为开启 `disableCssModuleExtension` 后,CSS Modules 文件和普通 CSS 文件无法得到明确的区分,不利于长期维护。
64
+ :::
65
+
66
+ ## 为指定的样式文件启用 CSS Modules
67
+
68
+ 在默认情况下,只有 `*.module.css` 结尾的文件才被视为 CSS Modules 模块。
69
+
70
+ 如果你想只为一些指定的样式文件启用 CSS Modules,可以通过配置 [output.cssModules](/configure/app/output/css-modules) 来实现,比如:
71
+
72
+ ```ts
73
+ export default {
74
+ output: {
75
+ cssModules: {
76
+ auto: resource => {
77
+ return resource.includes('.module.') || resource.includes('shared/');
78
+ },
79
+ },
80
+ },
81
+ };
82
+ ```
83
+
84
+ ## 自定义类名
85
+
86
+ 自定义 CSS Modules 生成的类名也是我们比较常用的功能,你可以使用 [output.cssModuleLocalIdentName](/configure/app/output/css-modules.html#cssmodulesexportlocalsconvention) 来进行配置。
87
+
88
+ ```ts
89
+ export default {
90
+ output: {
91
+ cssModuleLocalIdentName: '[hash:base64:4]',
92
+ },
93
+ };
94
+ ```
95
+
96
+ 如果你需要自定义 CSS Modules 的其他配置,可以通过 [tools.cssLoader](/configure/app/tools/css-loader) 进行设置。
97
+
98
+ ## 添加类型声明
99
+
100
+ 当你在 TypeScript 代码中引用 CSS Modules 时,TypeScript 可能会提示该模块缺少类型定义:
101
+
102
+ ```
103
+ TS2307: Cannot find module './index.module.css' or its corresponding type declarations.
104
+ ```
105
+
106
+ 此时你需要为 CSS Modules 添加类型声明文件,请在项目中创建 `src/global.d.ts` 文件,并添加相应的类型声明:
107
+
108
+ ```ts title="src/global.d.ts"
109
+ declare module '*.module.css' {
110
+ const classes: { readonly [key: string]: string };
111
+ export default classes;
112
+ }
113
+
114
+ declare module '*.module.scss' {
115
+ const classes: { readonly [key: string]: string };
116
+ export default classes;
117
+ }
118
+
119
+ declare module '*.module.sass' {
120
+ const classes: { readonly [key: string]: string };
121
+ export default classes;
122
+ }
123
+
124
+ declare module '*.module.less' {
125
+ const classes: { readonly [key: string]: string };
126
+ export default classes;
127
+ }
128
+
129
+ declare module '*.module.styl' {
130
+ const classes: { readonly [key: string]: string };
131
+ export default classes;
132
+ }
133
+ ```
134
+
135
+ 如果你开启了 `disableCssModuleExtension` 配置值,还需要添加以下类型:
136
+
137
+ ```ts title="src/global.d.ts"
138
+ declare module '*.css' {
139
+ const classes: { readonly [key: string]: string };
140
+ export default classes;
141
+ }
142
+
143
+ declare module '*.scss' {
144
+ const classes: { readonly [key: string]: string };
145
+ export default classes;
146
+ }
147
+
148
+ declare module '*.sass' {
149
+ const classes: { readonly [key: string]: string };
150
+ export default classes;
151
+ }
152
+
153
+ declare module '*.less' {
154
+ const classes: { readonly [key: string]: string };
155
+ export default classes;
156
+ }
157
+
158
+ declare module '*.styl' {
159
+ const classes: { readonly [key: string]: string };
160
+ export default classes;
161
+ }
162
+ ```
163
+
164
+ 添加类型声明后,如果依然存在上述错误提示,请尝试重启当前 IDE,或者调整 `global.d.ts` 所在的目录,使 TypeScript 能够正确识别类型定义。
165
+
166
+ ## 生成准确的类型定义
167
+
168
+ 上述方法虽然可以解决 CSS Modules 在 TypeScript 中的类型问题,但是无法准确地提示出某个 CSS 文件导出了哪些类名。
169
+
170
+ Builder 支持为 CSS Modules 生成准确的类型声明,你只需要开启 [output.enableCssModuleTSDeclaration](/configure/app/output/enable-css-module-tsdeclaration) 配置项,再执行构建命令,Builder 就会为项目中所有的 CSS Modules 文件生成相应的类型声明文件。
171
+
172
+ ```ts
173
+ export default {
174
+ output: {
175
+ enableCssModuleTSDeclaration: true,
176
+ },
177
+ };
178
+ ```
179
+
180
+ ### 示例
181
+
182
+ 例如某个文件夹下面有 `src/index.ts` 和 `src/index.module.scss` 两个文件:
183
+
184
+ ```tsx title="src/index.ts"
185
+ import styles from './index.module.scss';
186
+
187
+ export default () => {
188
+ <div>
189
+ <div className={styles.pageHeader}>Page Header</div>
190
+ </div>;
191
+ };
192
+ ```
193
+
194
+ ```scss
195
+ // index.module.scss
196
+ .page-header {
197
+ color: black;
198
+ }
199
+ ```
200
+
201
+ 执行构建命令后,会自动生成 `src/index.module.scss.d.ts` 类型声明文件:
202
+
203
+ ```ts title="src/index.module.scss.d.ts"
204
+ // This file is automatically generated.
205
+ // Please do not change this file!
206
+ interface CssExports {
207
+ 'page-header': string;
208
+ pageHeader: string;
209
+ }
210
+ export const cssExports: CssExports;
211
+ export default cssExports;
212
+ ```
213
+
214
+ 此时再打开 `src/index.ts` 文件,可以看到 `styles` 对象已经具备了准确的类型。
215
+
216
+ ### 相关配置
217
+
218
+ 在上述例子中,`src/index.module.scss.d.ts` 是编译生成的代码,你可以选择将它们提交到 Git 仓库里,也可以选择在 `.gitignore` 文件中忽略它们:
219
+
220
+ ```bash
221
+ # Ignore auto generated CSS declarations
222
+ *.module.css.d.ts
223
+ *.module.sass.d.ts
224
+ *.module.scss.d.ts
225
+ *.module.less.d.ts
226
+ *.module.styl.d.ts
227
+ ```
228
+
229
+ 此外,如果生成的代码导致了 ESLint 报错,你也可以将上述配置添加到 `.eslintignore` 文件里。
@@ -22,7 +22,7 @@ Modern.js 内置了 [PostCSS](https://postcss.org/) 来转换 CSS 代码。
22
22
 
23
23
  ## 使用 CSS Modules
24
24
 
25
- 请阅读 [使用 CSS Modules](https://modernjs.dev/builder/guide/basic/css-modules.html) 章节来了解 CSS Modules 的完整用法。
25
+ 请阅读 [使用 CSS Modules](/guides/basic-features/css-modules) 章节来了解 CSS Modules 的完整用法。
26
26
 
27
27
  ## 使用 CSS-in-JS
28
28
 
@@ -72,18 +72,7 @@ Modern.js 内部集成了 Babel 的 [babel-plugin-styled-components](https://git
72
72
  ? 请选择功能名称 启用 「Tailwind CSS」 支持
73
73
  ```
74
74
 
75
- 成功开启后,会看到 `package.json` 中新增了依赖:
76
-
77
- ```json title="./package.json"
78
- {
79
- "dependencies": {
80
- "tailwindcss": "^3.0.0"
81
- },
82
- "devDependencies": {
83
- "@modern-js/plugin-tailwindcss": "^2.0.0"
84
- }
85
- }
86
- ```
75
+ 成功开启后,你会看到 `package.json` 中新增了 `tailwindcss` 和 `@modern-js/plugin-tailwindcss` 依赖。
87
76
 
88
77
  2. 在 `modern.config.ts` 中注册 Tailwind 插件:
89
78
 
@@ -84,7 +84,7 @@ Modern.js 中提供 Data Action 主要是为了使 UI 和服务器的状态能
84
84
  ![state manage](https://lf3-static.bytednsdoc.com/obj/eden-cn/ulkl/ljhwZthlaukjlkulzlp/action-state-manage1.png)
85
85
 
86
86
  如果项目中组件共享的数据主要服务端的状态,则无需在项目引入客户端状态管理库,使用 Data Loader 请求数据,通过 [`useRouteLoaderData`](/guides/basic-features/data/data-fetch.md) 在子组件中共享数据,
87
- 通过 Data Actino 修改和同步服务端的状态。
87
+ 通过 Data Action 修改和同步服务端的状态。
88
88
 
89
89
 
90
90
 
@@ -0,0 +1,106 @@
1
+ ---
2
+ sidebar_position: 12
3
+ ---
4
+
5
+ # 引用 JSON 文件
6
+
7
+ Modern.js 支持在代码中引用 JSON 文件,也支持引用 [YAML](https://yaml.org/) 和 [TOML](https://toml.io/en/) 文件并将其转换为 JSON 格式。
8
+
9
+ ## JSON 文件
10
+
11
+ 你可以直接在 JavaScript 文件中引用 JSON 文件。
12
+
13
+ ### 示例
14
+
15
+ ```json title="example.json"
16
+ {
17
+ "name": "foo",
18
+ "items": [1, 2]
19
+ }
20
+ ```
21
+
22
+ ```js title="index.js"
23
+ import example from './example.json';
24
+
25
+ console.log(example.name); // 'foo';
26
+ console.log(example.items); // [1, 2];
27
+ ```
28
+
29
+ ### 具名引用
30
+
31
+ Modern.js 暂不支持通过 named import 来引用 JSON 文件:
32
+
33
+ ```js
34
+ import { name } from './example.json';
35
+ ```
36
+
37
+ ## YAML 文件
38
+
39
+ YAML 是一种数据序列化语言,通常用于编写配置文件。
40
+
41
+ 你可以直接在 JavaScript 中引用 `.yaml` 或 `.yml` 文件,它们会被自动转换为 JSON 格式。
42
+
43
+ ### 示例
44
+
45
+ ```yaml title="example.yaml"
46
+ ---
47
+ hello: world
48
+ foo:
49
+ bar: baz
50
+ ```
51
+
52
+ ```js
53
+ import example from './example.yaml';
54
+
55
+ console.log(example.hello); // 'world';
56
+ console.log(example.foo); // { bar: 'baz' };
57
+ ```
58
+
59
+ ### 添加类型声明
60
+
61
+ 当你在 TypeScript 代码中引用 YAML 文件时,请在项目中创建 `src/global.d.ts` 文件,并添加相应的类型声明:
62
+
63
+ ```ts title="src/global.d.ts"
64
+ declare module '*.yaml' {
65
+ const content: Record<string, any>;
66
+ export default content;
67
+ }
68
+
69
+ declare module '*.yml' {
70
+ const content: Record<string, any>;
71
+ export default content;
72
+ }
73
+ ```
74
+
75
+ ## TOML 文件
76
+
77
+ TOML 是一种语义明显、易于阅读的配置文件格式。
78
+
79
+ 你可以直接在 JavaScript 中引用 `.toml` 文件,它会被自动转换为 JSON 格式。
80
+
81
+ ### 示例
82
+
83
+ ```toml title="example.toml"
84
+ hello = "world"
85
+
86
+ [foo]
87
+ bar = "baz"
88
+ ```
89
+
90
+ ```js
91
+ import example from './example.toml';
92
+
93
+ console.log(example.hello); // 'world';
94
+ console.log(example.foo); // { bar: 'baz' };
95
+ ```
96
+
97
+ ### 添加类型声明
98
+
99
+ 当你在 TypeScript 代码中引用 TOML 文件时,请在项目中创建 `src/global.d.ts` 文件,并添加相应的类型声明:
100
+
101
+ ```ts title="src/global.d.ts"
102
+ declare module '*.toml' {
103
+ const content: Record<string, any>;
104
+ export default content;
105
+ }
106
+ ```
@@ -0,0 +1,173 @@
1
+ ---
2
+ sidebar_position: 10
3
+ ---
4
+
5
+ # 构建产物目录
6
+
7
+ 本章节主要介绍构建产物的目录结构,以及如何控制不同类型产物的输出目录。
8
+
9
+ ## 默认产物目录
10
+
11
+ 下面是最基础的产物目录结构,默认情况下,构建产物会生成在当前项目的 `dist` 目录下。
12
+
13
+ ```bash
14
+ dist
15
+ ├── static
16
+ │ ├── css
17
+ │ │ ├── [name].[hash].css
18
+ │ │ └── [name].[hash].css.map
19
+ │ │
20
+ │ └── js
21
+ │ ├── [name].[hash].js
22
+ │ ├── [name].[hash].js.LICENSE.txt
23
+ │ └── [name].[hash].js.map
24
+
25
+ └── html
26
+ └── [name]
27
+ └── index.html
28
+ ```
29
+
30
+ 最常见的产物是 HTML 文件、JS 文件和 CSS 文件:
31
+
32
+ - HTML 文件:默认输出到 `html` 目录。
33
+ - JS 文件:默认输出到 `static/js` 目录,
34
+ - CSS 文件:默认输出到 `static/css` 目录。
35
+
36
+ 此外,JS 文件和 CSS 文件有时候会生成一些相关产物:
37
+
38
+ - License 文件:包含开源许可证信息,默认输出到 JS 文件的同级目录,并添加 `.LICENSE.txt` 后缀。
39
+ - Source Map 文件:包含保存源代码映射关系,默认输出到 JS 文件和 CSS 文件的同级目录,并添加 `.map` 后缀。
40
+
41
+ 在产物的文件名称中,`[name]` 表示这个文件对应的入口名称,比如 `index`, `main`。`[hash]` 则是基于该文件的内容生成的哈希值。
42
+
43
+ ## 修改产物目录
44
+
45
+ Builder 提供了多个配置项来修改产物目录和产物名称,你可以:
46
+
47
+ - 通过 [output.filename](/configure/app/output/filename) 来修改产物的文件名。
48
+ - 通过 [output.distPath](/configure/app/output/dist-path) 来修改产物的输出路径。
49
+ - 通过 [output.legalComments](/configure/app/output/legal-comments) 来修改 License 文件的生成方式。
50
+ - 通过 [output.disableSourceMap](/configure/app/output/disable-source-map) 来移除 Source Map 文件。
51
+ - 通过 [html.disableHtmlFolder](/configure/app/html/disable-html-folder) 移除 HTML 产物对应的文件夹。
52
+
53
+ ## 静态资源
54
+
55
+ 当你在代码中引用图片、SVG、字体、媒体等类型的静态资源时,它们也会被输出到 `dist/static` 目录下,并根据静态资源类型来自动分配到对应的子目录:
56
+
57
+ ```bash
58
+ dist
59
+ └── static
60
+ ├── image
61
+ │ └── foo.[hash].png
62
+
63
+ ├── svg
64
+ │ └── bar.[hash].svg
65
+
66
+ ├── font
67
+ │ └── baz.[hash].woff2
68
+
69
+ └── media
70
+ └── qux.[hash].mp4
71
+ ```
72
+
73
+ 你可以通过 [output.distPath](/configure/app/output/dist-path) 配置项将这些静态资源统一输入到单个目录下,比如输出到 `assets` 目录:
74
+
75
+ ```ts
76
+ export default {
77
+ output: {
78
+ distPath: {
79
+ image: 'assets',
80
+ svg: 'assets',
81
+ font: 'assets',
82
+ media: 'assets',
83
+ },
84
+ },
85
+ };
86
+ ```
87
+
88
+ 上方的配置会生成以下目录结构:
89
+
90
+ ```bash
91
+ dist
92
+ └── assets
93
+ ├── foo.[hash].png
94
+ ├── bar.[hash].svg
95
+ ├── baz.[hash].woff2
96
+ └── qux.[hash].mp4
97
+ ```
98
+
99
+ ## Node.js 产物目录
100
+
101
+ 当你在 Modern.js 中开启了 SSR 或 SSG 等服务端功能时,Modern.js 会在构建后生成一份 Node.js 产物,并输出到 `bundles` 目录下:
102
+
103
+ ```bash
104
+ dist
105
+ ├── bundles
106
+ │ └── [name].js
107
+ ├── static
108
+ └── html
109
+ ```
110
+
111
+ Node.js 产物通常只包含 JS 文件,不包含 HTML、CSS 等文件。此外,Node 产物的 JS 文件名称也不会自动生成哈希值。
112
+
113
+ 你可以通过 [output.distPath.server](/configure/app/output/dist-path) 配置项来修改 Node 产物的输出路径。
114
+
115
+ 比如,将 Node.js 产物输出到 `server` 目录:
116
+
117
+ ```ts
118
+ export default {
119
+ output: {
120
+ distPath: {
121
+ server: 'server',
122
+ },
123
+ },
124
+ };
125
+ ```
126
+
127
+ ## 扁平化产物目录
128
+
129
+ 有时候你不想产物目录有太多层级,可以将目录设置为空字符串,使生成的产物目录扁平化。
130
+
131
+ 参考下方的例子:
132
+
133
+ ```ts
134
+ export default {
135
+ output: {
136
+ distPath: {
137
+ js: '',
138
+ css: '',
139
+ html: '',
140
+ },
141
+ },
142
+ html: {
143
+ disableHtmlFolder: true,
144
+ },
145
+ };
146
+ ```
147
+
148
+ 上方的配置会生成以下目录结构:
149
+
150
+ ```bash
151
+ dist
152
+ ├── [name].[hash].css
153
+ ├── [name].[hash].css.map
154
+ ├── [name].[hash].js
155
+ ├── [name].[hash].js.map
156
+ └── [name].html
157
+ ```
158
+
159
+ ## 产物不写入磁盘
160
+
161
+ 默认情况下,Builder 会将构建产物写入磁盘,以方便开发者查看产物的内容,或是配置静态资源的代理规则。
162
+
163
+ 在开发环境,你可以选择将构建产物保存在 Dev Server 的内存中,从而减少文件操作产生的开销。
164
+
165
+ 将 `dev.writeToDisk` 配置项设置为 `false` 即可:
166
+
167
+ ```ts
168
+ export default {
169
+ dev: {
170
+ writeToDisk: false,
171
+ },
172
+ };
173
+ ```