@modern-js/main-doc 2.70.7 → 2.71.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.
@@ -16,8 +16,9 @@ import {
16
16
  renderString,
17
17
  createRequestHandler,
18
18
  } from '@modern-js/runtime/ssr/server';
19
+ import type { HandleRequest } from '@modern-js/runtime/ssr/server';
19
20
 
20
- const handleRequest = async (request, ServerRoot, options) => {
21
+ const handleRequest: HandleRequest = async (request, ServerRoot, options) => {
21
22
  const body = await renderString(request, <ServerRoot />, options);
22
23
 
23
24
  return new Response(body, {
@@ -13,8 +13,9 @@ import {
13
13
  renderStreaming,
14
14
  createRequestHandler,
15
15
  } from '@modern-js/runtime/ssr/server';
16
+ import type { HandleRequest } from '@modern-js/runtime/ssr/server';
16
17
 
17
- const handleRequest = async (request, ServerRoot, options) => {
18
+ const handleRequest: HandleRequest = async (request, ServerRoot, options) => {
18
19
  const stream = await renderStreaming(request, <ServerRoot />, options);
19
20
 
20
21
  return new Response(stream, {
@@ -44,8 +45,9 @@ import {
44
45
  renderStreaming,
45
46
  createRequestHandler,
46
47
  } from '@modern-js/runtime/ssr/server';
48
+ import type { HandleRequest } from '@modern-js/runtime/ssr/server';
47
49
 
48
- const handleRequest = async (request, ServerRoot, options) => {
50
+ const handleRequest: HandleRequest = async (request, ServerRoot, options) => {
49
51
  // do something before render
50
52
  const stream = await renderStreaming(request, <ServerRoot />, options);
51
53
 
@@ -13,8 +13,9 @@ import {
13
13
  renderString,
14
14
  createRequestHandler,
15
15
  } from '@modern-js/runtime/ssr/server';
16
+ import type { HandleRequest } from '@modern-js/runtime/ssr/server';
16
17
 
17
- const handleRequest = async (request, ServerRoot, options) => {
18
+ const handleRequest: HandleRequest = async (request, ServerRoot, options) => {
18
19
  const body = await renderString(request, <ServerRoot />, options);
19
20
 
20
21
  return new Response(body, {
@@ -44,8 +45,9 @@ import {
44
45
  renderString,
45
46
  createRequestHandler,
46
47
  } from '@modern-js/runtime/ssr/server';
48
+ import type { HandleRequest } from '@modern-js/runtime/ssr/server';
47
49
 
48
- const handleRequest = async (request, ServerRoot, options) => {
50
+ const handleRequest: HandleRequest = async (request, ServerRoot, options) => {
49
51
  // do something before render
50
52
  const body = await renderString(request, <ServerRoot />, options);
51
53
 
@@ -13,8 +13,9 @@ import {
13
13
  renderString,
14
14
  createRequestHandler,
15
15
  } from '@modern-js/runtime/ssr/server';
16
+ import type { HandleRequest } from '@modern-js/runtime/ssr/server';
16
17
 
17
- const handleRequest = async (request, ServerRoot, options) => {
18
+ const handleRequest: HandleRequest = async (request, ServerRoot, options) => {
18
19
  const body = await renderString(request, <ServerRoot />, options);
19
20
 
20
21
  return new Response(body, {
@@ -0,0 +1,30 @@
1
+ ---
2
+ title: enableAsyncPreEntry
3
+ ---
4
+
5
+ # source.enableAsyncPreEntry
6
+
7
+ - **Type:** `boolean`
8
+ - **Default:** `false`
9
+
10
+ When enabled, Modern.js will inject the modules configured in `source.preEntry` to the top of the auto-generated entry file (`index.jsx`) in order.
11
+
12
+ This option only takes effect when `source.enableAsyncEntry` is enabled. If async entry is not enabled, this behavior will be skipped and the original builder-side `source.preEntry` injection remains unchanged.
13
+
14
+ This option is mainly designed to work with `source.enableAsyncEntry`: when async entry is enabled, the final build entry becomes `bootstrap.jsx`, and the builder-side `source.preEntry` may not be injected into the real entry code. With `source.enableAsyncPreEntry` enabled, `preEntry` will be injected into `index.jsx` (the real entry code), so it also works in async entry scenarios.
15
+
16
+ Meanwhile, when both `source.enableAsyncEntry` and `source.enableAsyncPreEntry` are enabled, Modern.js will not pass `source.preEntry` into builder config to avoid duplicate injection or injection into an unexpected entry.
17
+
18
+ ## Example
19
+
20
+ ```ts title="modern.config.ts"
21
+ import { defineConfig } from '@modern-js/app-tools';
22
+
23
+ export default defineConfig({
24
+ source: {
25
+ enableAsyncEntry: true,
26
+ enableAsyncPreEntry: true,
27
+ preEntry: ['./src/pre-a.ts', './src/pre-b.ts'],
28
+ },
29
+ });
30
+ ```
@@ -16,8 +16,9 @@ import {
16
16
  renderString,
17
17
  createRequestHandler,
18
18
  } from '@modern-js/runtime/ssr/server';
19
+ import type { HandleRequest } from '@modern-js/runtime/ssr/server';
19
20
 
20
- const handleRequest = async (request, ServerRoot, options) => {
21
+ const handleRequest: HandleRequest = async (request, ServerRoot, options) => {
21
22
  const body = await renderString(request, <ServerRoot />, options);
22
23
 
23
24
  return new Response(body, {
@@ -13,8 +13,9 @@ import {
13
13
  renderStreaming,
14
14
  createRequestHandler,
15
15
  } from '@modern-js/runtime/ssr/server';
16
+ import type { HandleRequest } from '@modern-js/runtime/ssr/server';
16
17
 
17
- const handleRequest = async (request, ServerRoot, options) => {
18
+ const handleRequest: HandleRequest = async (request, ServerRoot, options) => {
18
19
  const stream = await renderStreaming(request, <ServerRoot />, options);
19
20
 
20
21
  return new Response(stream, {
@@ -44,8 +45,9 @@ import {
44
45
  renderStreaming,
45
46
  createRequestHandler,
46
47
  } from '@modern-js/runtime/ssr/server';
48
+ import type { HandleRequest } from '@modern-js/runtime/ssr/server';
47
49
 
48
- const handleRequest = async (request, ServerRoot, options) => {
50
+ const handleRequest: HandleRequest = async (request, ServerRoot, options) => {
49
51
  // do something before render
50
52
  const stream = await renderStreaming(request, <ServerRoot />, options);
51
53
 
@@ -13,8 +13,9 @@ import {
13
13
  renderString,
14
14
  createRequestHandler,
15
15
  } from '@modern-js/runtime/ssr/server';
16
+ import type { HandleRequest } from '@modern-js/runtime/ssr/server';
16
17
 
17
- const handleRequest = async (request, ServerRoot, options) => {
18
+ const handleRequest: HandleRequest = async (request, ServerRoot, options) => {
18
19
  const body = await renderString(request, <ServerRoot />, options);
19
20
 
20
21
  return new Response(body, {
@@ -44,8 +45,9 @@ import {
44
45
  renderString,
45
46
  createRequestHandler,
46
47
  } from '@modern-js/runtime/ssr/server';
48
+ import type { HandleRequest } from '@modern-js/runtime/ssr/server';
47
49
 
48
- const handleRequest = async (request, ServerRoot, options) => {
50
+ const handleRequest: HandleRequest = async (request, ServerRoot, options) => {
49
51
  // do something before render
50
52
  const body = await renderString(request, <ServerRoot />, options);
51
53
 
@@ -13,8 +13,9 @@ import {
13
13
  renderString,
14
14
  createRequestHandler,
15
15
  } from '@modern-js/runtime/ssr/server';
16
+ import type { HandleRequest } from '@modern-js/runtime/ssr/server';
16
17
 
17
- const handleRequest = async (request, ServerRoot, options) => {
18
+ const handleRequest: HandleRequest = async (request, ServerRoot, options) => {
18
19
  const body = await renderString(request, <ServerRoot />, options);
19
20
 
20
21
  return new Response(body, {
@@ -0,0 +1,77 @@
1
+ ---
2
+ title: enableAsyncPreEntry
3
+ ---
4
+
5
+ # source.enableAsyncPreEntry
6
+
7
+ - **类型:** `boolean`
8
+ - **默认值:** `false`
9
+
10
+ 开启后,Modern.js 会在自动生成的入口文件(`index.jsx`)最上方依次插入 `source.preEntry` 中配置的模块 import。
11
+
12
+ 该配置仅在 `source.enableAsyncEntry` 开启时生效;如果未开启异步入口,则不会启用该行为(并保持 `source.preEntry` 原有的构建器注入逻辑不受影响)。
13
+
14
+ 该配置主要用于配合 `source.enableAsyncEntry` 使用:当启用异步入口时,最终的构建 entry 会变为 `bootstrap.jsx`,这会导致构建器侧的 `source.preEntry` 不一定能注入到真正的入口代码中。开启 `source.enableAsyncPreEntry` 后,`preEntry` 会注入到 `index.jsx`(真正的入口代码)顶部,从而保证在异步入口场景下也能生效。
15
+
16
+ 同时,当 `source.enableAsyncPreEntry` 开启时,Modern.js 不会将 `source.preEntry` 传递给构建器配置,避免重复注入或注入到不期望的 entry 中。
17
+
18
+ ## 示例
19
+
20
+ ```ts title="modern.config.ts"
21
+ import { defineConfig } from '@modern-js/app-tools';
22
+
23
+ export default defineConfig({
24
+ source: {
25
+ enableAsyncEntry: true,
26
+ enableAsyncPreEntry: true,
27
+ preEntry: ['./src/pre-a.ts', './src/pre-b.ts'],
28
+ },
29
+ });
30
+ ```
31
+
32
+ ## 编译效果
33
+
34
+ 在开启 `source.enableAsyncEntry` 后,Modern.js 会为每个入口生成一个异步边界文件 `bootstrap.jsx`,并由它去动态加载真正的入口代码 `index.jsx`。
35
+
36
+ 当同时开启 `source.enableAsyncPreEntry` 时,Modern.js 会把 `source.preEntry` 以 `import` 的形式注入到 **`index.jsx` 的最顶部**(而不是注入到 `bootstrap.jsx`),保证异步入口场景下 `preEntry` 一定会在入口代码之前执行。
37
+
38
+ ### 生成文件结构
39
+
40
+ 以单入口 `main` 为例,生成的文件结构大致如下(位于 `node_modules/.modern-js/main/`):
41
+
42
+ ```bash
43
+ node_modules
44
+ └─ .modern-js
45
+ └─ main
46
+ ├─ bootstrap.jsx # 最终用于构建的 entry(异步边界)
47
+ ├─ index.jsx # 真正的入口代码(会被注入 preEntry import)
48
+ ├─ register.js
49
+ ├─ runtime-register.js
50
+ └─ runtime-global-context.js
51
+ ```
52
+
53
+ ### bootstrap.jsx
54
+
55
+ `bootstrap.jsx` 的核心逻辑是通过 dynamic import 加载 `index.jsx`:
56
+
57
+ ```js title="node_modules/.modern-js/main/bootstrap.jsx"
58
+ import(/* webpackChunkName: "async-main" */ './index');
59
+ ```
60
+
61
+ ### index.jsx(会注入 preEntry)
62
+
63
+ 开启 `source.enableAsyncPreEntry` 后,`index.jsx` 文件的最上方会被注入 `source.preEntry` 对应的 import,随后才是 Modern.js 生成的入口逻辑,例如:
64
+
65
+ ```js title="node_modules/.modern-js/main/index.jsx"
66
+ import '@_modern_js_src/pre-a.ts';
67
+ import '@_modern_js_src/pre-b.ts';
68
+
69
+ import '@modern-js/runtime/registry/main';
70
+ // ...后续为 Modern.js 自动生成的入口逻辑
71
+ ```
72
+
73
+ 其中 `@_modern_js_src` 是 Modern.js 内部用于指向项目 `src` 目录的别名(实际值会随项目 metaName 等信息变化)。
74
+
75
+ ### 与 builder 的关系
76
+
77
+ 当 `source.enableAsyncEntry` 与 `source.enableAsyncPreEntry` 同时开启时,Modern.js **不会再把 `source.preEntry` 传递给构建器配置**,避免构建器重复注入或注入到不期望的 entry 中。
package/package.json CHANGED
@@ -15,17 +15,17 @@
15
15
  "modern",
16
16
  "modern.js"
17
17
  ],
18
- "version": "2.70.7",
18
+ "version": "2.71.0",
19
19
  "publishConfig": {
20
20
  "registry": "https://registry.npmjs.org/",
21
21
  "access": "public"
22
22
  },
23
23
  "dependencies": {
24
24
  "mermaid": "^11.4.1",
25
- "@modern-js/sandpack-react": "2.70.7"
25
+ "@modern-js/sandpack-react": "2.71.0"
26
26
  },
27
27
  "devDependencies": {
28
- "@rsbuild/plugin-sass": "1.5.0",
28
+ "@rsbuild/plugin-sass": "1.5.2",
29
29
  "@shikijs/transformers": "^3.4.2",
30
30
  "@rspress/shared": "2.0.0-beta.16",
31
31
  "@rspress/plugin-llms": "2.0.0-beta.16",