From 0372ecd1e910697f2f362a607b5fd730d8a7f9b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Lorber?= Date: Fri, 17 Oct 2025 21:02:45 +0200 Subject: [PATCH] fix(faster): fix server build SWC / browserslist node target (#11496) --- .../src/loaders/jsLoader.ts | 4 +- .../docusaurus-bundler/src/minification.ts | 5 ++- packages/docusaurus-faster/package.json | 1 + packages/docusaurus-faster/src/index.ts | 41 ++++++++++++++++++- .../docusaurus-theme-mermaid/src/index.ts | 12 ------ 5 files changed, 46 insertions(+), 17 deletions(-) diff --git a/packages/docusaurus-bundler/src/loaders/jsLoader.ts b/packages/docusaurus-bundler/src/loaders/jsLoader.ts index 6f9213454d..51d749ce64 100644 --- a/packages/docusaurus-bundler/src/loaders/jsLoader.ts +++ b/packages/docusaurus-bundler/src/loaders/jsLoader.ts @@ -28,7 +28,7 @@ async function createSwcJsLoaderFactory(): Promise< return ({isServer}) => { return { loader, - options: getOptions({isServer}), + options: getOptions({isServer, bundlerName: 'webpack'}), }; }; } @@ -42,7 +42,7 @@ async function createRspackSwcJsLoaderFactory(): Promise< return ({isServer}) => { return { loader, - options: getOptions({isServer}), + options: getOptions({isServer, bundlerName: 'rspack'}), }; }; } diff --git a/packages/docusaurus-bundler/src/minification.ts b/packages/docusaurus-bundler/src/minification.ts index 0c4d2d8dde..a06b81c988 100644 --- a/packages/docusaurus-bundler/src/minification.ts +++ b/packages/docusaurus-bundler/src/minification.ts @@ -142,7 +142,10 @@ async function getRspackMinimizers({ }: MinimizersConfig): Promise { const rspack = getCurrentBundlerAsRspack({currentBundler}); const getBrowserslistQueries = await importGetBrowserslistQueries(); - const browserslistQueries = getBrowserslistQueries({isServer: false}); + const browserslistQueries = getBrowserslistQueries({ + isServer: false, + bundlerName: 'rspack', + }); const swcJsMinimizerOptions = await importSwcJsMinimizerOptions(); return [ // See https://rspack.dev/plugins/rspack/swc-js-minimizer-rspack-plugin diff --git a/packages/docusaurus-faster/package.json b/packages/docusaurus-faster/package.json index 704b4f08a6..23c119d216 100644 --- a/packages/docusaurus-faster/package.json +++ b/packages/docusaurus-faster/package.json @@ -24,6 +24,7 @@ "@swc/html": "^1.13.5", "browserslist": "^4.24.2", "lightningcss": "^1.27.0", + "semver": "^7.5.4", "swc-loader": "^0.2.6", "tslib": "^2.6.0", "webpack": "^5.95.0" diff --git a/packages/docusaurus-faster/src/index.ts b/packages/docusaurus-faster/src/index.ts index cba2c68730..27cc387a7a 100644 --- a/packages/docusaurus-faster/src/index.ts +++ b/packages/docusaurus-faster/src/index.ts @@ -9,18 +9,22 @@ import Rspack from '@rspack/core'; import * as lightningcss from 'lightningcss'; import browserslist from 'browserslist'; import {minify as swcHtmlMinifier} from '@swc/html'; +import semver from 'semver'; import type {JsMinifyOptions, Options as SwcOptions} from '@swc/core'; +import type {CurrentBundler} from '@docusaurus/types'; export const swcLoader = require.resolve('swc-loader'); export const getSwcLoaderOptions = ({ isServer, + bundlerName, }: { isServer: boolean; + bundlerName: CurrentBundler['name']; }): SwcOptions => { return { env: { - targets: getBrowserslistQueries({isServer}), + targets: getBrowserslistQueries({isServer, bundlerName}), }, jsc: { 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 // See https://github.com/orgs/browserslist/discussions/846 export function getBrowserslistQueries({ isServer, + bundlerName, }: { isServer: boolean; + bundlerName: CurrentBundler['name']; }): string[] { 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()}) ?? [ ...browserslist.defaults, ]; + return queries; } diff --git a/packages/docusaurus-theme-mermaid/src/index.ts b/packages/docusaurus-theme-mermaid/src/index.ts index 288000902b..622c6b2ef7 100644 --- a/packages/docusaurus-theme-mermaid/src/index.ts +++ b/packages/docusaurus-theme-mermaid/src/index.ts @@ -49,18 +49,6 @@ export default async function themeMermaid(): Promise> { ), }), ], - - // Workaround for weird Rspack/SWC issue - // See https://github.com/facebook/docusaurus/issues/11430 - resolve: { - alias: { - ...(elkLayoutEnabled - ? {} - : { - '@mermaid-js/layout-elk': false, - }), - }, - }, }; }, };