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