diff --git a/packages/vite/src/node/optimizer/esbuildDepPlugin.ts b/packages/vite/src/node/optimizer/esbuildDepPlugin.ts index 7b065cbb0a8ea0..482af0e4a0cbed 100644 --- a/packages/vite/src/node/optimizer/esbuildDepPlugin.ts +++ b/packages/vite/src/node/optimizer/esbuildDepPlugin.ts @@ -339,7 +339,7 @@ export function esbuildCjsExternalPlugin( contents: `import * as m from ${JSON.stringify( nonFacadePrefix + args.path, - )};` + `module.exports = m;`, + )};` + `module.exports = { ...m };`, }), ) }, diff --git a/playground/optimize-deps/__tests__/optimize-deps.spec.ts b/playground/optimize-deps/__tests__/optimize-deps.spec.ts index 83df0bebf4de08..f8f5a1623ace86 100644 --- a/playground/optimize-deps/__tests__/optimize-deps.spec.ts +++ b/playground/optimize-deps/__tests__/optimize-deps.spec.ts @@ -352,3 +352,9 @@ test('external package name with asset extension', async () => { page.textContent('.dep-with-asset-ext-prebundled'), ).toBe(String(isServe)) }) + +test('dependency with external sub-dependency', async () => { + await expectWithRetry(() => + page.textContent('.dep-cjs-with-external-dep'), + ).toBe('ok') +}) diff --git a/playground/optimize-deps/dep-cjs-with-external-dep/index.js b/playground/optimize-deps/dep-cjs-with-external-dep/index.js new file mode 100644 index 00000000000000..18b7d613194bae --- /dev/null +++ b/playground/optimize-deps/dep-cjs-with-external-dep/index.js @@ -0,0 +1,4 @@ +const external = require('@vitejs/test-dep-esm-external') +// eslint-disable-next-line no-prototype-builtins +const result = external.hasOwnProperty('foo') ? 'ok' : 'error' +module.exports = { result } diff --git a/playground/optimize-deps/dep-cjs-with-external-dep/package.json b/playground/optimize-deps/dep-cjs-with-external-dep/package.json new file mode 100644 index 00000000000000..39e8bf01d732d0 --- /dev/null +++ b/playground/optimize-deps/dep-cjs-with-external-dep/package.json @@ -0,0 +1,9 @@ +{ + "name": "@vitejs/test-dep-cjs-with-external-dep", + "private": true, + "version": "0.0.0", + "main": "index.js", + "dependencies": { + "@vitejs/test-dep-esm-external": "file:../dep-esm-external" + } +} diff --git a/playground/optimize-deps/dep-esm-external/index.js b/playground/optimize-deps/dep-esm-external/index.js new file mode 100644 index 00000000000000..6de1f5a8d64dcf --- /dev/null +++ b/playground/optimize-deps/dep-esm-external/index.js @@ -0,0 +1,3 @@ +export function foo() { + return 'foo' +} diff --git a/playground/optimize-deps/dep-esm-external/package.json b/playground/optimize-deps/dep-esm-external/package.json new file mode 100644 index 00000000000000..83cf0e23537ab5 --- /dev/null +++ b/playground/optimize-deps/dep-esm-external/package.json @@ -0,0 +1,7 @@ +{ + "name": "@vitejs/test-dep-esm-external", + "private": true, + "version": "0.0.0", + "main": "index.js", + "type": "module" +} diff --git a/playground/optimize-deps/index.html b/playground/optimize-deps/index.html index 02a869c4e5a8a7..84c7364cda4119 100644 --- a/playground/optimize-deps/index.html +++ b/playground/optimize-deps/index.html @@ -305,3 +305,13 @@

Pre-bundle transitive dependency 'some-package.pdf'

import * as sub from '@vitejs/test-dep-source-map-no-sources/sub.js' import * as all from '@vitejs/test-dep-source-map-no-sources/all.js' + +

Pre-bundle dependency with external sub-dependency

+
+ require('some-external-sub-dependency') returns a plain object: + ??? +
+ diff --git a/playground/optimize-deps/package.json b/playground/optimize-deps/package.json index 48d097460f4d31..80212dcf4da733 100644 --- a/playground/optimize-deps/package.json +++ b/playground/optimize-deps/package.json @@ -18,6 +18,7 @@ "@vitejs/test-dep-cjs-compiled-from-cjs": "file:./dep-cjs-compiled-from-cjs", "@vitejs/test-dep-cjs-compiled-from-esm": "file:./dep-cjs-compiled-from-esm", "@vitejs/test-dep-cjs-with-assets": "file:./dep-cjs-with-assets", + "@vitejs/test-dep-cjs-with-external-dep": "file:./dep-cjs-with-external-dep", "@vitejs/test-dep-css-require": "file:./dep-css-require", "@vitejs/test-dep-esbuild-plugin-transform": "file:./dep-esbuild-plugin-transform", "@vitejs/test-dep-incompatible": "file:./dep-incompatible", diff --git a/playground/optimize-deps/vite.config.js b/playground/optimize-deps/vite.config.js index 6ef09488556cc1..4e6f1c7fc16ecc 100644 --- a/playground/optimize-deps/vite.config.js +++ b/playground/optimize-deps/vite.config.js @@ -23,8 +23,13 @@ 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-external-dep', + ], + exclude: [ + '@vitejs/test-nested-exclude', + '@vitejs/test-dep-non-optimized', + '@vitejs/test-dep-esm-external', ], - exclude: ['@vitejs/test-nested-exclude', '@vitejs/test-dep-non-optimized'], esbuildOptions: { plugins: [ { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 15732dbbd3e179..e8d23d540fec1f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -969,6 +969,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-external-dep': + specifier: file:./dep-cjs-with-external-dep + version: file:playground/optimize-deps/dep-cjs-with-external-dep '@vitejs/test-dep-css-require': specifier: file:./dep-css-require version: file:playground/optimize-deps/dep-css-require @@ -1101,10 +1104,18 @@ importers: playground/optimize-deps/dep-cjs-with-assets: {} + playground/optimize-deps/dep-cjs-with-external-dep: + dependencies: + '@vitejs/test-dep-esm-external': + specifier: file:../dep-esm-external + version: file:playground/optimize-deps/dep-esm-external + playground/optimize-deps/dep-css-require: {} playground/optimize-deps/dep-esbuild-plugin-transform: {} + playground/optimize-deps/dep-esm-external: {} + playground/optimize-deps/dep-incompatible: {} playground/optimize-deps/dep-linked: @@ -3671,6 +3682,9 @@ packages: '@vitejs/test-dep-cjs-with-assets@file:playground/optimize-deps/dep-cjs-with-assets': resolution: {directory: playground/optimize-deps/dep-cjs-with-assets, type: directory} + '@vitejs/test-dep-cjs-with-external-dep@file:playground/optimize-deps/dep-cjs-with-external-dep': + resolution: {directory: playground/optimize-deps/dep-cjs-with-external-dep, type: directory} + '@vitejs/test-dep-conditions@file:packages/vite/src/node/__tests__/fixtures/test-dep-conditions': resolution: {directory: packages/vite/src/node/__tests__/fixtures/test-dep-conditions, type: directory} @@ -3680,6 +3694,9 @@ packages: '@vitejs/test-dep-esbuild-plugin-transform@file:playground/optimize-deps/dep-esbuild-plugin-transform': resolution: {directory: playground/optimize-deps/dep-esbuild-plugin-transform, type: directory} + '@vitejs/test-dep-esm-external@file:playground/optimize-deps/dep-esm-external': + resolution: {directory: playground/optimize-deps/dep-esm-external, type: directory} + '@vitejs/test-dep-including-a@file:playground/preload/dep-including-a': resolution: {directory: playground/preload/dep-including-a, type: directory} @@ -9570,12 +9587,18 @@ snapshots: '@vitejs/test-dep-cjs-with-assets@file:playground/optimize-deps/dep-cjs-with-assets': {} + '@vitejs/test-dep-cjs-with-external-dep@file:playground/optimize-deps/dep-cjs-with-external-dep': + dependencies: + '@vitejs/test-dep-esm-external': file:playground/optimize-deps/dep-esm-external + '@vitejs/test-dep-conditions@file:packages/vite/src/node/__tests__/fixtures/test-dep-conditions': {} '@vitejs/test-dep-css-require@file:playground/optimize-deps/dep-css-require': {} '@vitejs/test-dep-esbuild-plugin-transform@file:playground/optimize-deps/dep-esbuild-plugin-transform': {} + '@vitejs/test-dep-esm-external@file:playground/optimize-deps/dep-esm-external': {} + '@vitejs/test-dep-including-a@file:playground/preload/dep-including-a': dependencies: '@vitejs/test-dep-a': file:playground/preload/dep-a