From 269a1b672bf954ed68d19d4541b9bdb471fc1937 Mon Sep 17 00:00:00 2001 From: ygj6 <7699524+ygj6@users.noreply.github.com> Date: Thu, 21 Oct 2021 14:24:28 +0800 Subject: [PATCH] fix: consider deep imports in isBuiltIn (#5248) --- .../playground/ssr-vue/__tests__/ssr-vue.spec.ts | 7 ++++++- packages/playground/ssr-vue/server.js | 2 +- packages/playground/ssr-vue/src/entry-server.js | 13 +++++++++++-- packages/playground/ssr-vue/src/message | 1 + packages/vite/src/node/utils.ts | 2 ++ 5 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 packages/playground/ssr-vue/src/message diff --git a/packages/playground/ssr-vue/__tests__/ssr-vue.spec.ts b/packages/playground/ssr-vue/__tests__/ssr-vue.spec.ts index f0ab340bc0ae4b..2cba97340b215c 100644 --- a/packages/playground/ssr-vue/__tests__/ssr-vue.spec.ts +++ b/packages/playground/ssr-vue/__tests__/ssr-vue.spec.ts @@ -146,4 +146,9 @@ test('client navigation', async () => { test('import.meta.url', async () => { await page.goto(url) expect(await page.textContent('.protocol')).toEqual('file:') -}) \ No newline at end of file +}) + +test('deep import built-in module', async () => { + await page.goto(url) + expect(await page.textContent('.file-message')).toMatch('fs/promises') +}) diff --git a/packages/playground/ssr-vue/server.js b/packages/playground/ssr-vue/server.js index 642f274647294f..c10803b45ceef1 100644 --- a/packages/playground/ssr-vue/server.js +++ b/packages/playground/ssr-vue/server.js @@ -66,7 +66,7 @@ async function createServer( render = require('./dist/server/entry-server.js').render } - const [appHtml, preloadLinks] = await render(url, manifest) + const [appHtml, preloadLinks] = await render(url, manifest, __dirname) const html = template .replace(``, preloadLinks) diff --git a/packages/playground/ssr-vue/src/entry-server.js b/packages/playground/ssr-vue/src/entry-server.js index b1a5b6770d7fe2..31c00870840b53 100644 --- a/packages/playground/ssr-vue/src/entry-server.js +++ b/packages/playground/ssr-vue/src/entry-server.js @@ -1,7 +1,8 @@ import { createApp } from './main' import { renderToString } from 'vue/server-renderer' +import path from 'path' -export async function render(url, manifest) { +export async function render(url, manifest, rootDir) { const { app, router } = createApp() // set the router to the desired URL before rendering @@ -13,7 +14,15 @@ export async function render(url, manifest) { // itself on ctx.modules. After the render, ctx.modules would contain all the // components that have been instantiated during this render call. const ctx = {} - const html = await renderToString(app, ctx) + let html = await renderToString(app, ctx) + + // for testing. Use deep import built-in module. PR #5248 + const fs = + process.versions.node.split('.')[0] >= '14' + ? await import('fs/promises') + : (await import('fs')).promises + const msg = await fs.readFile(path.resolve(rootDir, './src/message'), 'utf-8') + html += `

msg read via deep import built-in module: ${msg}

` // the SSR manifest generated by Vite contains module -> chunk/asset mapping // which we can then use to determine what files need to be preloaded for this diff --git a/packages/playground/ssr-vue/src/message b/packages/playground/ssr-vue/src/message new file mode 100644 index 00000000000000..b0e64506dadd78 --- /dev/null +++ b/packages/playground/ssr-vue/src/message @@ -0,0 +1 @@ +"fs/promises" diff --git a/packages/vite/src/node/utils.ts b/packages/vite/src/node/utils.ts index b23c774058572b..e1379e01000201 100644 --- a/packages/vite/src/node/utils.ts +++ b/packages/vite/src/node/utils.ts @@ -38,6 +38,8 @@ export const normalizeId = (id: string): string => id.replace(/(\s*>\s*)/g, ' > ') export function isBuiltin(id: string): boolean { + const deepMatch = id.match(deepImportRE) + id = deepMatch ? deepMatch[1] || deepMatch[2] : id return builtins.includes(id) }