From 29afc3c5a89d1ac7f6a0f080559074f56a33da7b Mon Sep 17 00:00:00 2001 From: FinalAshen <819712530@qq.com> Date: Tue, 16 Apr 2024 17:43:07 +0800 Subject: [PATCH 1/4] fix: default imported interop is synchronized with rollup --- packages/vite/src/node/__tests__/plugins/import.spec.ts | 8 ++++---- packages/vite/src/node/plugins/importAnalysis.ts | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/vite/src/node/__tests__/plugins/import.spec.ts b/packages/vite/src/node/__tests__/plugins/import.spec.ts index fb9ae3b132325c..7a6197ec285338 100644 --- a/packages/vite/src/node/__tests__/plugins/import.spec.ts +++ b/packages/vite/src/node/__tests__/plugins/import.spec.ts @@ -44,7 +44,7 @@ describe('transformCjsImport', () => { ), ).toBe( 'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' + - 'const React = __vite__cjsImport0_react.__esModule ? __vite__cjsImport0_react.default : __vite__cjsImport0_react', + 'const React = __vite__cjsImport0_react.__esModule && Object.prototype.hasOwnProperty.call(__vite__cjsImport0_react, "default") ? __vite__cjsImport0_react.default : __vite__cjsImport0_react', ) expect( @@ -58,7 +58,7 @@ describe('transformCjsImport', () => { ), ).toBe( 'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' + - 'const React = __vite__cjsImport0_react.__esModule ? __vite__cjsImport0_react.default : __vite__cjsImport0_react', + 'const React = __vite__cjsImport0_react.__esModule && Object.prototype.hasOwnProperty.call(__vite__cjsImport0_react, "default") ? __vite__cjsImport0_react.default : __vite__cjsImport0_react', ) }) @@ -154,7 +154,7 @@ describe('transformCjsImport', () => { ), ).toBe( 'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' + - 'const __vite__cjsExportDefault_0 = __vite__cjsImport0_react.__esModule ? __vite__cjsImport0_react.default : __vite__cjsImport0_react; ' + + 'const __vite__cjsExportDefault_0 = __vite__cjsImport0_react.__esModule && Object.prototype.hasOwnProperty.call(__vite__cjsImport0_react, "default") ? __vite__cjsImport0_react.default : __vite__cjsImport0_react; ' + 'export default __vite__cjsExportDefault_0', ) @@ -169,7 +169,7 @@ describe('transformCjsImport', () => { ), ).toBe( 'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' + - 'const __vite__cjsExport_React = __vite__cjsImport0_react.__esModule ? __vite__cjsImport0_react.default : __vite__cjsImport0_react; ' + + 'const __vite__cjsExport_React = __vite__cjsImport0_react.__esModule && Object.prototype.hasOwnProperty.call(__vite__cjsImport0_react, "default") ? __vite__cjsImport0_react.default : __vite__cjsImport0_react; ' + 'export { __vite__cjsExport_React as React }', ) diff --git a/packages/vite/src/node/plugins/importAnalysis.ts b/packages/vite/src/node/plugins/importAnalysis.ts index a4c1b9fd38a033..77516e131e66c6 100644 --- a/packages/vite/src/node/plugins/importAnalysis.ts +++ b/packages/vite/src/node/plugins/importAnalysis.ts @@ -1010,7 +1010,7 @@ export function transformCjsImport( ) } else if (importedName === 'default') { lines.push( - `const ${localName} = ${cjsModuleName}.__esModule ? ${cjsModuleName}.default : ${cjsModuleName}`, + `const ${localName} = ${cjsModuleName}.__esModule && Object.prototype.hasOwnProperty.call(${cjsModuleName}, "default") ? ${cjsModuleName}.default : ${cjsModuleName}`, ) } else { lines.push(`const ${localName} = ${cjsModuleName}["${importedName}"]`) From 88c5039a25ff3e25b431ae83cdaf12497545460f Mon Sep 17 00:00:00 2001 From: FinalAshen <819712530@qq.com> Date: Thu, 18 Apr 2024 13:54:09 +0800 Subject: [PATCH 2/4] chore: add default import to cjs module with esmodule tag --- playground/optimize-deps/cjs.js | 5 +++-- .../optimize-deps/dep-cjs-with-es-module/index.js | 4 ++++ .../optimize-deps/dep-cjs-with-es-module/package.json | 5 +++++ playground/optimize-deps/index.html | 2 ++ playground/optimize-deps/package.json | 1 + playground/optimize-deps/vite.config.js | 1 + pnpm-lock.yaml | 10 ++++++++++ 7 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 playground/optimize-deps/dep-cjs-with-es-module/index.js create mode 100644 playground/optimize-deps/dep-cjs-with-es-module/package.json diff --git a/playground/optimize-deps/cjs.js b/playground/optimize-deps/cjs.js index ba3e0aa783e69c..ee46b971feef01 100644 --- a/playground/optimize-deps/cjs.js +++ b/playground/optimize-deps/cjs.js @@ -5,8 +5,7 @@ import React, { useState } from 'react' import ReactDOM from 'react-dom/client' import { Socket } from 'phoenix' import clip from 'clipboard' - -// Test exporting a name that was already imported +import m from '@vitejs/test-dep-cjs-with-es-module' export { useState } from 'react' export { useState as anotherNameForUseState } from 'react' export { default as React } from 'react' @@ -19,6 +18,8 @@ if (typeof Socket === 'function') { text('.cjs-phoenix', 'ok') } +text('.cjs-with-es-module', m.info) + function App() { const [count, setCount] = useState(0) diff --git a/playground/optimize-deps/dep-cjs-with-es-module/index.js b/playground/optimize-deps/dep-cjs-with-es-module/index.js new file mode 100644 index 00000000000000..4b006a74d82270 --- /dev/null +++ b/playground/optimize-deps/dep-cjs-with-es-module/index.js @@ -0,0 +1,4 @@ +module.exports = { + __esModule: true, + info: 'ok', +} diff --git a/playground/optimize-deps/dep-cjs-with-es-module/package.json b/playground/optimize-deps/dep-cjs-with-es-module/package.json new file mode 100644 index 00000000000000..92c9aecb49513b --- /dev/null +++ b/playground/optimize-deps/dep-cjs-with-es-module/package.json @@ -0,0 +1,5 @@ +{ + "name": "@vitejs/test-dep-cjs-with-es-module", + "version": "1.0.0", + "main": "index.js" +} diff --git a/playground/optimize-deps/index.html b/playground/optimize-deps/index.html index 9b992b7dd4892a..d969f0b72e4085 100644 --- a/playground/optimize-deps/index.html +++ b/playground/optimize-deps/index.html @@ -6,6 +6,8 @@

CommonJS w/ named imports (phoenix)

fail

CommonJS w/ default export (clipboard)

fail
+

CommonJS w/ default export (dep-cjs-with-es-module)

+
fail
diff --git a/playground/optimize-deps/package.json b/playground/optimize-deps/package.json index e5f8d8a22dfcef..adfe81194a9ced 100644 --- a/playground/optimize-deps/package.json +++ b/playground/optimize-deps/package.json @@ -36,6 +36,7 @@ "@vitejs/test-dep-with-optional-peer-dep-submodule": "file:./dep-with-optional-peer-dep-submodule", "@vitejs/test-dep-non-optimized": "file:./dep-non-optimized", "@vitejs/test-added-in-entries": "file:./added-in-entries", + "@vitejs/test-dep-cjs-with-es-module": "file:./dep-cjs-with-es-module", "lodash-es": "^4.17.21", "@vitejs/test-nested-exclude": "file:./nested-exclude", "phoenix": "^1.7.11", diff --git a/playground/optimize-deps/vite.config.js b/playground/optimize-deps/vite.config.js index a2c2fdf3c6d5e7..c8f6ee103b801e 100644 --- a/playground/optimize-deps/vite.config.js +++ b/playground/optimize-deps/vite.config.js @@ -22,6 +22,7 @@ export default defineConfig({ '@vitejs/test-dep-optimize-exports-with-glob/**/*', '@vitejs/test-dep-optimize-exports-with-root-glob/**/*.js', '@vitejs/test-dep-optimize-with-glob/**/*.js', + '@vitejs/test-dep-cjs-with-es-module', ], exclude: ['@vitejs/test-nested-exclude', '@vitejs/test-dep-non-optimized'], esbuildOptions: { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 603da0897e4f80..57c33046da9e5f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -906,6 +906,9 @@ importers: '@vitejs/test-dep-cjs-with-assets': specifier: file:./dep-cjs-with-assets version: file:playground/optimize-deps/dep-cjs-with-assets + '@vitejs/test-dep-cjs-with-es-module': + specifier: file:./dep-cjs-with-es-module + version: file:playground/optimize-deps/dep-cjs-with-es-module '@vitejs/test-dep-css-require': specifier: file:./dep-css-require version: file:playground/optimize-deps/dep-css-require @@ -1027,6 +1030,8 @@ importers: playground/optimize-deps/dep-cjs-with-assets: {} + playground/optimize-deps/dep-cjs-with-es-module: {} + playground/optimize-deps/dep-css-require: {} playground/optimize-deps/dep-esbuild-plugin-transform: {} @@ -10572,6 +10577,11 @@ packages: name: '@vitejs/test-dep-cjs-with-assets' dev: false + file:playground/optimize-deps/dep-cjs-with-es-module: + resolution: {directory: playground/optimize-deps/dep-cjs-with-es-module, type: directory} + name: '@vitejs/test-dep-cjs-with-es-module' + dev: false + file:playground/optimize-deps/dep-css-require: resolution: {directory: playground/optimize-deps/dep-css-require, type: directory} name: '@vitejs/test-dep-css-require' From 25908a55ce2b81bf939792a04a8c3853f885dea0 Mon Sep 17 00:00:00 2001 From: FinalAshen <819712530@qq.com> Date: Thu, 18 Apr 2024 13:58:45 +0800 Subject: [PATCH 3/4] fix: add namespace import and dynamic import scenarios --- packages/vite/src/node/plugins/importAnalysis.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vite/src/node/plugins/importAnalysis.ts b/packages/vite/src/node/plugins/importAnalysis.ts index 77516e131e66c6..99b630823ae84c 100644 --- a/packages/vite/src/node/plugins/importAnalysis.ts +++ b/packages/vite/src/node/plugins/importAnalysis.ts @@ -845,7 +845,7 @@ export function createParseErrorInfo( } } // prettier-ignore -const interopHelper = (m: any) => m?.__esModule ? m : { ...(typeof m === 'object' && !Array.isArray(m) || typeof m === 'function' ? m : {}), default: m } +const interopHelper = (m: any) => m?.__esModule && Object.prototype.hasOwnProperty.call(m, 'default') ? m : { ...(typeof m === 'object' && !Array.isArray(m) || typeof m === 'function' ? m : {}), default: m } export function interopNamedImports( str: MagicString, From aeaf129312c94b2d87f3f06c0dbcc5a140111527 Mon Sep 17 00:00:00 2001 From: FinalAshen <819712530@qq.com> Date: Thu, 18 Apr 2024 14:19:01 +0800 Subject: [PATCH 4/4] chore: add dynamic import test --- .../vite/src/node/__tests__/plugins/import.spec.ts | 2 +- playground/optimize-deps/cjs-dynamic.js | 9 +++++++++ playground/optimize-deps/cjs.js | 5 +++-- .../index.js | 0 .../dep-cjs-with-es-module-flag/package.json | 5 +++++ .../dep-cjs-with-es-module/package.json | 5 ----- playground/optimize-deps/index.html | 6 ++++-- playground/optimize-deps/package.json | 2 +- playground/optimize-deps/vite.config.js | 2 +- pnpm-lock.yaml | 14 +++++++------- 10 files changed, 31 insertions(+), 19 deletions(-) rename playground/optimize-deps/{dep-cjs-with-es-module => dep-cjs-with-es-module-flag}/index.js (100%) create mode 100644 playground/optimize-deps/dep-cjs-with-es-module-flag/package.json delete mode 100644 playground/optimize-deps/dep-cjs-with-es-module/package.json diff --git a/packages/vite/src/node/__tests__/plugins/import.spec.ts b/packages/vite/src/node/__tests__/plugins/import.spec.ts index 7a6197ec285338..38349ad2f59274 100644 --- a/packages/vite/src/node/__tests__/plugins/import.spec.ts +++ b/packages/vite/src/node/__tests__/plugins/import.spec.ts @@ -74,7 +74,7 @@ describe('transformCjsImport', () => { ), ).toBe( 'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' + - `const react = ((m) => m?.__esModule ? m : { ...typeof m === "object" && !Array.isArray(m) || typeof m === "function" ? m : {}, default: m })(__vite__cjsImport0_react)`, + `const react = ((m) => m?.__esModule && Object.prototype.hasOwnProperty.call(m, "default") ? m : { ...typeof m === "object" && !Array.isArray(m) || typeof m === "function" ? m : {}, default: m })(__vite__cjsImport0_react)`, ) }) diff --git a/playground/optimize-deps/cjs-dynamic.js b/playground/optimize-deps/cjs-dynamic.js index b75e4c2d0ba118..aa2585cc1b3647 100644 --- a/playground/optimize-deps/cjs-dynamic.js +++ b/playground/optimize-deps/cjs-dynamic.js @@ -28,6 +28,15 @@ text('.cjs-dynamic-dep-cjs-compiled-from-cjs', 'ok') } + const cjsWithEsModuleTag = await import( + '@vitejs/test-dep-cjs-with-es-module-flag' + ) + console.log('cjsWithEsModuleTag', cjsWithEsModuleTag) + text( + '.cjs-dynamic-dep-cjs-with-es-module-flag', + cjsWithEsModuleTag.default.info, + ) + function App() { const [count, setCount] = useState(0) diff --git a/playground/optimize-deps/cjs.js b/playground/optimize-deps/cjs.js index ee46b971feef01..5d24ac52affe6e 100644 --- a/playground/optimize-deps/cjs.js +++ b/playground/optimize-deps/cjs.js @@ -5,7 +5,8 @@ import React, { useState } from 'react' import ReactDOM from 'react-dom/client' import { Socket } from 'phoenix' import clip from 'clipboard' -import m from '@vitejs/test-dep-cjs-with-es-module' +import m from '@vitejs/test-dep-cjs-with-es-module-flag' +// Test exporting a name that was already imported export { useState } from 'react' export { useState as anotherNameForUseState } from 'react' export { default as React } from 'react' @@ -18,7 +19,7 @@ if (typeof Socket === 'function') { text('.cjs-phoenix', 'ok') } -text('.cjs-with-es-module', m.info) +text('.cjs-with-es-module-flag', m.info) function App() { const [count, setCount] = useState(0) diff --git a/playground/optimize-deps/dep-cjs-with-es-module/index.js b/playground/optimize-deps/dep-cjs-with-es-module-flag/index.js similarity index 100% rename from playground/optimize-deps/dep-cjs-with-es-module/index.js rename to playground/optimize-deps/dep-cjs-with-es-module-flag/index.js diff --git a/playground/optimize-deps/dep-cjs-with-es-module-flag/package.json b/playground/optimize-deps/dep-cjs-with-es-module-flag/package.json new file mode 100644 index 00000000000000..d17358e7152afe --- /dev/null +++ b/playground/optimize-deps/dep-cjs-with-es-module-flag/package.json @@ -0,0 +1,5 @@ +{ + "name": "@vitejs/test-dep-cjs-with-es-module-flag", + "version": "1.0.0", + "main": "index.js" +} diff --git a/playground/optimize-deps/dep-cjs-with-es-module/package.json b/playground/optimize-deps/dep-cjs-with-es-module/package.json deleted file mode 100644 index 92c9aecb49513b..00000000000000 --- a/playground/optimize-deps/dep-cjs-with-es-module/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "@vitejs/test-dep-cjs-with-es-module", - "version": "1.0.0", - "main": "index.js" -} diff --git a/playground/optimize-deps/index.html b/playground/optimize-deps/index.html index d969f0b72e4085..01bf85354694fc 100644 --- a/playground/optimize-deps/index.html +++ b/playground/optimize-deps/index.html @@ -6,8 +6,8 @@

CommonJS w/ named imports (phoenix)

fail

CommonJS w/ default export (clipboard)

fail
-

CommonJS w/ default export (dep-cjs-with-es-module)

-
fail
+

CommonJS w/ default export (dep-cjs-with-es-module-flag)

+
fail
@@ -21,6 +21,8 @@

CommonJS dynamic import default (dep-cjs-compiled-from-esm)

CommonJS dynamic import default (dep-cjs-compiled-from-cjs)

+

CommonJS dynamic import default (dep-cjs-with-es-module-flag)

+
diff --git a/playground/optimize-deps/package.json b/playground/optimize-deps/package.json index adfe81194a9ced..967e7bd8ecb93d 100644 --- a/playground/optimize-deps/package.json +++ b/playground/optimize-deps/package.json @@ -36,7 +36,7 @@ "@vitejs/test-dep-with-optional-peer-dep-submodule": "file:./dep-with-optional-peer-dep-submodule", "@vitejs/test-dep-non-optimized": "file:./dep-non-optimized", "@vitejs/test-added-in-entries": "file:./added-in-entries", - "@vitejs/test-dep-cjs-with-es-module": "file:./dep-cjs-with-es-module", + "@vitejs/test-dep-cjs-with-es-module-flag": "file:./dep-cjs-with-es-module-flag", "lodash-es": "^4.17.21", "@vitejs/test-nested-exclude": "file:./nested-exclude", "phoenix": "^1.7.11", diff --git a/playground/optimize-deps/vite.config.js b/playground/optimize-deps/vite.config.js index c8f6ee103b801e..c717db43324e32 100644 --- a/playground/optimize-deps/vite.config.js +++ b/playground/optimize-deps/vite.config.js @@ -22,7 +22,7 @@ export default defineConfig({ '@vitejs/test-dep-optimize-exports-with-glob/**/*', '@vitejs/test-dep-optimize-exports-with-root-glob/**/*.js', '@vitejs/test-dep-optimize-with-glob/**/*.js', - '@vitejs/test-dep-cjs-with-es-module', + '@vitejs/test-dep-cjs-with-es-module-flag', ], exclude: ['@vitejs/test-nested-exclude', '@vitejs/test-dep-non-optimized'], esbuildOptions: { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 57c33046da9e5f..d90ce26caca168 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -906,9 +906,9 @@ importers: '@vitejs/test-dep-cjs-with-assets': specifier: file:./dep-cjs-with-assets version: file:playground/optimize-deps/dep-cjs-with-assets - '@vitejs/test-dep-cjs-with-es-module': - specifier: file:./dep-cjs-with-es-module - version: file:playground/optimize-deps/dep-cjs-with-es-module + '@vitejs/test-dep-cjs-with-es-module-flag': + specifier: file:./dep-cjs-with-es-module-flag + version: file:playground/optimize-deps/dep-cjs-with-es-module-flag '@vitejs/test-dep-css-require': specifier: file:./dep-css-require version: file:playground/optimize-deps/dep-css-require @@ -1030,7 +1030,7 @@ importers: playground/optimize-deps/dep-cjs-with-assets: {} - playground/optimize-deps/dep-cjs-with-es-module: {} + playground/optimize-deps/dep-cjs-with-es-module-flag: {} playground/optimize-deps/dep-css-require: {} @@ -10577,9 +10577,9 @@ packages: name: '@vitejs/test-dep-cjs-with-assets' dev: false - file:playground/optimize-deps/dep-cjs-with-es-module: - resolution: {directory: playground/optimize-deps/dep-cjs-with-es-module, type: directory} - name: '@vitejs/test-dep-cjs-with-es-module' + file:playground/optimize-deps/dep-cjs-with-es-module-flag: + resolution: {directory: playground/optimize-deps/dep-cjs-with-es-module-flag, type: directory} + name: '@vitejs/test-dep-cjs-with-es-module-flag' dev: false file:playground/optimize-deps/dep-css-require: