fix(nuxt): fully resolve nuxt dependencies (#31436)

This commit is contained in:
Daniel Roe 2025-03-18 22:44:23 +00:00 committed by GitHub
parent efd4e2a50d
commit 26d0e18061
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 37 additions and 21 deletions

View File

@ -5,6 +5,8 @@ import noOnlyTests from 'eslint-plugin-no-only-tests'
import typegen from 'eslint-typegen'
import perfectionist from 'eslint-plugin-perfectionist'
import { runtimeDependencies } from './packages/nuxt/src/meta.mjs'
export default createConfigForNuxt({
features: {
stylistic: {
@ -188,23 +190,7 @@ export default createConfigForNuxt({
'vue/server-renderer',
'vue',
'vue-router',
// other deps
'devalue',
'klona',
// unjs ecosystem
'defu',
'ufo',
'h3',
'destr',
'consola',
'hookable',
'unctx',
'cookie-es',
'perfect-debounce',
'radix3',
'ohash',
'pathe',
'uncrypto',
...runtimeDependencies,
'errx', /* only used in dev */
// internal deps
'nuxt/app',

View File

@ -2,6 +2,9 @@ import type { Plugin } from 'vite'
import { tryImportModule } from '@nuxt/kit'
import type { Nuxt } from '@nuxt/schema'
import type { Nitro } from 'nitro/types'
import { resolveModulePath } from 'exsolve'
import { runtimeDependencies as runtimeNuxtDependencies } from '../../meta.mjs'
export function ResolveExternalsPlugin (nuxt: Nuxt): Plugin {
let external: Set<string> = new Set()
@ -11,17 +14,18 @@ export function ResolveExternalsPlugin (nuxt: Nuxt): Plugin {
enforce: 'pre',
async configResolved () {
if (!nuxt.options.dev) {
const { runtimeDependencies = [] } = await tryImportModule<typeof import('nitro/runtime/meta')>('nitro/runtime/meta', {
const { runtimeDependencies: runtimeNitroDependencies = [] } = await tryImportModule<typeof import('nitro/runtime/meta')>('nitro/runtime/meta', {
url: new URL(import.meta.url),
}) || {}
external = new Set([
// explicit dependencies we use in our ssr renderer - these can be inlined (if necessary) in the nitro build
'unhead', '@unhead/vue', 'unctx', 'h3', 'devalue', '@nuxt/devalue', 'radix3', 'rou3', 'unstorage', 'hookable',
'unhead', '@unhead/vue', '@nuxt/devalue', 'rou3', 'unstorage',
// ensure we only have one version of vue if nitro is going to inline anyway
...((nuxt as any)._nitro as Nitro).options.inlineDynamicImports ? ['vue', '@vue/server-renderer', '@unhead/vue'] : [],
...((nuxt as any)._nitro as Nitro).options.inlineDynamicImports ? ['vue', '@vue/server-renderer'] : [],
...runtimeNuxtDependencies,
// dependencies we might share with nitro - these can be inlined (if necessary) in the nitro build
...runtimeDependencies,
...runtimeNitroDependencies,
])
}
},
@ -32,6 +36,13 @@ export function ResolveExternalsPlugin (nuxt: Nuxt): Plugin {
const res = await this.resolve?.(id, importer, { skipSelf: true })
if (res !== undefined && res !== null) {
if (res.id === id) {
res.id = resolveModulePath(res.id, {
try: true,
from: importer,
extensions: nuxt.options.extensions,
}) || res.id
}
return {
...res,
external: 'absolute',

View File

@ -0,0 +1,19 @@
export const runtimeDependencies = [
// other deps
'devalue',
'klona',
// unjs ecosystem
'defu',
'ufo',
'h3',
'destr',
'consola',
'hookable',
'unctx',
'cookie-es',
'perfect-debounce',
'radix3',
'ohash',
'pathe',
'uncrypto',
]