mirror of
https://github.com/nuxt/nuxt.git
synced 2024-11-26 07:32:01 +00:00
feat(nuxt): add experimentalNoScripts
route rule (#19805)
This commit is contained in:
parent
90d9cbbe88
commit
163913a744
@ -100,6 +100,7 @@ Nuxt 3 includes route rules and hybrid rendering support. Using route rules you
|
|||||||
- `swr` - Add cache headers to the server response and cache it in the server or reverse proxy for a configurable TTL. The `node-server` preset of Nitro is able to cache the full response. For Netlify and Vercel, the response is also added to the CDN layer.
|
- `swr` - Add cache headers to the server response and cache it in the server or reverse proxy for a configurable TTL. The `node-server` preset of Nitro is able to cache the full response. For Netlify and Vercel, the response is also added to the CDN layer.
|
||||||
- `static` - The behavior is the same as `swr` except that there is no TTL; the response is cached until the next deployment. On Netlify and Vercel, it enables full incremental static generation.
|
- `static` - The behavior is the same as `swr` except that there is no TTL; the response is cached until the next deployment. On Netlify and Vercel, it enables full incremental static generation.
|
||||||
- `prerender` - Prerenders routes at build time and includes them in your build as static assets
|
- `prerender` - Prerenders routes at build time and includes them in your build as static assets
|
||||||
|
- `experimentalNoScripts` - Disables rendering of Nuxt scripts and JS resource hints for sections of your site.
|
||||||
|
|
||||||
**Examples:**
|
**Examples:**
|
||||||
|
|
||||||
|
@ -276,6 +276,8 @@ export default defineRenderHandler(async (event) => {
|
|||||||
? await renderInlineStyles(ssrContext.modules ?? ssrContext._registeredComponents ?? [])
|
? await renderInlineStyles(ssrContext.modules ?? ssrContext._registeredComponents ?? [])
|
||||||
: ''
|
: ''
|
||||||
|
|
||||||
|
const NO_SCRIPTS = process.env.NUXT_NO_SCRIPTS || routeOptions.experimentalNoScripts
|
||||||
|
|
||||||
// Create render context
|
// Create render context
|
||||||
const htmlContext: NuxtRenderHTMLContext = {
|
const htmlContext: NuxtRenderHTMLContext = {
|
||||||
island: Boolean(islandContext),
|
island: Boolean(islandContext),
|
||||||
@ -285,7 +287,7 @@ export default defineRenderHandler(async (event) => {
|
|||||||
process.env.NUXT_JSON_PAYLOADS
|
process.env.NUXT_JSON_PAYLOADS
|
||||||
? _PAYLOAD_EXTRACTION ? `<link rel="modulepreload" href="${payloadURL}">` : null
|
? _PAYLOAD_EXTRACTION ? `<link rel="modulepreload" href="${payloadURL}">` : null
|
||||||
: _PAYLOAD_EXTRACTION ? `<link rel="preload" as="fetch" crossorigin="anonymous" href="${payloadURL}">` : null,
|
: _PAYLOAD_EXTRACTION ? `<link rel="preload" as="fetch" crossorigin="anonymous" href="${payloadURL}">` : null,
|
||||||
_rendered.renderResourceHints(),
|
NO_SCRIPTS ? null : _rendered.renderResourceHints(),
|
||||||
_rendered.renderStyles(),
|
_rendered.renderStyles(),
|
||||||
inlinedStyles,
|
inlinedStyles,
|
||||||
ssrContext.styles
|
ssrContext.styles
|
||||||
@ -297,7 +299,7 @@ export default defineRenderHandler(async (event) => {
|
|||||||
]),
|
]),
|
||||||
body: [_rendered.html],
|
body: [_rendered.html],
|
||||||
bodyAppend: normalizeChunks([
|
bodyAppend: normalizeChunks([
|
||||||
process.env.NUXT_NO_SCRIPTS
|
NO_SCRIPTS
|
||||||
? undefined
|
? undefined
|
||||||
: (_PAYLOAD_EXTRACTION
|
: (_PAYLOAD_EXTRACTION
|
||||||
? process.env.NUXT_JSON_PAYLOADS
|
? process.env.NUXT_JSON_PAYLOADS
|
||||||
@ -307,7 +309,7 @@ export default defineRenderHandler(async (event) => {
|
|||||||
? renderPayloadJsonScript({ id: '__NUXT_DATA__', ssrContext, data: ssrContext.payload })
|
? renderPayloadJsonScript({ id: '__NUXT_DATA__', ssrContext, data: ssrContext.payload })
|
||||||
: renderPayloadScript({ ssrContext, data: ssrContext.payload })
|
: renderPayloadScript({ ssrContext, data: ssrContext.payload })
|
||||||
),
|
),
|
||||||
_rendered.renderScripts(),
|
routeOptions.experimentalNoScripts ? undefined : _rendered.renderScripts(),
|
||||||
// Note: bodyScripts may contain tags other than <script>
|
// Note: bodyScripts may contain tags other than <script>
|
||||||
renderedMeta.bodyScripts
|
renderedMeta.bodyScripts
|
||||||
])
|
])
|
||||||
|
2
packages/nuxt/types.d.ts
vendored
2
packages/nuxt/types.d.ts
vendored
@ -11,8 +11,10 @@ declare global {
|
|||||||
declare module 'nitropack' {
|
declare module 'nitropack' {
|
||||||
interface NitroRouteConfig {
|
interface NitroRouteConfig {
|
||||||
ssr?: boolean
|
ssr?: boolean
|
||||||
|
experimentalNoScripts?: boolean
|
||||||
}
|
}
|
||||||
interface NitroRouteRules {
|
interface NitroRouteRules {
|
||||||
ssr?: boolean
|
ssr?: boolean
|
||||||
|
experimentalNoScripts?: boolean
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -95,6 +95,7 @@ export default defineUntypedSchema({
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Turn off rendering of Nuxt scripts and JS resource hints.
|
* Turn off rendering of Nuxt scripts and JS resource hints.
|
||||||
|
* You can also disable scripts more granularly within `routeRules`.
|
||||||
*/
|
*/
|
||||||
noScripts: false,
|
noScripts: false,
|
||||||
|
|
||||||
|
@ -47,6 +47,11 @@ describe('route rules', () => {
|
|||||||
expect(script.serverRendered).toEqual(false)
|
expect(script.serverRendered).toEqual(false)
|
||||||
expect(attrs['data-ssr']).toEqual('false')
|
expect(attrs['data-ssr']).toEqual('false')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('test noScript routeRules', async () => {
|
||||||
|
const page = await createPage('/no-scripts')
|
||||||
|
expect(await page.locator('script').all()).toHaveLength(0)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('modules', () => {
|
describe('modules', () => {
|
||||||
|
3
test/fixtures/basic/nuxt.config.ts
vendored
3
test/fixtures/basic/nuxt.config.ts
vendored
@ -51,7 +51,8 @@ export default defineNuxtConfig({
|
|||||||
],
|
],
|
||||||
nitro: {
|
nitro: {
|
||||||
routeRules: {
|
routeRules: {
|
||||||
'/route-rules/spa': { ssr: false }
|
'/route-rules/spa': { ssr: false },
|
||||||
|
'/no-scripts': { experimentalNoScripts: true }
|
||||||
},
|
},
|
||||||
output: { dir: process.env.NITRO_OUTPUT_DIR },
|
output: { dir: process.env.NITRO_OUTPUT_DIR },
|
||||||
prerender: {
|
prerender: {
|
||||||
|
3
test/fixtures/basic/pages/index.vue
vendored
3
test/fixtures/basic/pages/index.vue
vendored
@ -21,6 +21,9 @@
|
|||||||
<button @click="someValue++">
|
<button @click="someValue++">
|
||||||
Increment state
|
Increment state
|
||||||
</button>
|
</button>
|
||||||
|
<NuxtLink to="/no-scripts">
|
||||||
|
to no script
|
||||||
|
</NuxtLink>
|
||||||
<NestedSugarCounter :multiplier="2" />
|
<NestedSugarCounter :multiplier="2" />
|
||||||
<CustomComponent />
|
<CustomComponent />
|
||||||
<Spin>Test</Spin>
|
<Spin>Test</Spin>
|
||||||
|
12
test/fixtures/basic/pages/no-scripts.vue
vendored
Normal file
12
test/fixtures/basic/pages/no-scripts.vue
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
{{ count }}
|
||||||
|
<button @click="count++">
|
||||||
|
++
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
const count = ref(0)
|
||||||
|
</script>
|
Loading…
Reference in New Issue
Block a user