From f346d89741b3c3a5287ce8b03637e520777d3674 Mon Sep 17 00:00:00 2001 From: Bjorn Lu Date: Fri, 14 Jan 2022 05:45:38 +0800 Subject: [PATCH] fix(ssr): avoid using `tryNodeResolve` on absolute paths (#6488) Co-authored-by: Alec Larson <1925840+aleclarson@users.noreply.github.com> --- packages/playground/ssr-deps/package.json | 1 + packages/playground/ssr-deps/require-absolute/foo.js | 1 + packages/playground/ssr-deps/require-absolute/index.js | 3 +++ packages/playground/ssr-deps/require-absolute/package.json | 5 +++++ packages/playground/ssr-deps/src/app.js | 4 ++++ packages/vite/src/node/ssr/ssrModuleLoader.ts | 7 ++++--- pnpm-lock.yaml | 5 +++++ 7 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 packages/playground/ssr-deps/require-absolute/foo.js create mode 100644 packages/playground/ssr-deps/require-absolute/index.js create mode 100644 packages/playground/ssr-deps/require-absolute/package.json diff --git a/packages/playground/ssr-deps/package.json b/packages/playground/ssr-deps/package.json index fac7c150b49924..7af243c3b4769a 100644 --- a/packages/playground/ssr-deps/package.json +++ b/packages/playground/ssr-deps/package.json @@ -17,6 +17,7 @@ "only-object-assigned-exports": "file:./only-object-assigned-exports", "primitive-export": "file:./primitive-export", "read-file-content": "file:./read-file-content", + "require-absolute": "file:./require-absolute", "ts-transpiled-exports": "file:./ts-transpiled-exports" }, "devDependencies": { diff --git a/packages/playground/ssr-deps/require-absolute/foo.js b/packages/playground/ssr-deps/require-absolute/foo.js new file mode 100644 index 00000000000000..d48e42fa57dd14 --- /dev/null +++ b/packages/playground/ssr-deps/require-absolute/foo.js @@ -0,0 +1 @@ +module.exports.hello = 'Hello World!' diff --git a/packages/playground/ssr-deps/require-absolute/index.js b/packages/playground/ssr-deps/require-absolute/index.js new file mode 100644 index 00000000000000..c2f844f3e2f6ed --- /dev/null +++ b/packages/playground/ssr-deps/require-absolute/index.js @@ -0,0 +1,3 @@ +const path = require('path') + +module.exports.hello = () => require(path.resolve(__dirname, './foo.js')).hello diff --git a/packages/playground/ssr-deps/require-absolute/package.json b/packages/playground/ssr-deps/require-absolute/package.json new file mode 100644 index 00000000000000..54b14f125760d0 --- /dev/null +++ b/packages/playground/ssr-deps/require-absolute/package.json @@ -0,0 +1,5 @@ +{ + "name": "require-absolute", + "version": "0.0.0", + "private": true +} diff --git a/packages/playground/ssr-deps/src/app.js b/packages/playground/ssr-deps/src/app.js index da8883c6a9452b..9646cdcf2bf688 100644 --- a/packages/playground/ssr-deps/src/app.js +++ b/packages/playground/ssr-deps/src/app.js @@ -8,6 +8,7 @@ import bcrypt from 'bcrypt' import definePropertiesExports from 'define-properties-exports' import definePropertyExports from 'define-property-exports' import onlyObjectAssignedExports from 'only-object-assigned-exports' +import requireAbsolute from 'require-absolute' export async function render(url, rootDir) { let html = '' @@ -41,5 +42,8 @@ export async function render(url, rootDir) { const onlyObjectAssignedExportsMessage = onlyObjectAssignedExports.hello() html += `\n

message from only-object-assigned-exports: ${onlyObjectAssignedExportsMessage}

` + const requireAbsoluteMessage = requireAbsolute.hello() + html += `\n

message from require-absolute: ${requireAbsoluteMessage}

` + return html + '\n' } diff --git a/packages/vite/src/node/ssr/ssrModuleLoader.ts b/packages/vite/src/node/ssr/ssrModuleLoader.ts index f060e640b0cf89..4942d98178cd09 100644 --- a/packages/vite/src/node/ssr/ssrModuleLoader.ts +++ b/packages/vite/src/node/ssr/ssrModuleLoader.ts @@ -2,6 +2,7 @@ import path from 'path' import { pathToFileURL } from 'url' import type { ViteDevServer } from '../server' import { + bareImportRE, dynamicImport, isBuiltin, unwrapId, @@ -232,9 +233,9 @@ async function nodeImport( // When an ESM module imports an ESM dependency, this hook is *not* used. const unhookNodeResolve = hookNodeResolve( (nodeResolve) => (id, parent, isMain, options) => { - // Fix #5709, use require to resolve files with the '.node' file extension. - // See detail, https://nodejs.org/api/addons.html#addons_loading_addons_using_require - if (id[0] === '.' || isBuiltin(id) || id.endsWith('.node')) { + // Use the Vite resolver only for bare imports while skipping + // any built-in modules and binary modules. + if (!bareImportRE.test(id) || isBuiltin(id) || id.endsWith('.node')) { return nodeResolve(id, parent, isMain, options) } if (parent) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a0336ef4b55d04..d29d20f832517e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -463,6 +463,7 @@ importers: only-object-assigned-exports: file:./only-object-assigned-exports primitive-export: file:./primitive-export read-file-content: file:./read-file-content + require-absolute: file:./require-absolute ts-transpiled-exports: file:./ts-transpiled-exports dependencies: bcrypt: 5.0.1 @@ -473,6 +474,7 @@ importers: only-object-assigned-exports: link:only-object-assigned-exports primitive-export: link:primitive-export read-file-content: link:read-file-content + require-absolute: link:require-absolute ts-transpiled-exports: link:ts-transpiled-exports devDependencies: cross-env: 7.0.3 @@ -499,6 +501,9 @@ importers: packages/playground/ssr-deps/read-file-content: specifiers: {} + packages/playground/ssr-deps/require-absolute: + specifiers: {} + packages/playground/ssr-deps/ts-transpiled-exports: specifiers: {}