@modern-js/main-doc 2.20.0 → 2.21.0
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/CHANGELOG.md +11 -0
- package/docs/en/apis/app/runtime/router/router.mdx +22 -0
- package/docs/en/configure/app/security/nonce.mdx +13 -0
- package/docs/en/guides/advanced-features/rspack-start.mdx +38 -0
- package/docs/en/guides/basic-features/css.mdx +37 -27
- package/docs/en/guides/basic-features/data-fetch.mdx +56 -69
- package/docs/en/guides/basic-features/routes.mdx +189 -93
- package/docs/en/guides/topic-detail/framework-plugin/hook-list.mdx +22 -4
- package/docs/zh/apis/app/runtime/router/router.mdx +22 -0
- package/docs/zh/configure/app/security/nonce.mdx +13 -0
- package/docs/zh/guides/advanced-features/rspack-start.mdx +37 -0
- package/docs/zh/guides/basic-features/data-fetch.mdx +14 -14
- package/docs/zh/guides/basic-features/routes.mdx +22 -22
- package/docs/zh/guides/topic-detail/framework-plugin/hook-list.mdx +23 -5
- package/package.json +7 -7
@@ -58,3 +58,40 @@ import appTools, { defineConfig } from '@modern-js/app-tools';
|
|
58
58
|
:::tip
|
59
59
|
从 webpack 迁移至 Rspack 时,存在一些构建能力和配置上的差异,详情可参考:[配置差异](https://modernjs.dev/builder/guide/advanced/rspack-start.html#从-webpack-迁移到-rspack)
|
60
60
|
:::
|
61
|
+
|
62
|
+
## Rspack 和 Modern.js 的版本关系
|
63
|
+
|
64
|
+
通常情况下,Modern.js 内会集成 Rspack 的最新版本,通过 `npx modern upgrade` 即可将当前项目中的 Modern.js 相关依赖以及内置的 Rspack 更新至最新版本。
|
65
|
+
|
66
|
+
但 Modern.js 对于 Rspack 的依赖方式为锁版本方式(非自动升级),由于发版周期不同步等原因,可能会出现 Modern.js 内集成的 Rspack 版本落后于 Rspack 最新版本的情况。
|
67
|
+
|
68
|
+
当你执行 dev / build 命令时,Modern.js 会自动打印当前使用的 Rspack 版本:
|
69
|
+
|
70
|
+

|
71
|
+
|
72
|
+
#### 修改内置 Rspack 版本
|
73
|
+
|
74
|
+
可以使用 pnpm / yarn / npm 等包管理工具自带的依赖升级功能来将 Rspack 强制升级到指定版本。
|
75
|
+
|
76
|
+
以 pnpm 为例,可通过 `overrides` 以下依赖更新 Rspack 版本:
|
77
|
+
|
78
|
+
```json title=package.json
|
79
|
+
{
|
80
|
+
"pnpm": {
|
81
|
+
"overrides": {
|
82
|
+
"@rspack/core": "nightly",
|
83
|
+
"@rspack/dev-client": "nightly",
|
84
|
+
"@rspack/dev-middleware": "nightly",
|
85
|
+
"@rspack/plugin-html": "nightly",
|
86
|
+
"@rspack/postcss-loader": "nightly"
|
87
|
+
}
|
88
|
+
}
|
89
|
+
}
|
90
|
+
```
|
91
|
+
|
92
|
+
:::tip Nightly 版本介绍
|
93
|
+
每天,Rspack 会自动构建基于最新代码的 nightly 版本,用于测试和及早发现错误。
|
94
|
+
通常情况下,这些版本是可用的。如果发现问题,我们会及时进行修复。但是,如果 Rspack 有一些 break change,需要 Modern.js 同步修改代码,那么我们建议等待下一个 Modern.js 版本再进行更新。
|
95
|
+
:::
|
96
|
+
|
97
|
+
如果想了解其他包管理工具锁定依赖版本的示例,可以参考:[锁定子依赖](/guides/get-started/upgrade.html#%E9%94%81%E5%AE%9A%E5%AD%90%E4%BE%9D%E8%B5%96)。
|
@@ -14,7 +14,7 @@ Modern.js 中提供了开箱即用的数据获取能力,开发者可以通过
|
|
14
14
|
Modern.js 推荐使用约定式路由做路由的管理,通过 Modern.js 的[约定式(嵌套)路由](/guides/basic-features/routes#约定式路由),每个路由组件(`layout.ts` 或 `page.ts`)可以有一个同名的 `loader` 文件,该 `loader` 文件需要导出一个函数,函数会在组件渲染之前执行,为路由组件提供数据。
|
15
15
|
|
16
16
|
:::info
|
17
|
-
Modern.js v1 支持通过 [useLoader](#useloader
|
17
|
+
Modern.js v1 支持通过 [useLoader](#useloader(旧版)) 获取数据,这已经不是我们推荐的用法,除迁移过程外,不推荐两者混用。
|
18
18
|
|
19
19
|
:::
|
20
20
|
|
@@ -22,7 +22,7 @@ Modern.js v1 支持通过 [useLoader](#useloader旧版) 获取数据,这已经
|
|
22
22
|
|
23
23
|
路由组件如 `layout.ts` 或 `page.ts`,可以定义同名的 `loader` 文件,`loader` 文件中导出一个函数,该函数提供组件所需的数据,然后在路由组件中通过 `useLoaderData` 函数获取数据,如下面示例:
|
24
24
|
|
25
|
-
```
|
25
|
+
```bash
|
26
26
|
.
|
27
27
|
└── routes
|
28
28
|
├── layout.tsx
|
@@ -66,19 +66,19 @@ export default async (): Promise<ProfileData> => {
|
|
66
66
|
在 SSR 环境下,不管是首屏,还是在客户端的导航,`loader` 函数只会在服务端执行,这里可以调用任意的 Node.js API,同时这里使用的任何依赖和代码都不会包含在客户端的 bundle 中。
|
67
67
|
|
68
68
|
:::info
|
69
|
-
在以后的版本中,Modern.js 可能会支持在 CSR 环境下,`loader` 函数也在服务端运行,以提高性能和安全性,所以这里建议尽可能地保证 loader 的纯粹,只做数据获取的场景。
|
69
|
+
在以后的版本中,Modern.js 可能会支持在 CSR 环境下,`loader` 函数也在服务端运行,以提高性能和安全性,所以这里建议尽可能地保证 `loader` 的纯粹,只做数据获取的场景。
|
70
70
|
|
71
71
|
:::
|
72
72
|
|
73
|
-
当在客户端导航时,基于 Modern.js 的[约定式路由](/guides/basic-features/routes),所有的 loader 函数会并行执行(请求),即当访问 `/user/profile` 时,`/user` 和 `/user/profile` 下的 loader 函数都会并行执行(请求),以提高客户端的性能。
|
73
|
+
当在客户端导航时,基于 Modern.js 的[约定式路由](/guides/basic-features/routes),所有的 `loader` 函数会并行执行(请求),即当访问 `/user/profile` 时,`/user` 和 `/user/profile` 下的 loader 函数都会并行执行(请求),以提高客户端的性能。
|
74
74
|
|
75
75
|
### `loader` 函数
|
76
76
|
|
77
77
|
`loader` 函数有两个入参:
|
78
78
|
|
79
|
-
#### `
|
79
|
+
#### `params`
|
80
80
|
|
81
|
-
当路由文件通过 `[]` 时,会作为[动态路由](/guides/basic-features/routes#动态路由),动态路由片段会作为参数传入 loader 函数:
|
81
|
+
当路由文件通过 `[]` 时,会作为[动态路由](/guides/basic-features/routes#动态路由),动态路由片段会作为参数传入 `loader` 函数:
|
82
82
|
|
83
83
|
```tsx
|
84
84
|
// routes/user/[id]/page.loader.ts
|
@@ -149,7 +149,7 @@ async function loader() {
|
|
149
149
|
|
150
150
|
### 错误处理
|
151
151
|
|
152
|
-
在 `loader` 函数中,可以通过 `throw error` 或者 `throw response` 的方式处理错误,当 `loader` 函数中有错误被抛出时,Modern.js 会停止执行当前 loader 中的代码,并将前端 UI 切换到定义的 [`ErrorBoundary`](/guides/basic-features/routes#错误处理) 组件:
|
152
|
+
在 `loader` 函数中,可以通过 `throw error` 或者 `throw response` 的方式处理错误,当 `loader` 函数中有错误被抛出时,Modern.js 会停止执行当前 `loader` 中的代码,并将前端 UI 切换到定义的 [`ErrorBoundary`](/guides/basic-features/routes#错误处理) 组件:
|
153
153
|
|
154
154
|
```tsx
|
155
155
|
// routes/user/profile/page.loader.ts
|
@@ -178,14 +178,14 @@ export default ErrorBoundary;
|
|
178
178
|
|
179
179
|
### 获取上层组件的数据
|
180
180
|
|
181
|
-
很多场景下,子组件需要获取到祖先组件 loader 中的数据,你可以通过 `useRouteLoaderData` 方便地获取到祖先组件的数据:
|
181
|
+
很多场景下,子组件需要获取到祖先组件 `loader` 中的数据,你可以通过 `useRouteLoaderData` 方便地获取到祖先组件的数据:
|
182
182
|
|
183
183
|
```tsx
|
184
184
|
// routes/user/profile/page.tsx
|
185
185
|
import { useRouteLoaderData } from '@modern-js/runtime/router';
|
186
186
|
|
187
187
|
export default function UserLayout() {
|
188
|
-
// 获取 routes/user/layout.loader.ts 中 loader 返回的数据
|
188
|
+
// 获取 routes/user/layout.loader.ts 中 `loader` 返回的数据
|
189
189
|
const data = useRouteLoaderData('user/layout');
|
190
190
|
return (
|
191
191
|
<div>
|
@@ -198,7 +198,7 @@ export default function UserLayout() {
|
|
198
198
|
|
199
199
|
`userRouteLoaderData` 接受一个参数 `routeId`,在使用约定式路由时,Modern.js 会为你自动生成`routeId`,`routeId` 的值是对应组件相对于 `src/routes` 的路径,如上面的例子中,子组件想要获取 `routes/user/layout.tsx` 中 loader 返回的数据,`routeId` 的值就是 `user/layout`。
|
200
200
|
|
201
|
-
|
201
|
+
在多入口(MPA) 场景下,`routeId` 的值需要加上对应入口的名称,入口名称非指定情况下一般是入口的目录名,如以下目录结构:
|
202
202
|
|
203
203
|
```bash
|
204
204
|
.
|
@@ -211,7 +211,7 @@ export default function UserLayout() {
|
|
211
211
|
└── layout.tsx
|
212
212
|
```
|
213
213
|
|
214
|
-
如果想获取 `entry1/routes/layout.tsx` 中 loader 返回的数据,`routeId` 的值就是 `entry1_layout`。
|
214
|
+
如果想获取 `entry1/routes/layout.tsx` 中 `loader` 返回的数据,`routeId` 的值就是 `entry1_layout`。
|
215
215
|
|
216
216
|
### (WIP)Loading UI
|
217
217
|
|
@@ -341,11 +341,11 @@ export default async (): Promise<ProfileData> => {
|
|
341
341
|
|
342
342
|
### 常见问题
|
343
343
|
|
344
|
-
1. loader 和 BFF 函数的关系
|
344
|
+
1. `loader` 和 BFF 函数的关系
|
345
345
|
|
346
|
-
在 CSR
|
346
|
+
在 CSR 项目中,`loader` 在客户端执行,在 `loader` 可以直接调用 BFF 函数进行接口请求。
|
347
347
|
|
348
|
-
在 SSR 项目中,每个 loader 也是一个服务端接口,我们推荐使用 loader 替代 http method 为 `get` 的 BFF 函数,作为接口层,避免多一层转发和执行。
|
348
|
+
在 SSR 项目中,每个 `loader` 也是一个服务端接口,我们推荐使用 `loader` 替代 http method 为 `get` 的 BFF 函数,作为接口层,避免多一层转发和执行。
|
349
349
|
|
350
350
|
|
351
351
|
## useLoader(旧版)
|
@@ -18,7 +18,7 @@ Modern.js 的路由基于 [React Router 6](https://reactrouter.com/en/main),
|
|
18
18
|
|
19
19
|
Modern.js 支持了业界流行的约定式路由模式:**嵌套路由**,使用嵌套路由时,页面的路由 与 UI 结构是相呼应的,我们将会详细介绍这种路由模式。
|
20
20
|
|
21
|
-
```
|
21
|
+
```bash
|
22
22
|
/user/johnny/profile /user/johnny/posts
|
23
23
|
+------------------+ +-----------------+
|
24
24
|
| User | | User |
|
@@ -154,7 +154,7 @@ export default () => {
|
|
154
154
|
|
155
155
|
通过 `[]` 命名的文件目录,生成的路由会作为动态路由。例如以下文件目录:
|
156
156
|
|
157
|
-
```
|
157
|
+
```bash
|
158
158
|
└── routes
|
159
159
|
├── [id]
|
160
160
|
│ └── page.tsx
|
@@ -173,7 +173,7 @@ export default () => {
|
|
173
173
|
|
174
174
|
通过 `[$]` 命名的文件目录,生成的路由会作为动态路由。例如以下文件目录:
|
175
175
|
|
176
|
-
```
|
176
|
+
```bash
|
177
177
|
└── routes
|
178
178
|
├── user
|
179
179
|
│ └── [id$]
|
@@ -199,7 +199,7 @@ export default () => {
|
|
199
199
|
|
200
200
|
例如以下目录结构:
|
201
201
|
|
202
|
-
```
|
202
|
+
```bash
|
203
203
|
└── routes
|
204
204
|
├── $.tsx
|
205
205
|
├── blog
|
@@ -222,7 +222,7 @@ params['*']; // => 'aaa/bbb'
|
|
222
222
|
|
223
223
|
当目录名以 \_\_ 开头时,对应的目录名不会转换为实际的路由路径,例如以下文件目录:
|
224
224
|
|
225
|
-
```
|
225
|
+
```bash
|
226
226
|
.
|
227
227
|
└── routes
|
228
228
|
├── __auth
|
@@ -245,7 +245,7 @@ Modern.js 会生成 `/login` 和 `/sign` 两条路由,`__auth/layout.tsx` 组
|
|
245
245
|
|
246
246
|
因此 Modern.js 支持了通过 `.` 来分割路由片段,代替文件目录。例如,当需要 `/user/profile/2022/edit` 时,可以直接创建如下文件:
|
247
247
|
|
248
|
-
```
|
248
|
+
```bash
|
249
249
|
└── routes
|
250
250
|
├── user.profile.[id].edit
|
251
251
|
│ └── page.tsx
|
@@ -281,7 +281,7 @@ Modern.js 会生成 `/login` 和 `/sign` 两条路由,`__auth/layout.tsx` 组
|
|
281
281
|
|
282
282
|
当定义 `loading.tsx` 时,就相当于以下布局:
|
283
283
|
|
284
|
-
```tsx title
|
284
|
+
```tsx title=当路由为"/"时
|
285
285
|
<Layout>
|
286
286
|
<Suspense fallback={<Loading />}>
|
287
287
|
<Page />
|
@@ -289,7 +289,7 @@ Modern.js 会生成 `/login` 和 `/sign` 两条路由,`__auth/layout.tsx` 组
|
|
289
289
|
</Layout>
|
290
290
|
```
|
291
291
|
|
292
|
-
```tsx title
|
292
|
+
```tsx title=当路由为"/blog"时
|
293
293
|
<Layout>
|
294
294
|
<Suspense fallback={<Loading />}>
|
295
295
|
<BlogPage />
|
@@ -297,7 +297,7 @@ Modern.js 会生成 `/login` 和 `/sign` 两条路由,`__auth/layout.tsx` 组
|
|
297
297
|
</Layout>
|
298
298
|
```
|
299
299
|
|
300
|
-
```tsx title
|
300
|
+
```tsx title=当路由为"/blog/123"时
|
301
301
|
<Layout>
|
302
302
|
<Suspense fallback={<Loading />}>
|
303
303
|
<BlogIdPage />
|
@@ -306,8 +306,8 @@ Modern.js 会生成 `/login` 和 `/sign` 两条路由,`__auth/layout.tsx` 组
|
|
306
306
|
```
|
307
307
|
|
308
308
|
:::info
|
309
|
-
当目录的
|
310
|
-
Modern.js 建议必须有根
|
309
|
+
当目录的 Layout 组件不存在时,该目录下的 Loading 组件也不会生效。
|
310
|
+
Modern.js 建议必须有根 Layout 和根 Loading。
|
311
311
|
|
312
312
|
:::
|
313
313
|
|
@@ -317,7 +317,7 @@ Modern.js 建议必须有根 layout 和根 loading。
|
|
317
317
|
|
318
318
|
### 路由重定向
|
319
319
|
|
320
|
-
可以通过创建 [`
|
320
|
+
可以通过创建 [`Data Loader`](/guides/basic-features/data-fetch) 文件做路由的重定向,如有文件 `routes/user/page.tsx`,想对这个文件对应的路由做重定向,可以创建 `routes/user/page.loader.ts` 文件:
|
321
321
|
|
322
322
|
```ts title="routes/user/page.loader.ts"
|
323
323
|
import { redirect } from '@modern-js/runtime/router';
|
@@ -335,13 +335,13 @@ export default () => {
|
|
335
335
|
|
336
336
|
`routes/` 下每一层目录中,开发者同样可以定义一个 `error.tsx` 文件,默认导出一个 `<ErrorBoundary>` 组件。
|
337
337
|
|
338
|
-
当有路由目录下存在该组件时,组件渲染出错会被 ErrorBoundary 组件捕获。当目录未定义 `layout.tsx` 文件时,`<ErrorBoundary>` 组件不会生效。
|
338
|
+
当有路由目录下存在该组件时,组件渲染出错会被 `ErrorBoundary` 组件捕获。当目录未定义 `layout.tsx` 文件时,`<ErrorBoundary>` 组件不会生效。
|
339
339
|
|
340
340
|
`<ErrorBoundary>` 可以返回出错时的 UI 视图,当前层级未声明 `<ErrorBoundary>` 组件时,错误会向上冒泡到更上层的组件,直到被捕获或抛出错误。同时,当组件出错时,只会影响捕获到该错误的路由组件及子组件,其他组件的状态和视图不受影响,可以继续交互。
|
341
341
|
|
342
342
|
{/* Todo API 路由 */}
|
343
343
|
|
344
|
-
在 `<ErrorBoundary>` 组件内,可以使用 [useRouteError](/apis/app/runtime/router/router#
|
344
|
+
在 `<ErrorBoundary>` 组件内,可以使用 [useRouteError](/apis/app/runtime/router/router#userouteerror) 获取的错误的具体信息:
|
345
345
|
|
346
346
|
```tsx
|
347
347
|
import { useRouteError } from '@modern-js/runtime/router';
|
@@ -359,7 +359,7 @@ export default ErrorBoundary;
|
|
359
359
|
|
360
360
|
### 运行时配置
|
361
361
|
|
362
|
-
在每个根 `Layout` 组件中(`routes/layout.ts`)
|
362
|
+
在每个根 `Layout` 组件中(`routes/layout.ts`),可以动态地定义运行时配置:
|
363
363
|
|
364
364
|
```tsx title="src/routes/layout.tsx"
|
365
365
|
// 定义运行时配置
|
@@ -447,29 +447,29 @@ export const init = (context: RuntimeContext) => {
|
|
447
447
|
### 预加载
|
448
448
|
|
449
449
|
在约定式路由下, Modern.js 会根据路由,自动地对路由进行分片,当用户访问具体的路由时,会自动加载对应的分片,这样可以有效地减少首屏加载的时间。但这也带来了一个问题,当用户访问一个路由时,如果该路由对应的分片还未加载完成,就会出现白屏的情况。
|
450
|
-
这种情况下你可以通过定义 `
|
450
|
+
这种情况下你可以通过定义 `Loading` 组件,在静态资源加载完成前,展示一个自定义的 `Loading` 组件。
|
451
451
|
|
452
452
|
为了进一步提升用户体验,减少 loading 的时间,Modern.js 支持在 Link 组件上定义 `prefetch` 属性,可以提前对静态资源和数据进行加载, `prefetch` 属性有三个可选值:
|
453
453
|
|
454
|
-
```
|
454
|
+
```tsx
|
455
455
|
<Link prefetch="intent" to="page">
|
456
456
|
```
|
457
457
|
|
458
458
|
:::info
|
459
459
|
- 该功能目前仅在 Webpack 项目中支持,Rspack 项目暂不支持。
|
460
|
-
- 对数据的预加载目前只会预加载 SSR 项目中 [
|
460
|
+
- 对数据的预加载目前只会预加载 SSR 项目中 [Data Loader](/guides/basic-features/data-fetch) 中返回的数据。
|
461
461
|
|
462
462
|
:::
|
463
463
|
|
464
464
|
- `none`, 默认值,不会做 prefetch,没有任何额外的行为。
|
465
|
-
- `intent`,这是我们推荐大多数场景下使用的值,当你把鼠标放在 Link 上时,会自动开始加载对应的分片和
|
466
|
-
- `render`,当 Link 组件渲染时,就会加载对应的分片和
|
465
|
+
- `intent`,这是我们推荐大多数场景下使用的值,当你把鼠标放在 Link 上时,会自动开始加载对应的分片和 Data Loader 中定义的数据,当鼠标移开时,会自动取消加载。在我们的测试中,即使是快速点击,也能减少大约 200ms 的加载时间。
|
466
|
+
- `render`,当 Link 组件渲染时,就会加载对应的分片和 Data Loader 中定义的数据。
|
467
467
|
|
468
468
|
#### 常见问题
|
469
469
|
|
470
470
|
1. 使用 `render` 和不根据路由做静态资源分片的区别?
|
471
471
|
|
472
|
-
- 使用 `render` 可以指定哪些路由在首屏时,进行加载,同时你可以通过对渲染的控制,仅当 Link 组件进入到可视区域时,才对 Link 组件进行渲染。
|
472
|
+
- 使用 `render` 可以指定哪些路由在首屏时,进行加载,同时你可以通过对渲染的控制,仅当 `Link` 组件进入到可视区域时,才对 `Link` 组件进行渲染。
|
473
473
|
- 使用 `render`,仅在空闲时对静态资源进行加载,不会与首屏静态资源抢占网络。
|
474
474
|
- 在 SSR 场景下,也会对数据进行预取。
|
475
475
|
|
@@ -484,7 +484,7 @@ import Practice from '@site-docs/components/routes-practice'
|
|
484
484
|
|
485
485
|
## 自控式路由
|
486
486
|
|
487
|
-
以 `src/App.tsx` 为约定的入口,Modern.js
|
487
|
+
以 `src/App.tsx` 为约定的入口,Modern.js 不会对路由做额外的操作,开发者可以自行使用 [React Router 6](https://reactrouter.com/en/main) 的 API 进行开发,例如:
|
488
488
|
|
489
489
|
```ts title="src/App.tsx"
|
490
490
|
import { BrowserRouter, Route, Routes } from '@modern-js/runtime/router';
|
@@ -2,6 +2,7 @@
|
|
2
2
|
title: Hook 列表
|
3
3
|
sidebar_position: 8
|
4
4
|
---
|
5
|
+
|
5
6
|
# Hook 列表
|
6
7
|
|
7
8
|
在 Modern.js 中暴露了三类插件:CLI、Runtime、Server。下面列举下各类中的 Hook:
|
@@ -166,7 +167,6 @@ export default (): CliPlugin => ({
|
|
166
167
|
});
|
167
168
|
```
|
168
169
|
|
169
|
-
|
170
170
|
### `commands`
|
171
171
|
|
172
172
|
- 功能:为 command 添加新的命令
|
@@ -260,9 +260,9 @@ export default (): CliPlugin => ({
|
|
260
260
|
### `afterDev`
|
261
261
|
|
262
262
|
- 功能:运行 dev 主流程的之后的任务
|
263
|
-
-
|
263
|
+
- 执行阶段:运行 `dev` 命令时,每一次编译完成后执行
|
264
264
|
- Hook 模型:AsyncWorkflow
|
265
|
-
- 类型:`AsyncWorkflow<
|
265
|
+
- 类型:`AsyncWorkflow<{ isFirstCompile: boolean }, unknown>`
|
266
266
|
- 使用示例:
|
267
267
|
|
268
268
|
```ts
|
@@ -279,6 +279,24 @@ export default (): CliPlugin => ({
|
|
279
279
|
});
|
280
280
|
```
|
281
281
|
|
282
|
+
`afterDev` 会在每一次编译完成后执行,你可以通过 `isFirstCompile` 参数来判断是否为首次编译:
|
283
|
+
|
284
|
+
```ts
|
285
|
+
import type { CliPlugin } from '@modern-js/core';
|
286
|
+
|
287
|
+
export default (): CliPlugin => ({
|
288
|
+
setup(api) {
|
289
|
+
return {
|
290
|
+
afterDev: ({ isFirstCompile }) => {
|
291
|
+
if (isFirstCompile) {
|
292
|
+
// do something
|
293
|
+
}
|
294
|
+
},
|
295
|
+
};
|
296
|
+
},
|
297
|
+
});
|
298
|
+
```
|
299
|
+
|
282
300
|
### `beforeCreateCompiler`
|
283
301
|
|
284
302
|
- 功能:在中间件函数中可以拿到创建 Webpack Compiler 的 Webpack 配置
|
@@ -438,7 +456,7 @@ import type { CliPlugin } from '@modern-js/core';
|
|
438
456
|
export default (): CliPlugin => ({
|
439
457
|
setup(api) {
|
440
458
|
return {
|
441
|
-
|
459
|
+
modifyEntryExport({ entrypoint, exportStatement }) {
|
442
460
|
return {
|
443
461
|
entrypoint,
|
444
462
|
exportStatement: [`export const foo = 'test'`, exportStatement].join(
|
@@ -778,7 +796,7 @@ export default (): Plugin => ({
|
|
778
796
|
);
|
779
797
|
};
|
780
798
|
return next({
|
781
|
-
App: hoistNonReactStatics(AppWrapper, App)
|
799
|
+
App: hoistNonReactStatics(AppWrapper, App),
|
782
800
|
});
|
783
801
|
},
|
784
802
|
};
|
package/package.json
CHANGED
@@ -15,27 +15,27 @@
|
|
15
15
|
"modern",
|
16
16
|
"modern.js"
|
17
17
|
],
|
18
|
-
"version": "2.
|
18
|
+
"version": "2.21.0",
|
19
19
|
"publishConfig": {
|
20
20
|
"registry": "https://registry.npmjs.org/",
|
21
21
|
"access": "public"
|
22
22
|
},
|
23
23
|
"peerDependencies": {
|
24
|
-
"@modern-js/builder-doc": "^2.
|
24
|
+
"@modern-js/builder-doc": "^2.21.0"
|
25
25
|
},
|
26
26
|
"devDependencies": {
|
27
27
|
"classnames": "^2",
|
28
28
|
"clsx": "^1.2.1",
|
29
29
|
"react": "^18",
|
30
30
|
"react-dom": "^18",
|
31
|
-
"ts-node": "^10",
|
32
|
-
"typescript": "^
|
31
|
+
"ts-node": "^10.9.1",
|
32
|
+
"typescript": "^5",
|
33
33
|
"fs-extra": "^10",
|
34
34
|
"@types/node": "^16",
|
35
35
|
"@types/fs-extra": "^9",
|
36
|
-
"@modern-js/builder-doc": "2.
|
37
|
-
"@modern-js/doc-tools": "2.
|
38
|
-
"@modern-js/doc-plugin-auto-sidebar": "2.
|
36
|
+
"@modern-js/builder-doc": "2.21.0",
|
37
|
+
"@modern-js/doc-tools": "2.21.0",
|
38
|
+
"@modern-js/doc-plugin-auto-sidebar": "2.21.0"
|
39
39
|
},
|
40
40
|
"scripts": {
|
41
41
|
"dev": "modern dev",
|