Skip to content

Commit 1ef03dc

Browse files
authored
feat(dev-server): enable gzip compression, add devServer.compress config (#3723)
* feat(dev-server): enable gzip compression, add devServer.compress config * chore: update * chore: update lock file * chore: use http-compression to replace compression * chore: fix typing
1 parent 807f04a commit 1ef03dc

File tree

9 files changed

+78
-5
lines changed

9 files changed

+78
-5
lines changed

.changeset/lovely-jars-roll.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
'@modern-js/builder-shared': patch
3+
'@modern-js/builder-doc': patch
4+
'@modern-js/server': patch
5+
'@modern-js/types': patch
6+
---
7+
8+
feat(dev-server): enable gzip compression, add devServer.compress config
9+
10+
feat(dev-server): 默认启用 gzip 压缩,新增 devServer.compress 配置项

packages/builder/builder-shared/src/schema/tools.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ const sharedDevServerConfigSchema = z.partialObj({
2323
]),
2424
}),
2525
historyApiFallback: z.union([z.boolean(), z.record(z.unknown())]),
26+
compress: z.boolean(),
2627
hot: z.boolean(),
2728
https: DevServerHttpsOptionsSchema,
2829
liveReload: z.boolean(),

packages/document/builder-doc/docs/en/config/tools/devServer.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,25 @@ const defaultConfig = {
103103

104104
The config of HMR client, which are usually used to set the WebSocket URL of HMR.
105105

106+
#### compress
107+
108+
- **Type:** `boolean`
109+
- **Default:** `true`
110+
111+
Whether to enable gzip compression for served static resources.
112+
113+
If you want to disable the gzip compression, you can set `compress` to `false`:
114+
115+
```ts
116+
export default {
117+
tools: {
118+
devServer: {
119+
compress: false,
120+
},
121+
},
122+
};
123+
```
124+
106125
#### devMiddleware
107126

108127
- **Type:**

packages/document/builder-doc/docs/zh/config/tools/devServer.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,25 @@ const defaultConfig = {
103103

104104
对应 HMR 客户端的配置,通常用于设置 HMR 对应的 WebSocket URL。
105105

106+
#### compress
107+
108+
- **类型:** `boolean`
109+
- **默认值:** `true`
110+
111+
是否对静态资源启用 gzip 压缩。
112+
113+
如果你需要禁用 gzip 压缩,可以将 `compress` 设置为 `false`
114+
115+
```ts
116+
export default {
117+
tools: {
118+
devServer: {
119+
compress: false,
120+
},
121+
},
122+
};
123+
```
124+
106125
#### devMiddleware
107126

108127
- **类型:**

packages/server/server/package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,12 @@
5252
"@modern-js/server-utils": "workspace:*",
5353
"@modern-js/types": "workspace:*",
5454
"@modern-js/utils": "workspace:*",
55+
"@swc/helpers": "0.5.1",
5556
"connect-history-api-fallback": "^2.0.0",
57+
"http-compression": "1.0.6",
5658
"minimatch": "^3.0.4",
5759
"path-to-regexp": "^6.2.0",
58-
"ws": "^8.2.0",
59-
"@swc/helpers": "0.5.1"
60+
"ws": "^8.2.0"
6061
},
6162
"devDependencies": {
6263
"@modern-js/server-core": "workspace:*",

packages/server/server/src/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export const getDefaultDevOptions = (): DevServerOptions => {
1616
devMiddleware: { writeToDisk: true },
1717
watch: true,
1818
hot: true,
19+
compress: true,
1920
liveReload: true,
2021
};
2122
};

packages/server/server/src/server/devServer.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,19 @@ export class ModernDevServer extends ModernServer {
130130
private async applyDefaultMiddlewares(app: Server) {
131131
const { pwd, dev, devMiddleware } = this;
132132

133+
// compression should be the first middleware
134+
if (dev.compress) {
135+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
136+
// @ts-expect-error http-compression does not provide a type definition
137+
const { default: compression } = await import('http-compression');
138+
this.addHandler((ctx, next) => {
139+
compression({
140+
gzip: true,
141+
brotli: false,
142+
})(ctx.req, ctx.res, next);
143+
});
144+
}
145+
133146
this.addHandler((ctx: ModernServerContext, next: NextFunction) => {
134147
// allow hmr request cross-domain, because the user may use global proxy
135148
ctx.res.setHeader('Access-Control-Allow-Origin', '*');

packages/toolkit/types/server/devServer.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ export type DevServerOptions = {
2424
host?: string;
2525
protocol?: string;
2626
};
27+
/** Whether to enable gzip compression */
28+
compress?: boolean;
2729
devMiddleware?: {
2830
writeToDisk?: boolean | ((filename: string) => boolean);
2931
outputFileSystem?: Record<string, any>;

pnpm-lock.yaml

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

0 commit comments

Comments
 (0)