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..fb2b6d7538 100644 --- a/packages/docusaurus-faster/src/index.ts +++ b/packages/docusaurus-faster/src/index.ts @@ -9,6 +9,7 @@ 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'; export const swcLoader = require.resolve('swc-loader'); @@ -63,6 +64,17 @@ export function getSwcJsMinimizerOptions(): JsMinifyOptions { }; } +// TODO this is not accurate +// for Rspack we should read from the built-in browserslist data +function getLastBrowserslistKnownNodeVersion(): string { + // 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({ @@ -71,12 +83,23 @@ export function getBrowserslistQueries({ isServer: boolean; }): string[] { if (isServer) { - return [`node ${process.versions.node}`]; + 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(), + ); + + return [`node ${nodeTarget}`]; } const queries = browserslist.loadConfig({path: process.cwd()}) ?? [ ...browserslist.defaults, ]; + return queries; }