From 9e51a76b3fce27cb0a4a4ae558c4499e9dd540cd Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Mon, 13 Sep 2021 19:42:10 +0800 Subject: [PATCH] feat(ssr): exports `dynamicDeps` for ssrTransform, close #4898 (#4909) --- .../vite/src/node/server/transformRequest.ts | 1 + .../node/ssr/__tests__/ssrTransform.spec.ts | 44 +++++++++---------- packages/vite/src/node/ssr/ssrTransform.ts | 7 ++- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/packages/vite/src/node/server/transformRequest.ts b/packages/vite/src/node/server/transformRequest.ts index 483df46d06e6e5..0a332c986adeff 100644 --- a/packages/vite/src/node/server/transformRequest.ts +++ b/packages/vite/src/node/server/transformRequest.ts @@ -29,6 +29,7 @@ export interface TransformResult { map: SourceMap | null etag?: string deps?: string[] + dynamicDeps?: string[] } export interface TransformOptions { diff --git a/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts b/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts index d3320a06a9429e..df206c2dfe9da4 100644 --- a/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts +++ b/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts @@ -149,43 +149,43 @@ test('import.meta', async () => { }) test('dynamic import', async () => { - expect( - (await ssrTransform(`export const i = () => import('./foo')`, null, null)) - .code - ).toMatchInlineSnapshot(` + const result = await ssrTransform( + `export const i = () => import('./foo')`, + null, + null + ) + expect(result.code).toMatchInlineSnapshot(` "const i = () => __vite_ssr_dynamic_import__('./foo') Object.defineProperty(__vite_ssr_exports__, \\"i\\", { enumerable: true, configurable: true, get(){ return i }});" `) + expect(result.deps).toEqual([]) + expect(result.dynamicDeps).toEqual(['./foo']) }) test('do not rewrite method definition', async () => { - expect( - ( - await ssrTransform( - `import { fn } from 'vue';class A { fn() { fn() } }`, - null, - null - ) - ).code - ).toMatchInlineSnapshot(` + const result = await ssrTransform( + `import { fn } from 'vue';class A { fn() { fn() } }`, + null, + null + ) + expect(result.code).toMatchInlineSnapshot(` "const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"vue\\"); class A { fn() { __vite_ssr_import_0__.fn() } }" `) + expect(result.deps).toEqual(['vue']) }) test('do not rewrite catch clause', async () => { - expect( - ( - await ssrTransform( - `import {error} from './dependency';try {} catch(error) {}`, - null, - null - ) - ).code - ).toMatchInlineSnapshot(` + const result = await ssrTransform( + `import {error} from './dependency';try {} catch(error) {}`, + null, + null + ) + expect(result.code).toMatchInlineSnapshot(` "const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"./dependency\\"); try {} catch(error) {}" `) + expect(result.deps).toEqual(['./dependency']) }) // #2221 diff --git a/packages/vite/src/node/ssr/ssrTransform.ts b/packages/vite/src/node/ssr/ssrTransform.ts index c5d87e8c9c6fc5..c406e00efb84f4 100644 --- a/packages/vite/src/node/ssr/ssrTransform.ts +++ b/packages/vite/src/node/ssr/ssrTransform.ts @@ -39,6 +39,7 @@ export async function ssrTransform( let uid = 0 const deps = new Set() + const dynamicDeps = new Set() const idToImportMap = new Map() const declaredConst = new Set() @@ -200,6 +201,9 @@ export async function ssrTransform( }, onDynamicImport(node) { s.overwrite(node.start, node.start + 6, ssrDynamicImportKey) + if (node.type === 'ImportExpression' && node.source.type === 'Literal') { + dynamicDeps.add(node.source.value as string) + } } }) @@ -221,7 +225,8 @@ export async function ssrTransform( return { code: s.toString(), map, - deps: [...deps] + deps: [...deps], + dynamicDeps: [...dynamicDeps] } }