fix(faster): fix server build SWC / browserslist node target (#11496)
Some checks failed
Argos CI / take-screenshots (push) Has been cancelled
Build Hash Router / Build Hash Router (push) Has been cancelled
Canary Release / Publish Canary (push) Has been cancelled
CodeQL / Analyze (javascript) (push) Has been cancelled
Continuous Releases / Continuous Releases (push) Has been cancelled
E2E Tests / E2E — Yarn v1 (20) (push) Has been cancelled
E2E Tests / E2E — Yarn v1 (20.0) (push) Has been cancelled
E2E Tests / E2E — Yarn v1 (22) (push) Has been cancelled
E2E Tests / E2E — Yarn v1 (24) (push) Has been cancelled
E2E Tests / E2E — Yarn v1 (25) (push) Has been cancelled
E2E Tests / E2E — Yarn v1 Windows (push) Has been cancelled
E2E Tests / E2E — Yarn Berry (node-modules, -s) (push) Has been cancelled
E2E Tests / E2E — Yarn Berry (node-modules, -st) (push) Has been cancelled
E2E Tests / E2E — Yarn Berry (pnp, -s) (push) Has been cancelled
E2E Tests / E2E — Yarn Berry (pnp, -st) (push) Has been cancelled
E2E Tests / E2E — npm (push) Has been cancelled
E2E Tests / E2E — pnpm (push) Has been cancelled

This commit is contained in:
Sébastien Lorber 2025-10-17 21:02:45 +02:00 committed by GitHub
parent e133e8d6d2
commit 0372ecd1e9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 46 additions and 17 deletions

View File

@ -28,7 +28,7 @@ async function createSwcJsLoaderFactory(): Promise<
return ({isServer}) => { return ({isServer}) => {
return { return {
loader, loader,
options: getOptions({isServer}), options: getOptions({isServer, bundlerName: 'webpack'}),
}; };
}; };
} }
@ -42,7 +42,7 @@ async function createRspackSwcJsLoaderFactory(): Promise<
return ({isServer}) => { return ({isServer}) => {
return { return {
loader, loader,
options: getOptions({isServer}), options: getOptions({isServer, bundlerName: 'rspack'}),
}; };
}; };
} }

View File

@ -142,7 +142,10 @@ async function getRspackMinimizers({
}: MinimizersConfig): Promise<WebpackPluginInstance[]> { }: MinimizersConfig): Promise<WebpackPluginInstance[]> {
const rspack = getCurrentBundlerAsRspack({currentBundler}); const rspack = getCurrentBundlerAsRspack({currentBundler});
const getBrowserslistQueries = await importGetBrowserslistQueries(); const getBrowserslistQueries = await importGetBrowserslistQueries();
const browserslistQueries = getBrowserslistQueries({isServer: false}); const browserslistQueries = getBrowserslistQueries({
isServer: false,
bundlerName: 'rspack',
});
const swcJsMinimizerOptions = await importSwcJsMinimizerOptions(); const swcJsMinimizerOptions = await importSwcJsMinimizerOptions();
return [ return [
// See https://rspack.dev/plugins/rspack/swc-js-minimizer-rspack-plugin // See https://rspack.dev/plugins/rspack/swc-js-minimizer-rspack-plugin

View File

@ -24,6 +24,7 @@
"@swc/html": "^1.13.5", "@swc/html": "^1.13.5",
"browserslist": "^4.24.2", "browserslist": "^4.24.2",
"lightningcss": "^1.27.0", "lightningcss": "^1.27.0",
"semver": "^7.5.4",
"swc-loader": "^0.2.6", "swc-loader": "^0.2.6",
"tslib": "^2.6.0", "tslib": "^2.6.0",
"webpack": "^5.95.0" "webpack": "^5.95.0"

View File

@ -9,18 +9,22 @@ import Rspack from '@rspack/core';
import * as lightningcss from 'lightningcss'; import * as lightningcss from 'lightningcss';
import browserslist from 'browserslist'; import browserslist from 'browserslist';
import {minify as swcHtmlMinifier} from '@swc/html'; import {minify as swcHtmlMinifier} from '@swc/html';
import semver from 'semver';
import type {JsMinifyOptions, Options as SwcOptions} from '@swc/core'; import type {JsMinifyOptions, Options as SwcOptions} from '@swc/core';
import type {CurrentBundler} from '@docusaurus/types';
export const swcLoader = require.resolve('swc-loader'); export const swcLoader = require.resolve('swc-loader');
export const getSwcLoaderOptions = ({ export const getSwcLoaderOptions = ({
isServer, isServer,
bundlerName,
}: { }: {
isServer: boolean; isServer: boolean;
bundlerName: CurrentBundler['name'];
}): SwcOptions => { }): SwcOptions => {
return { return {
env: { env: {
targets: getBrowserslistQueries({isServer}), targets: getBrowserslistQueries({isServer, bundlerName}),
}, },
jsc: { jsc: {
parser: { parser: {
@ -63,20 +67,53 @@ export function getSwcJsMinimizerOptions(): JsMinifyOptions {
}; };
} }
// TODO this is not accurate
// for Rspack we should read from the built-in browserslist data
// see https://github.com/facebook/docusaurus/pull/11496
function getLastBrowserslistKnownNodeVersion(
bundlerName: CurrentBundler['name'],
): string {
if (bundlerName === 'rspack') {
// TODO hardcoded value until Rspack exposes its Browserslist data
// see https://github.com/facebook/docusaurus/pull/11496
return '22.0.0';
}
// browserslist('last 1 node versions')[0]!.replace('node ', '')
return browserslist.nodeVersions.at(-1)!;
}
function getMinVersion(v1: string, v2: string): string {
return semver.lt(v1, v2) ? v1 : v2;
}
// We need this because of Rspack built-in LightningCSS integration // We need this because of Rspack built-in LightningCSS integration
// See https://github.com/orgs/browserslist/discussions/846 // See https://github.com/orgs/browserslist/discussions/846
export function getBrowserslistQueries({ export function getBrowserslistQueries({
isServer, isServer,
bundlerName,
}: { }: {
isServer: boolean; isServer: boolean;
bundlerName: CurrentBundler['name'];
}): string[] { }): string[] {
if (isServer) { if (isServer) {
return [`node ${process.versions.node}`]; // Escape hatch env variable
if (process.env.DOCUSAURUS_SERVER_NODE_TARGET) {
return [`node ${process.env.DOCUSAURUS_SERVER_NODE_TARGET}`];
}
// For server builds, we want to use the current Node version as target
// But we can't pass a target that Browserslist doesn't know about yet
const nodeTarget = getMinVersion(
process.versions.node,
getLastBrowserslistKnownNodeVersion(bundlerName),
);
return [`node ${nodeTarget}`];
} }
const queries = browserslist.loadConfig({path: process.cwd()}) ?? [ const queries = browserslist.loadConfig({path: process.cwd()}) ?? [
...browserslist.defaults, ...browserslist.defaults,
]; ];
return queries; return queries;
} }

View File

@ -49,18 +49,6 @@ export default async function themeMermaid(): Promise<Plugin<void>> {
), ),
}), }),
], ],
// Workaround for weird Rspack/SWC issue
// See https://github.com/facebook/docusaurus/issues/11430
resolve: {
alias: {
...(elkLayoutEnabled
? {}
: {
'@mermaid-js/layout-elk': false,
}),
},
},
}; };
}, },
}; };