Skip to content

Commit bb90e35

Browse files
authored
feat(core): faster JS minimizer - siteConfig.future.experimental_faster.swcJsMinimizer (facebook#10441)
1 parent aa65f39 commit bb90e35

19 files changed

Lines changed: 201 additions & 35 deletions

File tree

packages/docusaurus-faster/src/index.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77

88
import type {RuleSetRule} from 'webpack';
9+
import type {JsMinifyOptions} from '@swc/core';
910

1011
export function getSwcJsLoaderFactory({
1112
isServer,
@@ -33,3 +34,24 @@ export function getSwcJsLoaderFactory({
3334
},
3435
};
3536
}
37+
38+
// Note: these options are similar to what we use in core
39+
// They should rather be kept in sync for now to avoid any unexpected behavior
40+
// The goal of faster minifier is not to fine-tune options but only to be faster
41+
// See core minification.ts
42+
export function getSwcJsMinifierOptions(): JsMinifyOptions {
43+
return {
44+
ecma: 2020,
45+
compress: {
46+
ecma: 5,
47+
},
48+
module: true,
49+
mangle: true,
50+
safari10: true,
51+
format: {
52+
ecma: 5,
53+
comments: false,
54+
ascii_only: true,
55+
},
56+
};
57+
}

packages/docusaurus-types/src/config.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ export type StorageConfig = {
125125

126126
export type FasterConfig = {
127127
swcJsLoader: boolean;
128+
swcJsMinimizer: boolean;
128129
};
129130

130131
export type FutureConfig = {

packages/docusaurus-types/src/index.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export {
1414
ParseFrontMatter,
1515
DocusaurusConfig,
1616
FutureConfig,
17+
FasterConfig,
1718
StorageConfig,
1819
Config,
1920
} from './config';

packages/docusaurus/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@
9292
"semver": "^7.5.4",
9393
"serve-handler": "^6.1.5",
9494
"shelljs": "^0.8.5",
95-
"terser-webpack-plugin": "^5.3.9",
95+
"terser-webpack-plugin": "^5.3.10",
9696
"tslib": "^2.6.0",
9797
"update-notifier": "^6.0.2",
9898
"url-loader": "^4.1.1",

packages/docusaurus/src/commands/build.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,7 @@ async function getBuildClientConfig({
334334
const result = await createBuildClientConfig({
335335
props,
336336
minify: cliOptions.minify ?? true,
337+
faster: props.siteConfig.future.experimental_faster,
337338
bundleAnalyzer: cliOptions.bundleAnalyzer ?? false,
338339
});
339340
let {config} = result;

packages/docusaurus/src/commands/start/webpack.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ async function getStartClientConfig({
136136
let {clientConfig: config} = await createStartClientConfig({
137137
props,
138138
minify,
139+
faster: props.siteConfig.future.experimental_faster,
139140
poll,
140141
});
141142
config = executePluginsConfigureWebpack({

packages/docusaurus/src/faster.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77

88
import type {ConfigureWebpackUtils} from '@docusaurus/types';
9+
import type {MinimizerOptions, CustomOptions} from 'terser-webpack-plugin';
910

1011
async function importFaster() {
1112
return import('@docusaurus/faster');
@@ -22,9 +23,16 @@ async function ensureFaster() {
2223
}
2324
}
2425

25-
export async function getSwcJsLoaderFactory(): Promise<
26+
export async function importSwcJsLoaderFactory(): Promise<
2627
ConfigureWebpackUtils['getJSLoader']
2728
> {
2829
const faster = await ensureFaster();
2930
return faster.getSwcJsLoaderFactory;
3031
}
32+
33+
export async function importSwcJsMinifierOptions(): Promise<
34+
MinimizerOptions<CustomOptions>
35+
> {
36+
const faster = await ensureFaster();
37+
return faster.getSwcJsMinifierOptions() as MinimizerOptions<CustomOptions>;
38+
}

packages/docusaurus/src/server/__tests__/__snapshots__/config.test.ts.snap

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ exports[`loadSiteConfig website with .cjs siteConfig 1`] = `
1010
"future": {
1111
"experimental_faster": {
1212
"swcJsLoader": false,
13+
"swcJsMinimizer": false,
1314
},
1415
"experimental_router": "browser",
1516
"experimental_storage": {
@@ -74,6 +75,7 @@ exports[`loadSiteConfig website with ts + js config 1`] = `
7475
"future": {
7576
"experimental_faster": {
7677
"swcJsLoader": false,
78+
"swcJsMinimizer": false,
7779
},
7880
"experimental_router": "browser",
7981
"experimental_storage": {
@@ -138,6 +140,7 @@ exports[`loadSiteConfig website with valid JS CJS config 1`] = `
138140
"future": {
139141
"experimental_faster": {
140142
"swcJsLoader": false,
143+
"swcJsMinimizer": false,
141144
},
142145
"experimental_router": "browser",
143146
"experimental_storage": {
@@ -202,6 +205,7 @@ exports[`loadSiteConfig website with valid JS ESM config 1`] = `
202205
"future": {
203206
"experimental_faster": {
204207
"swcJsLoader": false,
208+
"swcJsMinimizer": false,
205209
},
206210
"experimental_router": "browser",
207211
"experimental_storage": {
@@ -266,6 +270,7 @@ exports[`loadSiteConfig website with valid TypeScript CJS config 1`] = `
266270
"future": {
267271
"experimental_faster": {
268272
"swcJsLoader": false,
273+
"swcJsMinimizer": false,
269274
},
270275
"experimental_router": "browser",
271276
"experimental_storage": {
@@ -330,6 +335,7 @@ exports[`loadSiteConfig website with valid TypeScript ESM config 1`] = `
330335
"future": {
331336
"experimental_faster": {
332337
"swcJsLoader": false,
338+
"swcJsMinimizer": false,
333339
},
334340
"experimental_router": "browser",
335341
"experimental_storage": {
@@ -394,6 +400,7 @@ exports[`loadSiteConfig website with valid async config 1`] = `
394400
"future": {
395401
"experimental_faster": {
396402
"swcJsLoader": false,
403+
"swcJsMinimizer": false,
397404
},
398405
"experimental_router": "browser",
399406
"experimental_storage": {
@@ -460,6 +467,7 @@ exports[`loadSiteConfig website with valid async config creator function 1`] = `
460467
"future": {
461468
"experimental_faster": {
462469
"swcJsLoader": false,
470+
"swcJsMinimizer": false,
463471
},
464472
"experimental_router": "browser",
465473
"experimental_storage": {
@@ -526,6 +534,7 @@ exports[`loadSiteConfig website with valid config creator function 1`] = `
526534
"future": {
527535
"experimental_faster": {
528536
"swcJsLoader": false,
537+
"swcJsMinimizer": false,
529538
},
530539
"experimental_router": "browser",
531540
"experimental_storage": {
@@ -595,6 +604,7 @@ exports[`loadSiteConfig website with valid siteConfig 1`] = `
595604
"future": {
596605
"experimental_faster": {
597606
"swcJsLoader": false,
607+
"swcJsMinimizer": false,
598608
},
599609
"experimental_router": "browser",
600610
"experimental_storage": {

packages/docusaurus/src/server/__tests__/__snapshots__/site.test.ts.snap

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ exports[`load loads props for site with custom i18n path 1`] = `
8080
"future": {
8181
"experimental_faster": {
8282
"swcJsLoader": false,
83+
"swcJsMinimizer": false,
8384
},
8485
"experimental_router": "browser",
8586
"experimental_storage": {

packages/docusaurus/src/server/__tests__/configValidation.test.ts

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ describe('normalizeConfig', () => {
4747
future: {
4848
experimental_faster: {
4949
swcJsLoader: true,
50+
swcJsMinimizer: true,
5051
},
5152
experimental_storage: {
5253
type: 'sessionStorage',
@@ -741,6 +742,7 @@ describe('future', () => {
741742
const future: DocusaurusConfig['future'] = {
742743
experimental_faster: {
743744
swcJsLoader: true,
745+
swcJsMinimizer: true,
744746
},
745747
experimental_storage: {
746748
type: 'sessionStorage',
@@ -1200,5 +1202,75 @@ describe('future', () => {
12001202
`);
12011203
});
12021204
});
1205+
describe('swcJsMinimizer', () => {
1206+
it('accepts - undefined', () => {
1207+
const faster: Partial<FasterConfig> = {
1208+
swcJsMinimizer: undefined,
1209+
};
1210+
expect(
1211+
normalizeConfig({
1212+
future: {
1213+
experimental_faster: faster,
1214+
},
1215+
}),
1216+
).toEqual(fasterContaining({swcJsMinimizer: false}));
1217+
});
1218+
1219+
it('accepts - true', () => {
1220+
const faster: Partial<FasterConfig> = {
1221+
swcJsMinimizer: true,
1222+
};
1223+
expect(
1224+
normalizeConfig({
1225+
future: {
1226+
experimental_faster: faster,
1227+
},
1228+
}),
1229+
).toEqual(fasterContaining({swcJsMinimizer: true}));
1230+
});
1231+
1232+
it('accepts - false', () => {
1233+
const faster: Partial<FasterConfig> = {
1234+
swcJsMinimizer: false,
1235+
};
1236+
expect(
1237+
normalizeConfig({
1238+
future: {
1239+
experimental_faster: faster,
1240+
},
1241+
}),
1242+
).toEqual(fasterContaining({swcJsMinimizer: false}));
1243+
});
1244+
1245+
it('rejects - null', () => {
1246+
// @ts-expect-error: invalid
1247+
const faster: Partial<FasterConfig> = {swcJsMinimizer: 42};
1248+
expect(() =>
1249+
normalizeConfig({
1250+
future: {
1251+
experimental_faster: faster,
1252+
},
1253+
}),
1254+
).toThrowErrorMatchingInlineSnapshot(`
1255+
""future.experimental_faster.swcJsMinimizer" must be a boolean
1256+
"
1257+
`);
1258+
});
1259+
1260+
it('rejects - number', () => {
1261+
// @ts-expect-error: invalid
1262+
const faster: Partial<FasterConfig> = {swcJsMinimizer: 42};
1263+
expect(() =>
1264+
normalizeConfig({
1265+
future: {
1266+
experimental_faster: faster,
1267+
},
1268+
}),
1269+
).toThrowErrorMatchingInlineSnapshot(`
1270+
""future.experimental_faster.swcJsMinimizer" must be a boolean
1271+
"
1272+
`);
1273+
});
1274+
});
12031275
});
12041276
});

0 commit comments

Comments
 (0)