From aba57a5d12d020583299de12e5bc70d79cd4266a Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Mon, 12 Feb 2024 22:22:44 +0900 Subject: [PATCH 1/2] feat(ssr): `import.meta.filename`/`dirname` support --- .../ssr/__tests__/fixtures/modules/import-meta.js | 2 ++ .../src/node/ssr/__tests__/ssrLoadModule.spec.ts | 10 ++++++++++ packages/vite/src/node/ssr/ssrModuleLoader.ts | 13 ++++++++++++- 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 packages/vite/src/node/ssr/__tests__/fixtures/modules/import-meta.js diff --git a/packages/vite/src/node/ssr/__tests__/fixtures/modules/import-meta.js b/packages/vite/src/node/ssr/__tests__/fixtures/modules/import-meta.js new file mode 100644 index 00000000000000..cdaa5035d7ef4e --- /dev/null +++ b/packages/vite/src/node/ssr/__tests__/fixtures/modules/import-meta.js @@ -0,0 +1,2 @@ +export const dirname = import.meta.dirname +export const filename = import.meta.filename diff --git a/packages/vite/src/node/ssr/__tests__/ssrLoadModule.spec.ts b/packages/vite/src/node/ssr/__tests__/ssrLoadModule.spec.ts index 192b0b8cd3326f..b3f3c2364ef04b 100644 --- a/packages/vite/src/node/ssr/__tests__/ssrLoadModule.spec.ts +++ b/packages/vite/src/node/ssr/__tests__/ssrLoadModule.spec.ts @@ -52,3 +52,13 @@ test('error has same instance', async () => { expect(e[s]).toBe(true) } }) + +test('import.meta.filename/dirname returns same value with Node', async () => { + const server = await createDevServer() + const moduleRelativePath = '/fixtures/modules/import-meta.js' + const filename = path.resolve(root, '.' + moduleRelativePath) + + const viteValue = await server.ssrLoadModule(moduleRelativePath) + expect(viteValue.dirname).toBe(path.dirname(filename)) + expect(viteValue.filename).toBe(filename) +}) diff --git a/packages/vite/src/node/ssr/ssrModuleLoader.ts b/packages/vite/src/node/ssr/ssrModuleLoader.ts index e836d1e5f5f788..1f67e5feb8c23a 100644 --- a/packages/vite/src/node/ssr/ssrModuleLoader.ts +++ b/packages/vite/src/node/ssr/ssrModuleLoader.ts @@ -2,7 +2,13 @@ import path from 'node:path' import { pathToFileURL } from 'node:url' import colors from 'picocolors' import type { ViteDevServer } from '../server' -import { isBuiltin, isExternalUrl, isFilePathESM, unwrapId } from '../utils' +import { + isBuiltin, + isExternalUrl, + isFilePathESM, + isWindows, + unwrapId, +} from '../utils' import { transformRequest } from '../server/transformRequest' import type { InternalResolveOptionsWithOverrideConditions } from '../plugins/resolve' import { tryNodeResolve } from '../plugins/resolve' @@ -127,7 +133,12 @@ async function instantiateModule( // referenced before it's been instantiated. mod.ssrModule = ssrModule + // replace '/' with '\\' on Windows to match Node.js + const osNormalizedFilename = isWindows ? path.resolve(mod.file!) : mod.file! + const ssrImportMeta = { + dirname: path.dirname(osNormalizedFilename), + filename: osNormalizedFilename, // The filesystem URL, matching native Node.js modules url: pathToFileURL(mod.file!).toString(), } From 69e228980e33b736f5b23d351085fc6146dcaac1 Mon Sep 17 00:00:00 2001 From: bluwy Date: Tue, 12 Mar 2024 22:06:47 +0800 Subject: [PATCH 2/2] chore: fix --- packages/vite/src/node/ssr/ssrModuleLoader.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/vite/src/node/ssr/ssrModuleLoader.ts b/packages/vite/src/node/ssr/ssrModuleLoader.ts index 5cd54cf79e119b..186922ff84c40b 100644 --- a/packages/vite/src/node/ssr/ssrModuleLoader.ts +++ b/packages/vite/src/node/ssr/ssrModuleLoader.ts @@ -2,7 +2,7 @@ import path from 'node:path' import { pathToFileURL } from 'node:url' import colors from 'picocolors' import type { ViteDevServer } from '../server' -import { isBuiltin, isExternalUrl, isFilePathESM, isWindows } from '../utils' +import { isBuiltin, isExternalUrl, isFilePathESM } from '../utils' import { transformRequest } from '../server/transformRequest' import type { InternalResolveOptionsWithOverrideConditions } from '../plugins/resolve' import { tryNodeResolve } from '../plugins/resolve' @@ -10,6 +10,7 @@ import { genSourceMapUrl } from '../server/sourcemap' import { AsyncFunction, asyncFunctionDeclarationPaddingLineCount, + isWindows, unwrapId, } from '../../shared/utils' import {