From 3ead02cb641c572a0c2b5ffeb55a4188188b2e4d Mon Sep 17 00:00:00 2001 From: sebastien Date: Fri, 17 Oct 2025 19:21:11 +0200 Subject: [PATCH] Improve node SWC / browserslist target --- .../src/loaders/jsLoader.ts | 4 +-- .../docusaurus-bundler/src/minification.ts | 5 ++- packages/docusaurus-faster/src/index.ts | 34 +++++++++++++------ 3 files changed, 29 insertions(+), 14 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/src/index.ts b/packages/docusaurus-faster/src/index.ts index fb2b6d7538..d280160328 100644 --- a/packages/docusaurus-faster/src/index.ts +++ b/packages/docusaurus-faster/src/index.ts @@ -11,17 +11,20 @@ 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: { @@ -66,7 +69,13 @@ export function getSwcJsMinimizerOptions(): JsMinifyOptions { // TODO this is not accurate // for Rspack we should read from the built-in browserslist data -function getLastBrowserslistKnownNodeVersion(): string { +function getLastBrowserslistKnownNodeVersion( + bundlerName: CurrentBundler['name'], +): string { + if (bundlerName === 'rspack') { + // TODO hardcoded value until Rspack exposes its Browserslist data + return '22.0.0'; + } // browserslist('last 1 node versions')[0]!.replace('node ', '') return browserslist.nodeVersions.at(-1)!; } @@ -79,19 +88,22 @@ function getMinVersion(v1: string, v2: string): string { // See https://github.com/orgs/browserslist/discussions/846 export function getBrowserslistQueries({ isServer, + bundlerName, }: { isServer: boolean; + bundlerName: CurrentBundler['name']; }): string[] { if (isServer) { - const nodeTarget = - // Escape hatch env variable - 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 - getMinVersion( - process.versions.node, - getLastBrowserslistKnownNodeVersion(), - ); + // 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}`]; }