SFC ブロックの構成
<template>、<script>、<style> の配置やスタイルの範囲を確認し、SFC の構成をそろえるためのルールをまとめています。ブロックを追加したときや、外部ファイルの src、lang、カスタムブロックを見直すときに使います。
ブロック順の既定値では script と template のどちらを先にしてもよく、style はその後に置きます。lang に関する 3 件は規約の説明で、現在の SFC lint では固有の診断を出しません。各ルールの対応範囲を確認し、プロジェクトに必要なものを選んでください。
まずは SFC ブロックの並び順の例で違いを確かめてください。Vue ルールで設定方針を確認し、採用するルールを設定して vp run lint を実行します。
このページに、各ルールの目的・前提・設定と、省略のない悪い例・良い例をまとめています。変更箇所は行の色で示します。コードをコピーすると、ソースコード全体を取得できます。各例に現在の対応範囲も明記しています。
| ルール | 例 | 目的 |
|---|---|---|
vue/no-preprocessor-lang |
悪い · 良い | CSS プリプロセッサーより標準の CSS を使う方針を示します。 |
vue/no-script-non-standard-lang |
悪い · 良い | script の非標準の lang 指定を避ける方針を示します。 |
vue/no-src-attribute |
悪い · 良い | SFC ブロックの外部 src 指定を検出します。 |
vue/no-template-lang |
悪い · 良い | template の lang 指定を避ける方針を示します。 |
vue/require-scoped-style |
悪い · 良い | style に scoped を指定する方針を適用します。 |
vue/sfc-element-order |
悪い · 良い | SFC のトップレベルブロックを設定した順に並べます。 |
vue/single-style-block |
悪い · 良い | SFC の style を一つのブロックにまとめます。 |
vue/warn-custom-block |
悪い · 良い | SFC のカスタムブロックを検出します。 |
全ルール · ルールのオプション · ESLint 移行対応表 · プロジェクトの検査 · 子への属性の継承
vue/no-preprocessor-lang
CSS プリプロセッサーより標準の CSS を使う方針を示します。
既定の重大度: warning
プリセット: nuxt, opinionated
自動修正: なし。修正内容を確認してください
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: ルール固有のオプションはありません。重大度とプリセットは設定できます。
設定(Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-preprocessor-lang": "warn"
}
},
},
});
vp run lint
悪い
style の lang に SCSS を指定しているため、プリプロセッサーを禁止するルールが記述されたブロックを報告します。
<template><p>Notice</p></template>
<style lang="scss">
.notice { color: red; }
</style>
良い
同じ宣言を、プリプロセッサーの lang を指定せずに通常の CSS で記述します。
<template><p>Notice</p></template>
<style>
.notice { color: red; }
</style>
良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。
vue/no-script-non-standard-lang
script の非標準の lang 指定を避ける方針を示します。
既定の重大度: warning
プリセット: nuxt, opinionated
自動修正: SFC lint では未対応
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: ルール固有のオプションはありません。重大度とプリセットは設定できます。
現在の対応: no-sfc-finding
このカタログ項目は現在の SFC lint では固有の診断を出しません。悪い例・良い例は意図した規約の説明であり、実行時にこのルールの診断が出る例ではありません。ID を設定しても未対応の SFC 検査は追加されません。
設定できる ID(現在の SFC lint では診断されません)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-script-non-standard-lang": "warn"
}
},
},
});
vp run lint
悪い
lang=coffee で CoffeeScript の構文を使っています。現在の SFC 検査では、この言語に対してこのルール固有の診断は出ません。
<script lang="coffee">
count = 0
</script>
<template><p>Notice</p></template>
良い
lang=ts と通常の TypeScript の宣言を使い、意図した言語の方針を示します。
<script lang="ts">
const count = 0;
</script>
<template><p>Notice</p></template>
良い例は意図する規約を示します。現在の SFC lint では、悪い例・良い例のどちらからもこのルール固有の診断は出ません。
vue/no-src-attribute
SFC ブロックの外部 src 指定を検出します。
既定の重大度: warning
プリセット: nuxt, opinionated
自動修正: なし。修正内容を確認してください
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: ルール固有のオプションはありません。重大度とプリセットは設定できます。
設定(Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-src-attribute": "warn"
}
},
},
});
vp run lint
悪い
SFC の template、script、style を src の外部ファイルに分けています。
<template src="./template.html"></template>
<script src="./script.ts"></script>
<style src="./style.css"></style>
良い
各ブロックに内容を記述し、外部の src 属性を使いません。
<template>
<p>Hello</p>
</template>
<script setup lang="ts">
const label = "Hello";
</script>
<style scoped>
p {
color: red;
}
</style>
良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。
vue/no-template-lang
template の lang 指定を避ける方針を示します。
既定の重大度: warning
プリセット: nuxt, opinionated
自動修正: なし。修正内容を確認してください
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: ルール固有のオプションはありません。重大度とプリセットは設定できます。
設定(Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-template-lang": "warn"
}
},
},
});
vp run lint
悪い
template の lang に Pug を指定しているため、HTML のみを許可するルールが記述されたブロックを報告します。
<template lang="pug">
p Notice
</template>
良い
lang を指定せず、通常の HTML の p を直接記述します。
<template>
<p>Notice</p>
</template>
良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。
vue/require-scoped-style
style に scoped を指定する方針を適用します。
既定の重大度: warning
プリセット: happy-path, nuxt, ecosystem, opinionated
自動修正: なし。修正内容を確認してください
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: ルール固有のオプションはありません。重大度とプリセットは設定できます。
設定(Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/require-scoped-style": "warn"
}
},
},
});
vp run lint
悪い
.button の style にスコープがなく、他のコンポーネントの一致する要素にも作用します。
<style>
.button {
color: red;
}
</style>
良い
scoped を style に付け、同じセレクタと宣言に Vue のコンポーネントスコープを適用します。
<style scoped>
.button {
color: red;
}
</style>
良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。
vue/sfc-element-order
SFC のトップレベルブロックを設定した順に並べます。
既定の重大度: warning
プリセット: happy-path, nuxt, ecosystem, opinionated
自動修正: なし。修正内容を確認してください
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: 型付きオプションと既定値を参照してください。
設定(Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/sfc-element-order": "warn"
}
},
},
});
vp run lint
悪い
style が script より前にあり、設定した SFC ブロック順に合いません。
<style scoped>
.panel {
color: red;
}
</style>
<script setup lang="ts">
const label = "Save";
</script>
良い
script → template → style の順に並べます。型付きオプションで別の順序を選べます。
<script setup lang="ts">
const label = "Save";
</script>
<template>
<p>{{ label }}</p>
</template>
<style scoped>
p {
color: red;
}
</style>
良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。
vue/single-style-block
SFC の style を一つのブロックにまとめます。
既定の重大度: warning
プリセット: happy-path, nuxt, ecosystem, opinionated
自動修正: なし。修正内容を確認してください
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: ルール固有のオプションはありません。重大度とプリセットは設定できます。
設定(Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/single-style-block": "warn"
}
},
},
});
vp run lint
悪い
panel と title の scoped スタイルを二つの style ブロックに分けています。
<style scoped>
.panel {
color: red;
}
</style>
<style scoped>
.title {
color: blue;
}
</style>
良い
両方のセレクタを一つの scoped style にまとめ、どちらのスタイルも残します。
<style scoped>
.panel {
color: red;
}
.title {
color: blue;
}
</style>
良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。
vue/warn-custom-block
SFC のカスタムブロックを検出します。
既定の重大度: warning
プリセット: nuxt, opinionated
自動修正: なし。修正内容を確認してください
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: ルール固有のオプションはありません。重大度とプリセットは設定できます。
設定(Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/warn-custom-block": "warn"
}
},
},
});
vp run lint
悪い
SFC に <i18n> のカスタムブロックがあり、通常の template / script / style 処理とは別の連携が必要です。
<i18n>
{ "en": { "hello": "Hello" } }
</i18n>
<template>
<p>{{ hello }}</p>
</template>
良い
標準の template と script setup を使います。移植性に関するこの任意の警告は、カスタムブロック全般が Vue で無効という意味ではありません。
<template>
<p>{{ hello }}</p>
</template>
<script setup lang="ts">
const hello = "Hello";
</script>
良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。