mirror of
https://github.com/nuxt/nuxt.git
synced 2024-11-22 05:35:13 +00:00
feat(nuxt): environment-specific plugin execution for islands (#20726)
This commit is contained in:
parent
ffc4e798cd
commit
0f839dd723
@ -155,6 +155,16 @@ export interface PluginMeta {
|
|||||||
order?: number
|
order?: number
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface PluginEnvContext {
|
||||||
|
/**
|
||||||
|
* This enable the plugin for islands components.
|
||||||
|
* Require `experimental.componentsIslands`.
|
||||||
|
*
|
||||||
|
* @default true
|
||||||
|
*/
|
||||||
|
islands?: boolean
|
||||||
|
}
|
||||||
|
|
||||||
export interface ResolvedPluginMeta {
|
export interface ResolvedPluginMeta {
|
||||||
name?: string
|
name?: string
|
||||||
parallel?: boolean
|
parallel?: boolean
|
||||||
@ -169,6 +179,7 @@ export interface Plugin<Injections extends Record<string, unknown> = Record<stri
|
|||||||
export interface ObjectPlugin<Injections extends Record<string, unknown> = Record<string, unknown>> extends PluginMeta {
|
export interface ObjectPlugin<Injections extends Record<string, unknown> = Record<string, unknown>> extends PluginMeta {
|
||||||
hooks?: Partial<RuntimeNuxtHooks>
|
hooks?: Partial<RuntimeNuxtHooks>
|
||||||
setup?: Plugin<Injections>
|
setup?: Plugin<Injections>
|
||||||
|
env?: PluginEnvContext
|
||||||
/**
|
/**
|
||||||
* Execute plugin in parallel with other parallel plugins.
|
* Execute plugin in parallel with other parallel plugins.
|
||||||
*
|
*
|
||||||
@ -318,6 +329,7 @@ export async function applyPlugins (nuxtApp: NuxtApp, plugins: Array<Plugin & Ob
|
|||||||
const parallels: Promise<any>[] = []
|
const parallels: Promise<any>[] = []
|
||||||
const errors: Error[] = []
|
const errors: Error[] = []
|
||||||
for (const plugin of plugins) {
|
for (const plugin of plugins) {
|
||||||
|
if (process.server && nuxtApp.ssrContext?.islandContext && plugin.env?.islands === false) { continue }
|
||||||
const promise = applyPlugin(nuxtApp, plugin)
|
const promise = applyPlugin(nuxtApp, plugin)
|
||||||
if (plugin.parallel) {
|
if (plugin.parallel) {
|
||||||
parallels.push(promise.catch(e => errors.push(e)))
|
parallels.push(promise.catch(e => errors.push(e)))
|
||||||
|
@ -1649,7 +1649,7 @@ describe('component islands', () => {
|
|||||||
"link": [],
|
"link": [],
|
||||||
"style": [],
|
"style": [],
|
||||||
},
|
},
|
||||||
"html": "<div nuxt-ssr-component-uid><div> count is above 2 </div><div style=\\"display:contents;\\" nuxt-ssr-slot-name=\\"default\\"></div> that was very long ... <div id=\\"long-async-component-count\\">3</div><div style=\\"display:contents;\\" nuxt-ssr-slot-name=\\"test\\" nuxt-ssr-slot-data=\\"[{"count":3}]\\"></div><p>hello world !!!</p><div style=\\"display:contents;\\" nuxt-ssr-slot-name=\\"hello\\" nuxt-ssr-slot-data=\\"[{"t":0},{"t":1},{"t":2}]\\"><div nuxt-slot-fallback-start=\\"hello\\"></div><!--[--><div style=\\"display:contents;\\"><div> fallback slot -- index: 0</div></div><div style=\\"display:contents;\\"><div> fallback slot -- index: 1</div></div><div style=\\"display:contents;\\"><div> fallback slot -- index: 2</div></div><!--]--><div nuxt-slot-fallback-end></div></div><div style=\\"display:contents;\\" nuxt-ssr-slot-name=\\"fallback\\" nuxt-ssr-slot-data=\\"[{"t":"fall"},{"t":"back"}]\\"><div nuxt-slot-fallback-start=\\"fallback\\"></div><!--[--><div style=\\"display:contents;\\"><div>fall slot -- index: 0</div><div class=\\"fallback-slot-content\\"> wonderful fallback </div></div><div style=\\"display:contents;\\"><div>back slot -- index: 1</div><div class=\\"fallback-slot-content\\"> wonderful fallback </div></div><!--]--><div nuxt-slot-fallback-end></div></div></div>",
|
"html": "<div nuxt-ssr-component-uid><div> count is above 2 </div><div style=\\"display:contents;\\" nuxt-ssr-slot-name=\\"default\\"></div> that was very long ... <div id=\\"long-async-component-count\\">3</div> <div style=\\"display:contents;\\" nuxt-ssr-slot-name=\\"test\\" nuxt-ssr-slot-data=\\"[{"count":3}]\\"></div><p>hello world !!!</p><div style=\\"display:contents;\\" nuxt-ssr-slot-name=\\"hello\\" nuxt-ssr-slot-data=\\"[{"t":0},{"t":1},{"t":2}]\\"><div nuxt-slot-fallback-start=\\"hello\\"></div><!--[--><div style=\\"display:contents;\\"><div> fallback slot -- index: 0</div></div><div style=\\"display:contents;\\"><div> fallback slot -- index: 1</div></div><div style=\\"display:contents;\\"><div> fallback slot -- index: 2</div></div><!--]--><div nuxt-slot-fallback-end></div></div><div style=\\"display:contents;\\" nuxt-ssr-slot-name=\\"fallback\\" nuxt-ssr-slot-data=\\"[{"t":"fall"},{"t":"back"}]\\"><div nuxt-slot-fallback-start=\\"fallback\\"></div><!--[--><div style=\\"display:contents;\\"><div>fall slot -- index: 0</div><div class=\\"fallback-slot-content\\"> wonderful fallback </div></div><div style=\\"display:contents;\\"><div>back slot -- index: 1</div><div class=\\"fallback-slot-content\\"> wonderful fallback </div></div><!--]--><div nuxt-slot-fallback-end></div></div></div>",
|
||||||
"state": {},
|
"state": {},
|
||||||
}
|
}
|
||||||
`)
|
`)
|
||||||
|
@ -32,7 +32,7 @@ describe.skipIf(process.env.SKIP_BUNDLE_SIZE === 'true' || process.env.ECOSYSTEM
|
|||||||
const serverDir = join(rootDir, '.output/server')
|
const serverDir = join(rootDir, '.output/server')
|
||||||
|
|
||||||
const serverStats = await analyzeSizes(['**/*.mjs', '!node_modules'], serverDir)
|
const serverStats = await analyzeSizes(['**/*.mjs', '!node_modules'], serverDir)
|
||||||
expect.soft(roundToKilobytes(serverStats.totalBytes)).toMatchInlineSnapshot('"64.2k"')
|
expect.soft(roundToKilobytes(serverStats.totalBytes)).toMatchInlineSnapshot('"64.4k"')
|
||||||
|
|
||||||
const modules = await analyzeSizes('node_modules/**/*', serverDir)
|
const modules = await analyzeSizes('node_modules/**/*', serverDir)
|
||||||
expect.soft(roundToKilobytes(modules.totalBytes)).toMatchInlineSnapshot('"2330k"')
|
expect.soft(roundToKilobytes(modules.totalBytes)).toMatchInlineSnapshot('"2330k"')
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
<div id="long-async-component-count">
|
<div id="long-async-component-count">
|
||||||
{{ count }}
|
{{ count }}
|
||||||
</div>
|
</div>
|
||||||
|
{{ headers['custom-head'] }}
|
||||||
<slot name="test" :count="count" />
|
<slot name="test" :count="count" />
|
||||||
<p>hello world !!!</p>
|
<p>hello world !!!</p>
|
||||||
<slot v-for="(t, index) in 3" name="hello" :t="t">
|
<slot v-for="(t, index) in 3" name="hello" :t="t">
|
||||||
@ -28,8 +29,12 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import { getResponseHeaders } from 'h3'
|
||||||
defineProps<{
|
defineProps<{
|
||||||
count: number
|
count: number
|
||||||
}>()
|
}>()
|
||||||
|
|
||||||
|
const evt = useRequestEvent()
|
||||||
|
const headers = getResponseHeaders(evt)
|
||||||
const { data } = await useFetch('/api/very-long-request')
|
const { data } = await useFetch('/api/very-long-request')
|
||||||
</script>
|
</script>
|
||||||
|
12
test/fixtures/basic/plugins/server-only.server.ts
vendored
Normal file
12
test/fixtures/basic/plugins/server-only.server.ts
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import { setHeader } from 'h3'
|
||||||
|
|
||||||
|
export default defineNuxtPlugin({
|
||||||
|
name: 'server-only-plugin',
|
||||||
|
setup () {
|
||||||
|
const evt = useRequestEvent()
|
||||||
|
setHeader(evt, 'custom-head', 'hello')
|
||||||
|
},
|
||||||
|
env: {
|
||||||
|
islands: false
|
||||||
|
}
|
||||||
|
})
|
Loading…
Reference in New Issue
Block a user