Skip to content

Commit ff89df5

Browse files
authored
fix(ssr): check root import extension for external (#9494)
1 parent 8bae103 commit ff89df5

File tree

8 files changed

+44
-7
lines changed

8 files changed

+44
-7
lines changed

packages/vite/src/node/plugins/resolve.ts

+10-6
Original file line numberDiff line numberDiff line change
@@ -652,18 +652,22 @@ export function tryNodeResolve(
652652
if (!externalize) {
653653
return resolved
654654
}
655-
// dont external symlink packages
655+
// don't external symlink packages
656656
if (!allowLinkedExternal && !resolved.id.includes('node_modules')) {
657657
return resolved
658658
}
659659
const resolvedExt = path.extname(resolved.id)
660+
// don't external non-js imports
661+
if (
662+
resolvedExt &&
663+
resolvedExt !== '.js' &&
664+
resolvedExt !== '.mjs' &&
665+
resolvedExt !== '.cjs'
666+
) {
667+
return resolved
668+
}
660669
let resolvedId = id
661670
if (isDeepImport) {
662-
// check ext before externalizing - only externalize
663-
// extension-less imports and explicit .js imports
664-
if (resolvedExt && !resolved.id.match(/(.js|.mjs|.cjs)$/)) {
665-
return resolved
666-
}
667671
if (!pkg?.data.exports && path.extname(id) !== resolvedExt) {
668672
resolvedId += resolvedExt
669673
}

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

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { port } from './serve'
2-
import { page } from '~utils'
2+
import { getColor, page } from '~utils'
33

44
const url = `http://localhost:${port}`
55

@@ -108,3 +108,8 @@ test('msg from linked no external', async () => {
108108
await page.goto(url)
109109
expect(await page.textContent('.dep-virtual')).toMatch('[success]')
110110
})
111+
112+
test('import css library', async () => {
113+
await page.goto(url)
114+
expect(await getColor('.css-lib')).toBe('blue')
115+
})

playground/ssr-deps/css-lib/index.css

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.css-lib {
2+
color: blue;
3+
}
+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"name": "@vitejs/css-lib",
3+
"private": true,
4+
"version": "0.0.0",
5+
"main": "./index.css"
6+
}

playground/ssr-deps/index.html

+4
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,9 @@
88
<body>
99
<h1>SSR Dependencies</h1>
1010
<div><!--app-html--></div>
11+
<script type="module">
12+
// hydration scripts
13+
import '@vitejs/css-lib'
14+
</script>
1115
</body>
1216
</html>

playground/ssr-deps/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"debug": "node --inspect-brk server"
1010
},
1111
"dependencies": {
12+
"@vitejs/css-lib": "file:./css-lib",
1213
"bcrypt": "^5.0.1",
1314
"define-properties-exports": "file:./define-properties-exports",
1415
"define-property-exports": "file:./define-property-exports",

playground/ssr-deps/src/app.js

+3
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import noExternalCjs from 'no-external-cjs'
1313
import importBuiltinCjs from 'import-builtin-cjs'
1414
import { hello as linkedNoExternal } from 'linked-no-external'
1515
import virtualMessage from 'pkg-exports/virtual'
16+
import '@vitejs/css-lib'
1617

1718
// This import will set a 'Hello World!" message in the nested-external non-entry dependency
1819
import 'non-optimized-with-nested-external'
@@ -82,5 +83,7 @@ export async function render(url, rootDir) {
8283

8384
html += `\n<p class="dep-virtual">message from dep-virtual: ${virtualMessage}</p>`
8485

86+
html += `\n<p class="css-lib">I should be blue</p>`
87+
8588
return html + '\n'
8689
}

pnpm-lock.yaml

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

0 commit comments

Comments
 (0)