Skip to content

Commit efc5eab

Browse files
authored
fix(optimizer): return plain object when using require to import externals in optimized dependencies (#19940)
1 parent 6d0f01e commit efc5eab

File tree

10 files changed

+70
-2
lines changed

10 files changed

+70
-2
lines changed

packages/vite/src/node/optimizer/esbuildDepPlugin.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ export function esbuildCjsExternalPlugin(
339339
contents:
340340
`import * as m from ${JSON.stringify(
341341
nonFacadePrefix + args.path,
342-
)};` + `module.exports = m;`,
342+
)};` + `module.exports = { ...m };`,
343343
}),
344344
)
345345
},

playground/optimize-deps/__tests__/optimize-deps.spec.ts

+6
Original file line numberDiff line numberDiff line change
@@ -352,3 +352,9 @@ test('external package name with asset extension', async () => {
352352
page.textContent('.dep-with-asset-ext-prebundled'),
353353
).toBe(String(isServe))
354354
})
355+
356+
test('dependency with external sub-dependency', async () => {
357+
await expectWithRetry(() =>
358+
page.textContent('.dep-cjs-with-external-dep'),
359+
).toBe('ok')
360+
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
const external = require('@vitejs/test-dep-esm-external')
2+
// eslint-disable-next-line no-prototype-builtins
3+
const result = external.hasOwnProperty('foo') ? 'ok' : 'error'
4+
module.exports = { result }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"name": "@vitejs/test-dep-cjs-with-external-dep",
3+
"private": true,
4+
"version": "0.0.0",
5+
"main": "index.js",
6+
"dependencies": {
7+
"@vitejs/test-dep-esm-external": "file:../dep-esm-external"
8+
}
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export function foo() {
2+
return 'foo'
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"name": "@vitejs/test-dep-esm-external",
3+
"private": true,
4+
"version": "0.0.0",
5+
"main": "index.js",
6+
"type": "module"
7+
}

playground/optimize-deps/index.html

+10
Original file line numberDiff line numberDiff line change
@@ -305,3 +305,13 @@ <h2>Pre-bundle transitive dependency 'some-package.pdf'</h2>
305305
import * as sub from '@vitejs/test-dep-source-map-no-sources/sub.js'
306306
import * as all from '@vitejs/test-dep-source-map-no-sources/all.js'
307307
</script>
308+
309+
<h2>Pre-bundle dependency with external sub-dependency</h2>
310+
<div>
311+
require('some-external-sub-dependency') returns a plain object:
312+
<span class="dep-cjs-with-external-dep">???</span>
313+
</div>
314+
<script type="module">
315+
import * as optimized from '@vitejs/test-dep-cjs-with-external-dep'
316+
text('.dep-cjs-with-external-dep', optimized.result)
317+
</script>

playground/optimize-deps/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"@vitejs/test-dep-cjs-compiled-from-cjs": "file:./dep-cjs-compiled-from-cjs",
1919
"@vitejs/test-dep-cjs-compiled-from-esm": "file:./dep-cjs-compiled-from-esm",
2020
"@vitejs/test-dep-cjs-with-assets": "file:./dep-cjs-with-assets",
21+
"@vitejs/test-dep-cjs-with-external-dep": "file:./dep-cjs-with-external-dep",
2122
"@vitejs/test-dep-css-require": "file:./dep-css-require",
2223
"@vitejs/test-dep-esbuild-plugin-transform": "file:./dep-esbuild-plugin-transform",
2324
"@vitejs/test-dep-incompatible": "file:./dep-incompatible",

playground/optimize-deps/vite.config.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,13 @@ export default defineConfig({
2323
'@vitejs/test-dep-optimize-exports-with-glob/**/*',
2424
'@vitejs/test-dep-optimize-exports-with-root-glob/**/*.js',
2525
'@vitejs/test-dep-optimize-with-glob/**/*.js',
26+
'@vitejs/test-dep-cjs-with-external-dep',
27+
],
28+
exclude: [
29+
'@vitejs/test-nested-exclude',
30+
'@vitejs/test-dep-non-optimized',
31+
'@vitejs/test-dep-esm-external',
2632
],
27-
exclude: ['@vitejs/test-nested-exclude', '@vitejs/test-dep-non-optimized'],
2833
esbuildOptions: {
2934
plugins: [
3035
{

pnpm-lock.yaml

+23
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)