mirror of
https://github.com/nuxt/nuxt.git
synced 2024-11-25 23:22:02 +00:00
fix(schema): cleanup meta tags and deduplicate charset and viewport (#6378)
This commit is contained in:
parent
41d6f372a7
commit
fc1d7d9507
@ -1,17 +1,11 @@
|
|||||||
import { resolve } from 'pathe'
|
import { resolve } from 'pathe'
|
||||||
import { addPlugin, addTemplate, defineNuxtModule } from '@nuxt/kit'
|
import { addPlugin, addTemplate, defineNuxtModule } from '@nuxt/kit'
|
||||||
import defu from 'defu'
|
|
||||||
import { distDir } from '../dirs'
|
import { distDir } from '../dirs'
|
||||||
import type { MetaObject } from './runtime'
|
|
||||||
|
|
||||||
export default defineNuxtModule({
|
export default defineNuxtModule({
|
||||||
meta: {
|
meta: {
|
||||||
name: 'meta'
|
name: 'meta'
|
||||||
},
|
},
|
||||||
defaults: {
|
|
||||||
charset: 'utf-8',
|
|
||||||
viewport: 'width=device-width, initial-scale=1'
|
|
||||||
},
|
|
||||||
setup (options, nuxt) {
|
setup (options, nuxt) {
|
||||||
const runtimeDir = nuxt.options.alias['#head'] || resolve(distDir, 'head/runtime')
|
const runtimeDir = nuxt.options.alias['#head'] || resolve(distDir, 'head/runtime')
|
||||||
|
|
||||||
@ -21,17 +15,10 @@ export default defineNuxtModule({
|
|||||||
// Add #head alias
|
// Add #head alias
|
||||||
nuxt.options.alias['#head'] = runtimeDir
|
nuxt.options.alias['#head'] = runtimeDir
|
||||||
|
|
||||||
// Global meta -for Bridge, this is necessary to repeat here
|
|
||||||
// and in packages/schema/src/config/_app.ts
|
|
||||||
const globalMeta: MetaObject = defu(nuxt.options.app.head, {
|
|
||||||
charset: options.charset,
|
|
||||||
viewport: options.viewport
|
|
||||||
})
|
|
||||||
|
|
||||||
// Add global meta configuration
|
// Add global meta configuration
|
||||||
addTemplate({
|
addTemplate({
|
||||||
filename: 'meta.config.mjs',
|
filename: 'meta.config.mjs',
|
||||||
getContents: () => 'export default ' + JSON.stringify({ globalMeta })
|
getContents: () => 'export default ' + JSON.stringify({ globalMeta: nuxt.options.app.head })
|
||||||
})
|
})
|
||||||
|
|
||||||
// Add generic plugin
|
// Add generic plugin
|
||||||
|
@ -105,15 +105,23 @@ export default {
|
|||||||
*/
|
*/
|
||||||
head: {
|
head: {
|
||||||
$resolve: (val, get) => {
|
$resolve: (val, get) => {
|
||||||
return defu(val, get('meta'), {
|
const resolved = defu(val, get('meta'), {
|
||||||
charset: 'utf-8',
|
|
||||||
viewport: 'width=device-width, initial-scale=1',
|
|
||||||
meta: [],
|
meta: [],
|
||||||
link: [],
|
link: [],
|
||||||
style: [],
|
style: [],
|
||||||
script: [],
|
script: [],
|
||||||
noscript: []
|
noscript: []
|
||||||
})
|
})
|
||||||
|
|
||||||
|
resolved.charset = resolved.charset ?? resolved.meta.find(m => m.charset)?.charset ?? 'utf-8'
|
||||||
|
resolved.viewport = resolved.viewport ?? resolved.meta.find(m => m.name === 'viewport')?.content ?? 'width=device-width, initial-scale=1'
|
||||||
|
resolved.meta = resolved.meta.filter(m => m && m.name !== 'viewport' && !m.charset)
|
||||||
|
resolved.link = resolved.link.filter(Boolean)
|
||||||
|
resolved.style = resolved.style.filter(Boolean)
|
||||||
|
resolved.script = resolved.script.filter(Boolean)
|
||||||
|
resolved.noscript = resolved.noscript.filter(Boolean)
|
||||||
|
|
||||||
|
return resolved
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -138,6 +138,9 @@ describe('head tags', () => {
|
|||||||
expect(headHtml).toContain('<title>Using a dynamic component - Title Template Fn Change</title>')
|
expect(headHtml).toContain('<title>Using a dynamic component - Title Template Fn Change</title>')
|
||||||
expect(headHtml).not.toContain('<meta name="description" content="first">')
|
expect(headHtml).not.toContain('<meta name="description" content="first">')
|
||||||
expect(headHtml).toContain('<meta charset="utf-16">')
|
expect(headHtml).toContain('<meta charset="utf-16">')
|
||||||
|
expect(headHtml.match('meta charset').length).toEqual(1)
|
||||||
|
expect(headHtml).toContain('<meta name="viewport" content="width=1024, initial-scale=1">')
|
||||||
|
expect(headHtml.match('meta name="viewport"').length).toEqual(1)
|
||||||
expect(headHtml).not.toContain('<meta charset="utf-8">')
|
expect(headHtml).not.toContain('<meta charset="utf-8">')
|
||||||
expect(headHtml).toContain('<meta name="description" content="overriding with an inline useHead call">')
|
expect(headHtml).toContain('<meta name="description" content="overriding with an inline useHead call">')
|
||||||
expect(headHtml).toMatch(/<html[^>]*class="html-attrs-test"/)
|
expect(headHtml).toMatch(/<html[^>]*class="html-attrs-test"/)
|
||||||
|
7
test/fixtures/basic/nuxt.config.ts
vendored
7
test/fixtures/basic/nuxt.config.ts
vendored
@ -2,6 +2,13 @@ import { defineNuxtConfig } from 'nuxt'
|
|||||||
import { addComponent } from '@nuxt/kit'
|
import { addComponent } from '@nuxt/kit'
|
||||||
|
|
||||||
export default defineNuxtConfig({
|
export default defineNuxtConfig({
|
||||||
|
app: {
|
||||||
|
head: {
|
||||||
|
charset: 'utf-8',
|
||||||
|
link: [undefined],
|
||||||
|
meta: [{ name: 'viewport', content: 'width=1024, initial-scale=1' }, { charset: 'utf-8' }]
|
||||||
|
}
|
||||||
|
},
|
||||||
buildDir: process.env.NITRO_BUILD_DIR,
|
buildDir: process.env.NITRO_BUILD_DIR,
|
||||||
builder: process.env.TEST_WITH_WEBPACK ? 'webpack' : 'vite',
|
builder: process.env.TEST_WITH_WEBPACK ? 'webpack' : 'vite',
|
||||||
extends: [
|
extends: [
|
||||||
|
Loading…
Reference in New Issue
Block a user