Skip to content

Commit e4c4334

Browse files
bartlomiejuclaude
andcommitted
fix: apply resolve.alias before Deno resolution and add SSR noExternal for radix-ui
Apply Vite's resolve.alias config (e.g. react -> preact/compat) in deno.ts before calling @deno/loader, so the alias works even when packages are externalized in SSR mode. Also add noExternal for @radix-ui packages in the SSR environment since they depend on React compat aliases being applied. WIP: radix test still failing — alias format from Vite config needs further investigation. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent dd3339b commit e4c4334

4 files changed

Lines changed: 28 additions & 4 deletions

File tree

deno.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"vendor": true,
33
"nodeModulesDir": "manual",
4+
"links": ["../deno-vite-plugin"],
45
"workspace": [
56
"./packages/*",
67
"./www"

deno.lock

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

packages/plugin-vite/src/mod.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,13 @@ export function fresh(config?: FreshViteConfig): Plugin[] {
179179
},
180180
},
181181
ssr: {
182+
resolve: {
183+
// Packages that depend on React compat aliases must not
184+
// be externalized — Node.js require() wouldn't apply
185+
// the react->preact/compat alias and would load the
186+
// real React or get CJS/ESM interop issues.
187+
noExternal: [/^@radix-ui/],
188+
},
182189
build: {
183190
manifest: true,
184191
emitAssets: true,

packages/plugin-vite/src/plugins/deno.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,16 @@ export function deno(): Plugin {
8383

8484
// Apply resolve.alias before Deno resolution so that
8585
// react -> preact/compat works even in externalized packages.
86+
// Vite normalizes alias config to { find, replacement }[] format.
8687
const aliases = this.environment?.config?.resolve?.alias;
87-
if (Array.isArray(aliases)) {
88-
for (const alias of aliases) {
89-
if (typeof alias.find === "string" && alias.find === id) {
90-
id = alias.replacement;
88+
if (aliases) {
89+
const list = Array.isArray(aliases) ? aliases : [];
90+
for (const alias of list) {
91+
const find = alias.find;
92+
if (typeof find === "string" ? find === id : find?.test?.(id)) {
93+
id = typeof alias.replacement === "string"
94+
? alias.replacement
95+
: id;
9196
break;
9297
}
9398
}

0 commit comments

Comments
 (0)