フォーマット
Vize は、Vue コンポーネントの <script>、<template>、<style> をまとめてフォーマットします。Vite+ のプロジェクトでは、Vize が .vue ファイルを、Oxfmt がそれ以外のファイルを担当するので、コマンドひとつでプロジェクト全体をフォーマットできます。
プロジェクトをフォーマットする
Vite+ 統合を使っている場合は、次のタスクを実行します。
vp run fmt:check
vp run fmt
vp run fmt:check は、変更が必要なファイルを報告し、1 つでもあれば失敗します。CI ではこちらを使います。vp run fmt は結果をファイルに書き込みます。プロジェクトの一部だけをフォーマットするには、-- の後ろにパスを指定します。
Vite+ を使わない場合は、CLI を直接実行します。対象は Vue、JavaScript、TypeScript、JSX、TSX、JSON、JSONC のファイルです。YAML と Markdown はフォーマットしません。
vize fmt --check src
vize fmt --write src
--check は対象のファイルを一覧し、フォーマットが必要なファイルがあると終了コード 1 で終了します。
Found 1 file(s)
Would reformat: src/Card.vue
Checked 1 file(s)
1 file(s) would be reformatted
何が変わるか
次のコンポーネントを例にします。
<script setup lang="ts">
import { computed } from "vue";
const props = defineProps<{ title: string; count?: number }>();
const label = computed(() => `${props.title} (${props.count ?? 0})`);
</script>
<template>
<article class="card" v-bind:aria-label="label">
<h2>{{ label }}</h2>
<slot />
</article>
</template>
<style scoped>
.card {
padding: 1rem;
border: 1px solid #ddd;
}
</style>
vize fmt --write を実行すると、次のようになります。
<script setup lang="ts">
import { computed } from "vue";
const props = defineProps<{ title: string; count?: number }>();
const label = computed(() => `${props.title} (${props.count ?? 0})`);
</script>
<template>
<article class="card" :aria-label="label">
<h2>{{ label }}</h2>
<slot />
</article>
</template>
<style scoped>
.card {
padding: 1rem;
border: 1px solid #ddd;
}
</style>
スクリプトは、Oxfmt と同じ Oxc のフォーマッタで整形されます。テンプレートはインデントし直され、属性の間の空白がそろい、v-bind:、v-on:、v-slot: は省略記法に置き換わります。<pre>、<textarea>、v-pre の中の空白は、書いたとおりに残ります。
スタイルを設定する
Vite+ のプロジェクトでは、vite.config.ts の vue.formatter にオプションを書きます。
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({}).withVue({
formatter: {
printWidth: 100,
singleQuote: true,
},
});
fmt.ignorePatterns は両方のフォーマッタに適用されます。.vue ファイルも Oxfmt に任せるには、vue.formatter を省略し、fmt.vue: false を指定します。明示した vue.formatter はタスクの制御設定より優先されます。単独の CLI やエディターが同じ設定をどこから読むかは、設定を参照してください。
同じオプションは CLI のフラグでも指定できます。
| フラグ | 説明 |
|---|---|
--print-width |
1 行の最大幅を指定します。 |
--tab-width |
インデント 1 段あたりのスペース数を指定します。 |
--use-tabs |
スペースの代わりにタブでインデントします。 |
--single-quote |
ダブルクォートの代わりにシングルクォートを使います。 |
--trailing-comma |
末尾のカンマを all、es5、none から選びます。 |
--arrow-parens |
1 引数のアロー関数の括弧を always、avoid から選びます。 |
--bracket-spacing |
オブジェクトリテラルの波括弧内の空白を切り替えます。 |
--bracket-same-line |
複数行タグの > を最後の属性行に置きます。 |
--end-of-line |
改行を lf、crlf、cr、自動検出の auto から選びます。 |
--no-semi |
文末のセミコロンを省略します。 |
--sort-attributes |
テンプレートとブロックタグの属性を並べ替えます。 |
--single-attribute-per-line |
属性を 1 行に 1 つずつ書きます。 |
--max-attributes-per-line |
指定した数を超えると、属性を折り返します。 |
--normalize-directive-shorthands |
v-bind:、v-on:、v-slot: を :、@、# に置き換えます。 |
個々の設定は、次のガイドで詳しく説明しています。
オプション
次のオプションはすべて vue.formatter で指定できます。指定しなかったオプションは preset の値を使い、preset もなければここに示す既定値を使います。
| オプション | 既定値 | 説明 |
|---|---|---|
preset |
なし | 名前の付いた既定値の組を適用します。"vize"、"prettier"、"compact"、"documentation" のいずれかです。一緒に指定したオプションが優先されます。 |
printWidth |
100 |
1 行の最大幅です。 |
tabWidth |
2 |
インデント 1 段あたりのスペース数です。 |
useTabs |
false |
タブでインデントします。 |
semi |
true |
文末にセミコロンを付けます。 |
singleQuote |
false |
スクリプトでシングルクォートを使います。 |
jsxSingleQuote |
false |
JSX の属性でシングルクォートを使います。 |
trailingComma |
"all" |
末尾のカンマを付ける場所です。"all"、"es5"、"none" のいずれかです。 |
bracketSpacing |
true |
オブジェクトリテラルの波括弧の内側にスペースを入れます。 |
bracketSameLine |
false |
複数行のタグの > を最後の行の末尾に置きます。 |
arrowParens |
"always" |
引数が 1 つのアロー関数を括弧で囲むかどうかです。"always" または "avoid" です。 |
endOfLine |
"lf" |
改行コードです。"lf"、"crlf"、"cr"、"auto" のいずれかです。改行コードを参照してください。 |
quoteProps |
"as-needed" |
オブジェクトのキーを引用符で囲む条件です。プロパティの引用符を参照してください。 |
singleAttributePerLine |
false |
属性を 1 行に 1 つずつ書きます。 |
maxAttributesPerLine |
なし | タグの属性がこの数を超えると折り返します。 |
vueIndentScriptAndStyle |
false |
<script> と <style> の中身をインデントします。 |
sortAttributes |
true |
テンプレートとブロックタグの属性を並べ替えます。 |
attributeSortOrder |
"alphabetical" |
同じグループ内の属性の順序です。"alphabetical" または "as-written" です。 |
mergeBindAndNonBindAttrs |
false |
静的な属性を先にせず、class と :class をまとめて並べ替えます。 |
attributeGroups |
なし | Vue スタイルガイドの順序の代わりに使う属性グループです。たとえば [["id"], ["v-*"], ["*"]] です。 |
normalizeDirectiveShorthands |
true |
v-bind:、v-on:、v-slot: を :、@、# に置き換えます。 |
sortBlocks |
true |
ブロックを script、script setup、template、style、カスタムブロックの順に並べます。 |
normalizeCssQuotes |
false |
CSS、SCSS、Less の文字列の引用符を singleQuote の設定に合わせます。 |
normalizeInlineStyles |
false |
1 行の静的な style 属性を color: red; top: 0 の形で書きます。 |
normalizeVForParens |
false |
v-for の別名が複数あるときは (item, i) in items のように括弧で囲みます。 |
selfCloseVoidElements |
false |
空要素を <img /> のように閉じます。 |
reindentPreprocessorStyles |
false |
SCSS と Less のブロックを入れ子の深さでインデントし直し、空行を整えます。 |
sortImports |
無効 | スクリプトの import を並べ替えます。import の並べ替えを参照してください。 |
Node の native formatSfc API でも、Prettier 移行用の 5 つの真偽値
normalizeCssQuotes、normalizeInlineStyles、normalizeVForParens、
selfCloseVoidElements、reindentPreprocessorStyles を同じ名前で指定できます。
明示した値は false を含めて preset より優先されます。
スクリプトの引用符ポリシーも設定、CLI の直接上書き、Node で共有されます。
--jsx-single-quote[=false] は jsxSingleQuote、
--quote-props <as-needed|consistent|preserve> は quoteProps に対応します。
末尾のカンマのポリシーも同じように共有されます。
--trailing-comma <all|es5|none> は、型付きの Node・設定オプション
trailingComma に対応します。CLI と Node の明示値は、選択したプリセットより優先されます。
アロー関数の引数の括弧も同じように公開されます。
--arrow-parens <always|avoid> は、型付きの Node・設定オプション
arrowParens に対応し、明示値はプリセットより優先されます。
波括弧とタグの閉じ括弧の配置も同じように公開されます。
--bracket-spacing[=false] と --bracket-same-line[=false] は、型付きの
Node・設定オプション bracketSpacing と bracketSameLine に対応します。
明示した true または false は、選択したプリセットより優先されます。
改行コードも同じように公開されます。
--end-of-line <lf|crlf|cr|auto> は、型付きの Node・設定オプション
endOfLine に対応します。CLI の明示値は、設定と選択したプリセットより優先されます。
コンパクトなアプリケーションコード
アプリケーションのテンプレートを密に保ちつつ、ブロックや属性を書いた順序を変えたくない場合は compact プリセットを使います。
export default defineConfig({}).withVue({
formatter: {
preset: "compact",
},
});
このプリセットは printWidth: 120 と bracketSameLine: true を設定し、属性と SFC ブロックの順序を保ちます。v-bind:id を :id にする省略記法の正規化は有効です。既存オプションに名前を付けた組み合わせだけなので、一緒に書いたオプションが優先されます。CLI では vize fmt --preset compact を使います。
ドキュメントの例
文章中の例を狭く読みやすく保つには、documentation プリセットを使います。
export default defineConfig({}).withVue({
formatter: {
preset: "documentation",
},
});
このプリセットは printWidth: 80 と singleAttributePerLine: true を設定し、属性と SFC ブロックを書いた順に保ち、省略記法は正規化します。CSS、インライン style、v-for の別名、空要素、プリプロセッサのレイアウトに対する Prettier 移行用の正規化は有効にしません。CLI では vize fmt --preset documentation を使います。
Prettier から移行する
Vize の出力は Prettier や Oxfmt とほぼ同じですが、いくつかの既定値は意図して変えています。Vue ファイルを Prettier と同じように整形するには、prettier プリセットを指定します。
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({}).withVue({
formatter: {
preset: "prettier",
},
});
このプリセットは属性とブロックを書いた順に残し(sortAttributes: false、sortBlocks: false)、さらに次の動作をまとめて指定します。
- 行幅を Prettier と同じ 80 にします。Vize の既定値は Oxfmt と同じ 100 です。
v-bind:、v-on:、v-slot:は書いたとおりに残します。- CSS、SCSS、Less の文字列をダブルクォートにします。
--single-quoteを付けるとシングルクォートにします。 - 1 行の
style属性を、末尾の;を付けずにcolor: red; top: 0の形で書きます。 v-forの別名が複数あるときは、v-for="(item, i) in items"のように括弧で囲みます。- 空要素を
<img src="a.png" />のように閉じます。 - SCSS と Less のブロックを入れ子の深さでインデントし直し、空行を整えます。
コマンドラインでは、vize fmt --preset prettier で同じプリセットを指定できます。オプションは、設定ファイルのプリセット、設定ファイルのその他のオプション、--preset、その他のフラグの順に適用されます。
Node API でも同じ vize、prettier、compact、documentation の4つを指定できます。
import { formatSfc } from "@vizejs/native";
const result = formatSfc(source, {
preset: "prettier",
singleQuote: true,
});
明示したオプションは false を含めてプリセットより優先されます。preset を省略すると従来の Vize の既定値を使い、未対応の名前を指定するとエラーになります。
sortAttributes: false のときは、<script>、<template>、<style>、カスタムブロックのタグの属性も書いた順のまま残ります。既定値では <script lang="ts" setup> が <script setup lang="ts"> になります。
次の違いはプリセットを使っても残ります。
- 要素内のテキストは改行位置を変えません。Prettier は長いテキストを行幅まで詰め直します。
v-for以外のテンプレートの式は書いた形のまま残ります。たとえば{ open: boolean, close: () => void }のようなスロットの型の,区切りはそのままです。Prettier は;に置き換えます。- SCSS と Less のブロックの値は書いたとおりに残します。プリセットが変えるのは引用符、インデント、空行だけです。Prettier は
.2sを0.2sにするなど、値も整形します。インデント構文の Sass と Stylus のブロックは書いたとおりに残し、Pug のテンプレートは外側のインデントだけを調整します。
保存時にフォーマットする
エディターの設定を行うと、Vue ファイルのフォーマッタとして Vize が選ばれます。その他のファイルには、これまでのフォーマッタがそのまま使われます。