From 74b55b854200c3847cf13e7e036c0dc299820c64 Mon Sep 17 00:00:00 2001 From: Evan You Date: Wed, 27 Jan 2021 18:39:48 -0500 Subject: [PATCH] fix(optimizer): attempt resolve node builtin first before externalizing fix #1746 --- .../src/node/optimizer/esbuildDepPlugin.ts | 51 +++++++++---------- .../vite/src/node/server/middlewares/error.ts | 8 ++- .../vite/src/node/server/pluginContainer.ts | 8 +-- 3 files changed, 35 insertions(+), 32 deletions(-) diff --git a/packages/vite/src/node/optimizer/esbuildDepPlugin.ts b/packages/vite/src/node/optimizer/esbuildDepPlugin.ts index 849d50be46c108..99b6c21973e52a 100644 --- a/packages/vite/src/node/optimizer/esbuildDepPlugin.ts +++ b/packages/vite/src/node/optimizer/esbuildDepPlugin.ts @@ -2,8 +2,8 @@ import path from 'path' import { Plugin } from 'esbuild' import { knownAssetTypes } from '../constants' import { ResolvedConfig } from '..' -import chalk from 'chalk' -import { isBuiltin, isRunningWithYarnPnp } from '../utils' +import { isRunningWithYarnPnp } from '../utils' +import { browserExternalId } from '../plugins/resolve' const externalTypes = [ 'css', @@ -53,35 +53,32 @@ export function esbuildDepPlugin( } ) - build.onResolve({ filter: /^[\w@]/ }, async ({ path: id, importer }) => { - // ensure esbuild uses our resolved entires of optimized deps in all - // cases - if (id in qualified) { - return { - path: path.resolve(qualified[id]) - } - } else if (!isBuiltin(id)) { - // use vite resolver - const resolved = await resolve(id, importer) - if (resolved) { + build.onResolve( + { filter: /^[\w@][^:]/ }, + async ({ path: id, importer }) => { + // ensure esbuild uses our resolved entires of optimized deps in all + // cases + if (id in qualified) { return { - path: resolved + path: path.resolve(qualified[id]) + } + } else { + // use vite resolver + const resolved = await resolve(id, importer) + if (resolved) { + if (resolved.startsWith(browserExternalId)) { + return { + path: id, + namespace: 'browser-external' + } + } + return { + path: resolved + } } - } - } else { - // redirect node-builtins to empty module for browser - config.logger.warn( - chalk.yellow( - `externalized node built-in "${id}" to empty module. ` + - `(imported by: ${chalk.white.dim(importer)})` - ) - ) - return { - path: id, - namespace: 'browser-external' } } - }) + ) build.onLoad( { filter: /.*/, namespace: 'browser-external' }, diff --git a/packages/vite/src/node/server/middlewares/error.ts b/packages/vite/src/node/server/middlewares/error.ts index 77beb47185732f..71fbaa665a151a 100644 --- a/packages/vite/src/node/server/middlewares/error.ts +++ b/packages/vite/src/node/server/middlewares/error.ts @@ -20,11 +20,15 @@ export function prepareError(err: Error | RollupError): ErrorPayload['err'] { } } -export function buildErrorMessage(err: RollupError, args: string[] = []) { +export function buildErrorMessage( + err: RollupError, + args: string[] = [], + includeStack = true +) { if (err.plugin) args.push(` Plugin: ${chalk.magenta(err.plugin)}`) if (err.id) args.push(` File: ${chalk.cyan(err.id)}`) if (err.frame) args.push(chalk.yellow(pad(err.frame))) - if (err.stack) args.push(pad(cleanStack(err.stack))) + if (includeStack && err.stack) args.push(pad(cleanStack(err.stack))) return args.join('\n') } diff --git a/packages/vite/src/node/server/pluginContainer.ts b/packages/vite/src/node/server/pluginContainer.ts index b9d39618ac3c0b..3bfb763c20211b 100644 --- a/packages/vite/src/node/server/pluginContainer.ts +++ b/packages/vite/src/node/server/pluginContainer.ts @@ -256,9 +256,11 @@ export async function createPluginContainer( position?: number | { column: number; line: number } ) { const err = formatError(e, position, this) - const msg = buildErrorMessage(err, [ - chalk.yellow(`warning: ${err.message}`) - ]) + const msg = buildErrorMessage( + err, + [chalk.yellow(`warning: ${err.message}`)], + false + ) logger.warn(msg, { clear: true, timestamp: true