diff --git a/packages/next/build/jest/jest.ts b/packages/next/build/jest/jest.ts index 256e11beb36c..844afc8e2230 100644 --- a/packages/next/build/jest/jest.ts +++ b/packages/next/build/jest/jest.ts @@ -5,6 +5,7 @@ import { PHASE_TEST } from '../../shared/lib/constants' import loadJsConfig from '../load-jsconfig' import * as Log from '../output/log' import { findPagesDir } from '../../lib/find-pages-dir' +import { loadBindings, lockfilePatchPromise } from '../swc' async function getConfig(dir: string) { const conf = await loadConfig(PHASE_TEST, dir) @@ -72,6 +73,13 @@ export default function nextJest(options: { dir?: string } = {}) { ? await customJestConfig() : customJestConfig) ?? {} + // eagerly load swc bindings instead of waiting for transform calls + await loadBindings() + + if (lockfilePatchPromise.cur) { + await lockfilePatchPromise.cur + } + return { ...resolvedJestConfig, diff --git a/packages/next/build/swc/index.d.ts b/packages/next/build/swc/index.d.ts index 564090d59b22..01784e65d7f0 100644 --- a/packages/next/build/swc/index.d.ts +++ b/packages/next/build/swc/index.d.ts @@ -8,3 +8,4 @@ export function parse(src: string, options: any): any export const lockfilePatchPromise: { cur?: Promise } export function initCustomTraceSubscriber(traceFileName?: string): void export function teardownTraceSubscriber(): void +export function loadBindings(): Promise diff --git a/packages/next/build/swc/index.js b/packages/next/build/swc/index.js index b3488bf9495b..de0008d53bf0 100644 --- a/packages/next/build/swc/index.js +++ b/packages/next/build/swc/index.js @@ -20,7 +20,7 @@ let pendingBindings let swcTraceFlushGuard export const lockfilePatchPromise = {} -async function loadBindings() { +export async function loadBindings() { if (pendingBindings) { return pendingBindings } @@ -87,6 +87,12 @@ function loadBindingsSync() { attempts = attempts.concat(a) } + // we can leverage the wasm bindings if they are already + // loaded + if (wasmBindings) { + return wasmBindings + } + logLoadFailure(attempts) } @@ -133,16 +139,24 @@ async function loadWasm(importPath = '') { wasmBindings = { isWasm: true, transform(src, options) { - return Promise.resolve( - bindings.transformSync(src.toString(), options) - ) + return bindings.transformSync(src.toString(), options) + }, + transformSync(src, options) { + return bindings.transformSync(src.toString(), options) }, minify(src, options) { - return Promise.resolve(bindings.minifySync(src.toString(), options)) + return bindings.minifySync(src.toString(), options) + }, + minifySync(src, options) { + return bindings.minifySync(src.toString(), options) }, parse(src, options) { const astStr = bindings.parseSync(src.toString(), options) - return Promise.resolve(astStr) + return astStr + }, + parseSync(src, options) { + const astStr = bindings.parseSync(src.toString(), options) + return astStr }, getTargetTriple() { return undefined diff --git a/packages/next/build/webpack-config.ts b/packages/next/build/webpack-config.ts index 2c6a84fef686..c225847ae8de 100644 --- a/packages/next/build/webpack-config.ts +++ b/packages/next/build/webpack-config.ts @@ -54,6 +54,7 @@ import { withoutRSCExtensions } from './utils' import browserslist from 'next/dist/compiled/browserslist' import loadJsConfig from './load-jsconfig' import { getMiddlewareSourceMapPlugins } from './webpack/plugins/middleware-source-maps-plugin' +import { loadBindings } from './swc' const watchOptions = Object.freeze({ aggregateTimeout: 5, @@ -432,6 +433,11 @@ export default async function getBaseWebpackConfig( loggedSwcDisabled = true } + // eagerly load swc bindings instead of waiting for transform calls + if (!babelConfigFile && isClient) { + await loadBindings() + } + if (!loggedIgnoredCompilerOptions && !useSWCLoader && config.compiler) { Log.info( '`compiler` options in `next.config.js` will be ignored while using Babel https://nextjs.org/docs/messages/ignored-compiler-options'