Skip to content

Commit d26708f

Browse files
committed
Merge branch 'renovate/modern' of github.com:web-infra-dev/modern.js into renovate/modern
2 parents 329c18c + c893946 commit d26708f

File tree

13 files changed

+98
-20
lines changed

13 files changed

+98
-20
lines changed

.changeset/good-cars-knock.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
'@modern-js/app-tools': patch
3+
'@modern-js/prod-server': patch
4+
---
5+
6+
chore: support serve command use custom serve launcher
7+
chore: 支持 serve 命令使用自定义启动器

packages/cli/flight-server-transform-plugin/Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/document/main-doc/docs/en/apis/app/hooks/src/entry.mdx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22
title: entry.[tj]s
33
sidebar_position: 4
44
---
5-
# entry.[tj]s
5+
6+
# entry.[tj]sx
67

78
:::info
89
Using this file requires enabling [source.enableCustomEntry](/configure/app/source/enable-custom-entry).
910
:::
1011

11-
Normally, the [`routes/`](/apis/app/hooks/src/routes.html) and [`App.[tj]sx`](/apis/app/hooks/src/app) hook files can meet our needs. When we need to add custom behavior before component rendering or take full control of the webpack packaging entry, we can create `entry.[tj]s` file in the src or entry directory. Here are two cases for discussion:
12+
Normally, the [`routes/`](/apis/app/hooks/src/routes.html) and [`App.[tj]sx`](/apis/app/hooks/src/app) hook files can meet our needs. When we need to add custom behavior before component rendering or take full control of the webpack packaging entry, we can create `entry.[tj]s` file in the src or entry directory. Here are two cases for discussion
1213

1314
## Add custom behavior before Render
1415

packages/document/main-doc/docs/en/apis/app/hooks/src/entry.server.mdx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ sidebar_position: 5
55

66
# entry.server.[tj]sx
77

8+
:::info
9+
Using this file requires enabling [source.enableCustomEntry](/configure/app/source/enable-custom-entry).
10+
:::
11+
812
When the project initiates `server.ssr`, Modern.js generates a default Server-Side entry. The sample code is as follows:
913

1014
```tsx title="entry.server.tsx"

packages/document/main-doc/docs/en/configure/app/source/enable-custom-entry.mdx

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ title: enableCustomEntry
77
- **Type:** `boolean`
88
- **Default:** `false`
99

10-
This option is used for custom Modern.js entries.
11-
12-
When this option is enabled, Modern.js will use the `src/entry.[jt]sx` file as the project's entry point. For more details, refer to [Entries](/guides/concept/entries.html).
10+
This option is used for custom Modern.js entries. When this option is enabled, Modern.js will try to use the `src/entry.[jt]sx` file and `src/entry.server.[jt]sx` as the project's entry point.
1311

1412
## Example
1513

@@ -39,3 +37,32 @@ beforeRender().then(() => {
3937
render(<ModernRoot />);
4038
});
4139
```
40+
41+
:::info
42+
For more browser entry details, refer to [Entries](/guides/concept/entries.html).
43+
:::
44+
45+
46+
create `src/entry.server.tsx` file,add custom behavior for rendering responses:
47+
48+
```tsx
49+
import { renderString, createRequestHandler } from '@edenx/runtime/ssr/server';
50+
import type { HandleRequest } from '@edenx/runtime/ssr/server';
51+
52+
const handleRequest: HandleRequest = async (request, ServerRoot, options) => {
53+
// do something before rendering
54+
const body = await renderString(request, <ServerRoot />, options);
55+
56+
const newBody = body + '<div>Byte-Dance</div>';
57+
58+
return new Response(newBody, {
59+
headers: {
60+
'content-type': 'text/html; charset=UTF-8',
61+
'x-custom-header': 'abc',
62+
},
63+
});
64+
};
65+
66+
export default createRequestHandler(handleRequest);
67+
```
68+

packages/document/main-doc/docs/zh/apis/app/hooks/src/entry.mdx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@
22
title: entry.[tj]s
33
sidebar_position: 4
44
---
5-
# entry.[tj]s
65

7-
通常情况下[`routes/`](/apis/app/hooks/src/routes.html)[`App.[tj]sx`](/apis/app/hooks/src/app) 钩子文件已经能满足我们的需求,当我们需要在组件渲染之前添加自定义行为或者完全接管 webpack 打包入口时,可以在 `src` 或者入口目录下放置 `entry.[tj]s`。 下面有分两种情况进行讨论:
6+
# entry.[tj]sx
87

98
:::info
109
使用该文件需要开启 [source.enableCustomEntry](/configure/app/source/enable-custom-entry)
1110
:::
1211

12+
通常情况下[`routes/`](/apis/app/hooks/src/routes.html)[`App.[tj]sx`](/apis/app/hooks/src/app) 钩子文件已经能满足我们的需求,当我们需要在组件渲染之前添加自定义行为或者完全接管 webpack 打包入口时,可以在 `src` 或者入口目录下放置 `entry.[tj]s`。下面分两种情况进行讨论。
13+
1314
## 在组件渲染前添加自定义行为
1415

1516
`src/entry.[tj]s` 中这样实现:

packages/document/main-doc/docs/zh/apis/app/hooks/src/entry.server.mdx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ sidebar_position: 5
55

66
# entry.server.[tj]sx
77

8+
:::info
9+
使用该文件需要开启 [source.enableCustomEntry](/configure/app/source/enable-custom-entry)
10+
:::
11+
812
当项目开启 `server.ssr` 时,Modern.js 生成一个默认的 Server-Side 入口。示例代码如下:
913

1014
```tsx title="entry.server.tsx"
@@ -28,7 +32,7 @@ export default createRequestHandler(handleRequest);
2832

2933
## 添加自定义行为
3034

31-
如果用户需自定义 Server-Side Rendering 入口,可以在 `src/entry.server.ts``src/{entryName}/entry.server.ts` 中自定义 server 入口
35+
如果用户需自定义 Server-Side Rendering 入口,可以在 `src/entry.server.ts``src/{entryName}/entry.server.ts` 中自定义 server 入口
3236

3337
```tsx title="src/entry.server.tsx"
3438
import { renderString, createRequestHandler } from '@edenx/runtime/ssr/server';

packages/document/main-doc/docs/zh/configure/app/source/enable-custom-entry.mdx

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ title: enableCustomEntry
77
- **类型:** `boolean`
88
- **默认值:** `false`
99

10-
该选项用于使用 Modern.js 自定义入口场景。
11-
12-
开启此选项后,Modern.js 将使用 `src/entry.[jt]sx` 文件作为项目的入口, 具体使用姿势可参考[页面入口](/guides/concept/entries.html)
10+
该选项用于使用 Modern.js 自定义入口场景。开启此选项后,Modern.js 将尝试使用 `src/entry.[jt]sx``src/entry.server.[jt]sx` 文件作为项目的入口。
1311

1412
## 示例
1513

@@ -23,7 +21,7 @@ export default defineConfig({
2321
});
2422
```
2523

26-
创建 `src/entry.tsx` 文件:
24+
创建 `src/entry.tsx` 文件,在渲染前执行某些行为
2725

2826
```tsx
2927
import { createRoot } from '@modern-js/runtime/react';
@@ -39,3 +37,31 @@ beforeRender().then(() => {
3937
render(<ModernRoot />);
4038
});
4139
```
40+
41+
:::info
42+
更多浏览器端入口相关内容可参考[页面入口](/guides/concept/entries.html)
43+
:::
44+
45+
创建 `src/entry.server.tsx` 文件,为渲染响应添加自定义行为:
46+
47+
```tsx
48+
import { renderString, createRequestHandler } from '@edenx/runtime/ssr/server';
49+
import type { HandleRequest } from '@edenx/runtime/ssr/server';
50+
51+
const handleRequest: HandleRequest = async (request, ServerRoot, options) => {
52+
// do something before rendering
53+
const body = await renderString(request, <ServerRoot />, options);
54+
55+
const newBody = body + '<div>Byte-Dance</div>';
56+
57+
return new Response(newBody, {
58+
headers: {
59+
'content-type': 'text/html; charset=UTF-8',
60+
'x-custom-header': 'abc',
61+
},
62+
});
63+
};
64+
65+
export default createRequestHandler(handleRequest);
66+
```
67+

packages/runtime/render/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
"@modern-js/types": "workspace:*",
3232
"@swc/helpers": "0.5.13",
3333
"react-server-dom-webpack": "19.0.0",
34-
"rsc-html-stream": "0.0.3"
34+
"rsc-html-stream": "0.0.4"
3535
},
3636
"devDependencies": {
3737
"@modern-js/server-core": "workspace:*",

packages/solutions/app-tools/src/commands/dev.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import { registerCompiler } from '../utils/register';
1717
import { generateRoutes } from '../utils/routes';
1818
import type { DevOptions } from '../utils/types';
1919

20-
export interface ExtraServerOptions {
20+
interface ExtraServerOptions {
2121
applyPlugins?: ApplyPlugins;
2222
}
2323

packages/solutions/app-tools/src/commands/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,8 @@ export const serverCommand = (
9494
.option('--api-only', i18n.t(localeKeys.command.dev.apiOnly))
9595
.option('-c --config <config>', i18n.t(localeKeys.command.shared.config))
9696
.action(async () => {
97-
const { start } = await import('./serve.js');
98-
await start(api);
97+
const { serve } = await import('./serve.js');
98+
await serve(api);
9999
});
100100
};
101101

packages/solutions/app-tools/src/commands/serve.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,14 @@ import type { AppNormalizedConfig, AppTools } from '../types';
1212
import { loadServerPlugins } from '../utils/loadPlugins';
1313
import { printInstructions } from '../utils/printInstructions';
1414

15-
export const start = async (api: CLIPluginAPI<AppTools<'shared'>>) => {
15+
type ExtraServerOptions = {
16+
launcher?: typeof createProdServer;
17+
};
18+
19+
export const serve = async (
20+
api: CLIPluginAPI<AppTools<'shared'>>,
21+
serverOptions?: ExtraServerOptions,
22+
) => {
1623
const appContext = api.getAppContext();
1724
const userConfig = api.getNormalizedConfig();
1825
const hooks = api.getHooks();
@@ -50,7 +57,7 @@ export const start = async (api: CLIPluginAPI<AppTools<'shared'>>) => {
5057

5158
const pluginInstances = await loadServerPlugins(api, appDirectory, metaName);
5259

53-
const app = await createProdServer({
60+
const app = await (serverOptions?.launcher || createProdServer)({
5461
metaName,
5562
pwd: distDirectory,
5663
config: {

packages/solutions/app-tools/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ export { mergeConfig } from '@modern-js/core';
197197
export type { RuntimeUserConfig } from './types/config';
198198

199199
export { dev } from './commands/dev';
200+
export { serve } from './commands/serve';
200201
export type { DevOptions } from './utils/types';
201202
export { generateWatchFiles } from './utils/generateWatchFiles';
202203

0 commit comments

Comments
 (0)