Skip to content

Commit 4161843

Browse files
authored
fix(optimize-deps): don't externalize JS files imported with asset extensions (#16242)
1 parent e6a70b7 commit 4161843

File tree

12 files changed

+86
-0
lines changed

12 files changed

+86
-0
lines changed

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

+8
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,14 @@ export function esbuildDepPlugin(
155155
const resolved = await resolve(id, importer, kind)
156156
if (resolved) {
157157
if (kind === 'require-call') {
158+
// #16116 fix: Import the module.scss path, which is actually module.scss.js
159+
if (resolved.endsWith('.js')) {
160+
return {
161+
path: resolved,
162+
external: false,
163+
}
164+
}
165+
158166
// here it is not set to `external: true` to convert `require` to `import`
159167
return {
160168
path: resolved,

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

+15
Original file line numberDiff line numberDiff line change
@@ -331,3 +331,18 @@ test.runIf(isServe)('warn on incompatible dependency', () => {
331331
),
332332
)
333333
})
334+
335+
test('import the CommonJS external package that omits the js suffix', async () => {
336+
await expectWithRetry(() => page.textContent('.external-package-js')).toBe(
337+
'okay',
338+
)
339+
await expectWithRetry(() =>
340+
page.textContent('.external-package-scss-js'),
341+
).toBe('scss')
342+
await expectWithRetry(() =>
343+
page.textContent('.external-package-astro-js'),
344+
).toBe('astro')
345+
await expectWithRetry(() =>
346+
page.textContent('.external-package-tsx-js'),
347+
).toBe('tsx')
348+
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
const { okay } = require('./test.okay')
2+
const { scss } = require('./test.scss')
3+
const { astro } = require('./test.astro')
4+
const { tsx } = require('./test.tsx')
5+
6+
module.exports = { okay, scss, astro, tsx }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"name": "@vitejs/test-dep-cjs-external-package-omit-js-suffix",
3+
"private": true,
4+
"version": "0.0.0",
5+
"main": "index.js"
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
function astro() {
2+
return 'astro'
3+
}
4+
5+
module.exports = { astro }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
function okay() {
2+
return 'okay'
3+
}
4+
5+
module.exports = { okay }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
function scss() {
2+
return 'scss'
3+
}
4+
5+
module.exports = { scss }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
function tsx() {
2+
return 'tsx'
3+
}
4+
5+
module.exports = { tsx }

playground/optimize-deps/index.html

+19
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,25 @@ <h2>Long file name import works</h2>
110110

111111
<script type="module" src="./long-file-name.js"></script>
112112

113+
<h2>Import the CommonJS external package that omits the js suffix</h2>
114+
<div class="external-package-js"></div>
115+
<div class="external-package-scss-js"></div>
116+
<div class="external-package-astro-js"></div>
117+
<div class="external-package-tsx-js"></div>
118+
<script type="module">
119+
import {
120+
astro,
121+
okay,
122+
scss,
123+
tsx,
124+
} from '@vitejs/test-dep-cjs-external-package-omit-js-suffix'
125+
126+
text('.external-package-js', okay())
127+
text('.external-package-scss-js', scss())
128+
text('.external-package-astro-js', astro())
129+
text('.external-package-tsx-js', tsx())
130+
</script>
131+
113132
<script>
114133
function text(el, text) {
115134
document.querySelector(el).textContent = text

playground/optimize-deps/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
"@vitejs/test-dep-with-optional-peer-dep-submodule": "file:./dep-with-optional-peer-dep-submodule",
3737
"@vitejs/test-dep-non-optimized": "file:./dep-non-optimized",
3838
"@vitejs/test-added-in-entries": "file:./added-in-entries",
39+
"@vitejs/test-dep-cjs-external-package-omit-js-suffix": "file:./dep-cjs-external-package-omit-js-suffix",
3940
"lodash-es": "^4.17.21",
4041
"@vitejs/test-nested-exclude": "file:./nested-exclude",
4142
"phoenix": "^1.7.12",

playground/optimize-deps/vite.config.js

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export default defineConfig({
1717
include: [
1818
'@vitejs/test-dep-linked-include',
1919
'@vitejs/test-nested-exclude > @vitejs/test-nested-include',
20+
'@vitejs/test-dep-cjs-external-package-omit-js-suffix',
2021
// will throw if optimized (should log warning instead)
2122
'@vitejs/test-non-optimizable-include',
2223
'@vitejs/test-dep-optimize-exports-with-glob/**/*',

pnpm-lock.yaml

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

0 commit comments

Comments
 (0)