From 8e401aecfd69de941c6cf57a05cabd5e4d5ada7a Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Thu, 12 May 2022 04:15:27 -0500 Subject: [PATCH] Eagerly load swc bindings for wasm fallback for jest (#36784) Follow-up to https://github.com/vercel/next.js/pull/36612 this updates to eagerly load the swc bindings unless babel is being used so that we don't wait for the transform calls to initialize swc. Eagerly loading in jest also allows us to fallback to the wasm bindings when previously we couldn't since they needed to wait for the import. --- packages/next/build/jest/jest.ts | 8 ++++++++ packages/next/build/swc/index.d.ts | 1 + packages/next/build/swc/index.js | 26 ++++++++++++++++++++------ packages/next/build/webpack-config.ts | 6 ++++++ 4 files changed, 35 insertions(+), 6 deletions(-) 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'