Skip to content

Commit fafc7e2

Browse files
authored
fix(optimizer): don't externalize transitive dep package name with asset extension (#18152)
1 parent 460aaff commit fafc7e2

File tree

9 files changed

+78
-8
lines changed

9 files changed

+78
-8
lines changed

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

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import path from 'node:path'
22
import type { ImportKind, Plugin } from 'esbuild'
3-
import { KNOWN_ASSET_TYPES } from '../constants'
3+
import { JS_TYPES_RE, KNOWN_ASSET_TYPES } from '../constants'
44
import type { PackageCache } from '../packages'
55
import {
66
escapeRegex,
@@ -157,15 +157,17 @@ export function esbuildDepPlugin(
157157

158158
const resolved = await resolve(id, importer, kind)
159159
if (resolved) {
160-
if (kind === 'require-call') {
161-
// #16116 fix: Import the module.scss path, which is actually module.scss.js
162-
if (resolved.endsWith('.js')) {
163-
return {
164-
path: resolved,
165-
external: false,
166-
}
160+
// `resolved` can be javascript even when `id` matches `allExternalTypes`
161+
// due to cjs resolution (e.g. require("./test.pdf") for "./test.pdf.js")
162+
// or package name (e.g. import "some-package.pdf")
163+
if (JS_TYPES_RE.test(resolved)) {
164+
return {
165+
path: resolved,
166+
external: false,
167167
}
168+
}
168169

170+
if (kind === 'require-call') {
169171
// here it is not set to `external: true` to convert `require` to `import`
170172
return {
171173
path: resolved,

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,3 +343,12 @@ test('import the CommonJS external package that omits the js suffix', async () =
343343
page.textContent('.external-package-tsx-js'),
344344
).toBe('tsx')
345345
})
346+
347+
test('external package name with asset extension', async () => {
348+
await expectWithRetry(() =>
349+
page.textContent('.dep-with-asset-ext-no-dual-package'),
350+
).toBe('true')
351+
await expectWithRetry(() =>
352+
page.textContent('.dep-with-asset-ext-prebundled'),
353+
).toBe(String(isServe))
354+
})
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export default { random: Math.random() }
2+
3+
export const isPreBundled = import.meta.url.includes('/.vite/deps/')
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"name": "@vitejs/test-dep-with-asset-ext1.pdf",
3+
"private": true,
4+
"type": "module",
5+
"exports": "./index.mjs"
6+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default } from '@vitejs/test-dep-with-asset-ext1.pdf'
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"name": "@vitejs/test-dep-with-asset-ext2.pdf",
3+
"private": true,
4+
"type": "module",
5+
"exports": "./index.js",
6+
"dependencies": {
7+
"@vitejs/test-dep-with-asset-ext1.pdf": "file:../dep1"
8+
}
9+
}

playground/optimize-deps/index.html

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,3 +287,15 @@ <h2>Import the CommonJS external package that omits the js suffix</h2>
287287
import loadSub from '@vitejs/test-dep-incompatible'
288288
loadSub() // should show an error that tells there's an incompatible dep
289289
</script>
290+
291+
<h2>Pre-bundle transitive dependency 'some-package.pdf'</h2>
292+
<div>prebundled: <span class="dep-with-asset-ext-prebundled">???</span></div>
293+
<div>
294+
no dual package: <span class="dep-with-asset-ext-no-dual-package">???</span>
295+
</div>
296+
<script type="module">
297+
import original, { isPreBundled } from '@vitejs/test-dep-with-asset-ext1.pdf'
298+
import reexport from '@vitejs/test-dep-with-asset-ext2.pdf'
299+
text('.dep-with-asset-ext-prebundled', isPreBundled)
300+
text('.dep-with-asset-ext-no-dual-package', original === reexport)
301+
</script>

playground/optimize-deps/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
"@vitejs/test-dep-optimize-exports-with-root-glob": "file:./dep-optimize-exports-with-root-glob",
3030
"@vitejs/test-dep-optimize-with-glob": "file:./dep-optimize-with-glob",
3131
"@vitejs/test-dep-relative-to-main": "file:./dep-relative-to-main",
32+
"@vitejs/test-dep-with-asset-ext1.pdf": "file:./dep-with-asset-ext/dep1",
33+
"@vitejs/test-dep-with-asset-ext2.pdf": "file:./dep-with-asset-ext/dep2",
3234
"@vitejs/test-dep-with-builtin-module-cjs": "file:./dep-with-builtin-module-cjs",
3335
"@vitejs/test-dep-with-builtin-module-esm": "file:./dep-with-builtin-module-esm",
3436
"@vitejs/test-dep-with-dynamic-import": "file:./dep-with-dynamic-import",

pnpm-lock.yaml

Lines changed: 26 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)