【更新日 : 】
【詳細版】Viteでコーダーのコーディング環境(HTML(ejsライク:ハンドルバー化)・Sass・JS)を作る
- Category:
- 開発環境
※本記事はejsを利用していません。
代わりにHTMLファイルをejsと同等の機能を追加する(ハンドルバー化する)プラグイン vite-plugin-handlebars を利用しています。ejsは以下プラグイン vite-plugin-ejs を利用すると実装できるようです。
本記事は各設定の詳細を記載しています。
構築する手順とファイル構成だけが知りたい場合は以下の【簡易版】をご参照ください。
Viteでコーダー向けの環境構築をしたサンプルです。
通常のコーディングと同じ感覚(HTML(ejsライク)・Sass・JS)でコーディングできる設定を目指しました。
Viteの環境構築にはターミナル(Mac)やコマンドプロンプト(Windows)を用います。
本記事はこれらの基礎知識があることを前提とした記事です。
Viteは「HTML、SCSS、JS」で1セットなので、特定のファイルのみビルドしたい場合は別のツールを利用してください。
node.js v16.16.0 で動作確認をしています。
不具合が出る場合は実行環境のバージョンを合わせてください。
動作確認はmacです。windowsでは未検証ですので予めご了承ください。
Viteについて
Vite(ヴィート)は高速な開発環境を構築することができるフロントエンドのビルドツールです。
公式サイトが日本語化されており、ドキュメントも日本語で読むことができます。
Viteは「バンドルする」ということがコンセプトなツールのようですので、種々のファイルを分割して扱っている通常のWebサイトコーディングでの利用は想定していなさそうな印象ですが、検証したところ次項のような構成は組むことができたのでサンプルを作成しました。
この記事のViteでできること
- 複数のHTMLページ生成
- HTMLファイルをejsのように扱う(HTMLをハンドルバー化してejsの代替とする)
- ビルド後のHTMLファイルを整形(任意追加)
- SCSSの書き出し(PostCSSによるオプション設定)
- autoprefixer:ベンダープレフィックスの追加
- postcss-sort-media-queries:メディアクエリをソートして1つにまとめる
- css-declaration-sorter:プロパティ順のソート(smacss)
- postcss-purgecss:CSSファイルから未使用のスタイルを削除する
- postcss-normalize-charset:先頭にcharset追加
- publicに内包したサブJS(特定のページのみ追加したいJS)の圧縮(任意追加)
この記事のViteでしない(できない)こと
画像の圧縮はしない
プロジェクトで利用する固定画像は個別にコントロールしたい場合もあるので、コーディング環境に一括設定はしない派です。
Viteでは vite-plugin-imagemin というプラグインが存在しているようですので、そちらを利用すれば設定可能だと思います。
本記事では扱いませんので必要な方は以下をご参照ください。
ベース環境の構築
ベース環境の構築には以下の記事を参考にさせていただきました。
Vite は Node.js >=14.6.0 のバージョンが必要ですので事前にインストールしておいてください。
プロジェクト作成
構築したいディレクトリへ移動
作業を始める前に設定したいプロジェクトのあるディレクトリまで移動してください。
Windowsでの移動
Macでの移動
macなら該当フォルダを右クリック→「フォルダに新規ターミナルタブ」を選択してターミナルを立ち上げるとスムーズです。
Viteをインストール
プロジェクトを作成したいディレクトリで以下を実行すると、①〜③の質問が始まるので順番に入力・選択してください。その後は④、⑤と続けて実行してください。
①プロジェクト名(構築するプロジェクトの名称)を入力
②利用するフレームワークを選択:vanillaを選択
③テンプレートのバリエーションを選択:vanillaを選択
④作成したプロジェクトへ移動
⑤作成したプロジェクトに初期インストール
動作チェック(省略可能)
ここまで完了するとベースの構築は完了です。
「npm run dev」で開発サーバが起動するようになります。
※あくまでもテスト起動なのでこの工程は省いても問題ありません。
※一度立ち上げたタスクは control + c で終了できます。
ファイルのビルド(省略可能)
「npm run build」でdist/ディレクトリに公開用のファイル一式が書き出されます。
想定しているディレクトリ構成
初期インストールを実行するとViteのサンプルファイル一式が出力さていますが不要なものは全て削除します。
本記事では開発ファイルを src/で管理する構成です。
存在していないファイルは以降の手順を進めながら新規作成してください。
vite.config.jsを作成
ディレクトリの変更などViteの各設定をカスタマイズするためのvite.config.jsをルートに作成します。
vite.config.js
Viteの初期設定ではnpm run buildするとファイルの出力結果が以下のような構成になります。
この構成のまま納品することはまずないと思いますので、「assets/js/main.js」「assets/css/style.css」の構成になるようvite.config.jsのbuildプロパティに rollupOptions の設定を追加します。
vite.config.js
これで以下のような構成で出力されるようになります。
rollupOptionsの設定は以下を参考にさせていただきました。
rollupOptionsの詳細は以下の公式リファレンスをご参照ください。
Sass(SCSS)を使う
Sassモジュールのインストール
sassモジュールをインストールするとSassファイルを扱えるようになるので、以下のコマンドでインストールします。
Sassファイルの設定
Viteは特に設定を追記せずとも SCSSファイルを認識してくれるので、モジュールをインストールした後は既存のCSSをSCSSに置き換えるだけです。
- src/のcssディレクトリをscssに変更
- style.cssをstyle.scssに変更
cssファイルの読み込み方法
Viteの初期設定ではCSSは main.js 内で読み込んでいますが、
通常のコーディングではHTMLでCSSを読み込む方が一般的なので、HTMLで読み込むよう変更します。
main.js(未編集)
main.jsの中身を削除
CSSのimport設定やテストコードは全て不要なので削除してください。
main.js
index.htmlにlinkタグを追加
通常のコーディングと同じようにlinkタグで読み込ませます。
相対パスでSCSSのまま設定します。(buildすると自動的にCSSへ置き換わります。)
※lang属性はjaに変更し、初期に入っているfavicon設定は不要なので削除しています。
※main.jsも同じように相対パスを修正してください。
index.html
CSSビルド時にPostCSSによるオプション設定を追加する(任意)
ViteはPostCSSを扱えるので、ベンダープレフィックスを付与したり様々なオプションを追加することが可能です。
PostCSSのインストール
以下のコマンドでベースとなるPostCSSをインストールします。
PostCSSの利用方法
PostCSSを利用するにはプロジェクトのルートディレクトリに「postcss.config.cjs」を作成し、プラグインを呼び出すコードを記述する必要があります。
postcss.config.cjs
本記事のプラグインを一括でインストールする
本記事のプラグインを一括でインストールする場合は以下のコードを実行してください。
精査したい場合は以降を参照しそれぞれ個別にインストールしてください。
autoprefixerの追加
autoprefixerはベンダープレフィックスを自動付与してくれるPostCSSのプラグインです。
以下のコマンドでautoprefixerをインストールします。
browserslistの設定
package.jsonに対象となるブラウザ範囲「browserslist」を追記してください。
package.json
browserslistは環境に合わせて適宜変更してください。
設定の詳細は以下をご参照ください。
autoprefixerを有効化する
postcss.config.cjsに追記してください。
postcss.config.cjs
特別対応が必要でなければオプションなしで十分だと思います。
細かいオプション設定が必要な場合は環境に合わせて適宜追加してください。autoprefixerのオプション設定の詳細は以下をご参照ください。
postcss-sort-media-queries
メディアクエリをソートして1つにまとめてくれるPostCSSのプラグインです。
postcss.config.cjs
css-declaration-sorter
CSSプロパティの順番をソートするPostCSSのプラグインです。
postcss.config.cjs
orderの設定値は「alphabetical」「concentric-css」の3種類です。
詳しくは以下をご参照ください。
postcss-purgecss
CSSファイルから未使用のスタイルを削除するPostCSSのプラグインです。
案件によっては利用しない方が良いこともありますので、本当に必要かどうか必ず検討してください。
postcss.config.cjs
postcss-normalize-charset
CSSファイルの先頭にcharset追加するPostCSSのプラグインです。
昔文字化けした経験があって明記しておきたい派なので個人的に導入していますが、最近はブラウザがよしなに判定してくれるようなので多くの場合は不要だと思います。
postcss.config.cjs
HTMLを複数出力したい時の設定
Viteの初期設定では「npm run build」するとHTMLファイルは1つにまとめられてしまうので、HTMLを複数出力したい時には、vite.config.jsに出力するページを追記していく必要があります。
出力したいHTMLファイル
今回はindex.htmlに加えてlist.htmlを出力する想定とします。
複数出力の詳細は公式リファレンスのマルチページアプリの項をご参照ください。
vite.config.jsの設定
冒頭のimport設定と、先程追加したrollupOptionsの中にinputの設定を追加します。
vite.config.js
HTMLの複数出力を自動化したい時の設定
複数ページの出力を自動化する方法です。
vite.config.jsに./src配下にあるhtmlファイル一式を取得し自動出力する記述を追記します。
vite.config.js
HTMLファイルをejsのように扱う (ハンドルバー化する)
Viteでejsを利用する代わりにHTMLファイルをejsのように扱うことができる(ハンドルバー化する)プラグイン vite-plugin-handlebars を利用します。
vite-plugin-handlebarsのインストール
コンポーネントを管理するディレクトリをsrc/に追加
各ページで利用するコンポーネントファイル用のディレクトリ「components」を src/ 内に作成し、テスト用のheader.htmlを用意します。
vite.config.jsの設定
vite-plugin-handlebars を読み込む設定を追記します。
プラグインを有効化するとHTML内でif文や変数の出力ができるようになるので、ページごとに設定したい情報をまとめたオブジェクトも作成します。
(vite.config.jsに書かずに直接テンプレート側で変数を定義する方法もすぐ下に記載しています。)
vite.config.js
変数の出力、コンポーネントの読み込み
- プロパティの出力:
{{プロパティ名}}
(出力など基本構文のリファレンス) - コンポーネントの呼び出し:
{{> ファイル名(拡張子なし)}}
(コンポーネントのリファレンス) - 条件分岐:
{{#if hoge}} {{else}} {{/if}}
(if文のリファレンス) - コメントアウト:
{{!コメント}}
(コメントアウトのリファレンス)
index.html
header.html
テンプレート上で変数を渡す
vite.config.jsに記載せずともコンポーネントの呼び出し内に変数を追記していくと、テンプレート上で直接値を渡すことができます。
index.html
その他のできること
このプラグインはハンドルバーというテンプレート言語を利用できるようにするものです。
上記機能以外の検証確認はしていませんが、繰り返し文など一通り機能は揃っていそうです。
もっとできることが知りたい方は以下の公式リファレンスをご参照ください。
js-beautifyでビルドしたHTMLを整形する(任意)
Viteのプラグインなどではなく「npm run build」後にnpm scriptsでビルドされたHTMLに対してHTMLを整形する設定です。
環境に合わせて適宜導入を検討してください。
この項はViteの機能とは独立しており導入必須ではありません。
有名な整形ツールとしてprettierがありますが、本記事ではjs-beautifyを用いてHTMLを整形します。
js-beautifyはprettierと違って、整形しないタグを設定(除外設定)できたり、不用意な改行が入るといったことがないため、個人的にHTML整形においてはprettierより使いやすと思っています。
HTML整形プラグインjs-beautifyをインストール
.jsbeautifyrcのファイルを作成(js-beautifyの設定)
開発ディレクトリに.jsbeautifyrcを作成し、JSON形式でHTML整形のオプション設定を追加します。
.jsbeautifyrc
オプション設定は環境に合わせて適宜変更してください。
詳細は以下をご参照ください。
.jsbeautifyrcに追記する書き方は以下が参考になります。
package.jsonへコマンドを追加
package.jsonの「build」コマンドにjs-beautifyのコマンドを追記します。
package.json
実行方法
「npm run build」を実行すると自動的に dist/ にあるHTMLファイルが整形されるようになります。
変換しないファイルを格納する public/ディレクトリの設定
「npm run build」時に変換対象にしたくないファイル(そのまま使いたいファイル)は、メインのHTMLファイルと同じ階層に public/ ディレクトリを作成しそこへ内包します。
publicのファイルを参照する時はpublicを除いてパスを記述します。
「npm run build」を実行すると変換ファイルと一緒に出力されます。
public/ディレクトリ内のJSファイルを圧縮する(任意)
Viteに備わっているesbuildを利用して特定のページのみに追加したJSファイルを圧縮します。
prettierと同様に「npm run build」後にnpm scriptsでesbuildを実行する方法です。
この項のesbuildコマンドは対象のJSファイルが存在しない場合、コンソール上でエラーが出るので機能自体が不要な場合は追記しないでください。
(一応Viteのビルドコマンドとは独立してるので、エラーが出てもベースのビルド自体は問題なく動作します。)
esbuildの実行コマンドをpackage.jsonに追記
package.jsonの “scripts” に記載されている “build” コマンドにesbuildの実行コマンドを追加します。
&&でesbuild src/public/assets/js/*.js –bundle –minify –outdir=dist/assets/js/を繋ぎます。
package.json
実行方法
「npm run build」を実行すると自動的に src/public/assets/js/ のjsファイルが圧縮されるようになります。
モジュール main.jsの書き方
本記事ではモジュールJS(main.js)に対して特に設定を追加しません。
元々Vite自体にJSをバンドルする機能が備わっていますので、外部JSファイルをimportして扱っても、webpackを利用している時と同じようにビルド時には自動的にバンドルしてくれます。
main.js
モジュールJSはimportが使えるというだけで、importの記述を強制するものではありません。
importを使わない普通のコードのみでも動作します。
モジュール main.jsの扱いについて
この項はmain.jsからモジュール機能(type=”module”属性)を外したいと思った方へ向けた内容です。
結論だけ先に申し上げると、JSファイルにモジュール設定が残っていても特に問題ないので、気にならない方はこの項は飛ばしていただいて大丈夫です。
基本的に普通のコーディングしかしたことがないので「モジュール機能は利用しないし外したいな」と最初に引っかかって色々調べました。
もしかすると同じように思う方がいるかもしれないので詳細を記載しておきます。
main.jsのtype=”module”属性は削除できない(でも問題ない)
Viteはフロントエンドのビルドツールで、基本的にバンドルすることを主目的としているためか、main.jsからtype=”module”属性を外すことはできません。(ファイル名を変えることはできます。)
「モダン開発でもないしモジュール機能自体がそもそも必要ない」という場合でも、type=”module”属性を残しておかなければなりません。
使わない機能は外したくなるかもしれませんが、type=”module”属性はimportをブラウザ上で利用する時に追加する属性で、通常のscriptに+αするものですので、これ自体が何か阻害したり制限になったりもしません。
通常利用の時と同じように書いたものがそのまま動きますので、main.jsはいつもと同じように「全ページに共通して読み込まれる普通のJSファイル」という考え方で扱っても問題ないと思います。
src/index.html
ビルド後のmain.jsの出力位置(変更できないが問題ない)
「npm run build」で出力したHTMLファイルを確認するとmain.jsはheadタグの中(CSSの直前)に出力されます。
dist/index.html
この仕様は普段JSファイルを</body>の直前で読み込ませている方は結構気持ち悪さを感じるかもしれません。
しかし、type=”module”属性が付いたscriptは、defer属性をつけたscriptと同じ仕様で読み込み・実行されるので、</body>の直前に書いた時と同じような処理になるため速度面でも特に問題ありません。
defer属性は、HTMLの読み込みを阻害せず、HTMLの解析が完了した後にソースコード上に記載された順番でJSコードを実行する機能です。
詳細は以下の「モジュールの通常のスクリプトのその他の違い」項などをご参照ください。
モジュール main.jsの名称について
「npm run build」で出力したモジュールJSの名称は各設定の影響を受けることがあります。
単一ページの時 (モジュールJSの名称を変える方法)
rollupOptionsにinput設定がない単一ページの時に「npm run build」で出力したJSファイルの名称は index.jsになります。
これをコントロールしたい場合は、「chunkFileNames」「entryFileNames」に設定したい名称を明記します。
vite.config.js (rollupOptions.input設定がない時:jsのファイル名を明記した例)
複数ページの時 (モジュールJSの名称に数字が入る時の回避策)
rollupOptionsにinput設定がある複数ページの場合は「npm run build」で出力すると、input設定のプロパティ名にモジュールJSと同じ名称(main)が存在する場合は main2.jsのように名称に数字が入ることがあります。
vite.config.js (inputのプロパティ名とモジュールjsの名称が一致している例)
これはinput設定のプロパティ名を変更することで回避できます。
以下のように、モジュールのJSと異なる名称にすることで数字がつかなくなります。
vite.config.js
相対パスでビルドしたい場合
通常「npm run build」するとルートパスで出力されますが vite.config.js の defineConfig に base 設定を追加するとビルド時のパスをコントロールできるようになります。
vite.config.js
詳しくは以下をご参照ください。
CSS内の画像を相対パスで参照する
ビルド後のディレクトリ環境で一旦ルートに戻ってからファイルを参照するように書くと上手くいくようです。
ビルド後のファイルの位置関係
style.scss (assets/images/hoge.jpgを参照する場合)
Network設定を有効化してIPアドレスを発行する
vite.config.js
package.json
「npm run dev」するとIPアドレスが発行されるようになります。
詳しくは以下をご参照ください。
CSSとJSファイルに更新パラメータを自動で追加する
CSSとJSファイルに更新パラメータを自動で追加する方法です。
Viteに用意されたHTMLファイルを変換するための専用フック transformIndexHtml を用いて、ファイルの末尾に更新パラメータを追加します。
vite.config.js にパラメータを生成するhtmlPlugin関数を追加し、plugins内で読み込ませます。
更新パラメータは日時の合計値とすることで値が被らないようにしています。
vite.config.js
※パラメータ更新以外にも独自ルールでhtmlの内容を書き換えることが可能です。
詳しくは以下をご参照ください。
完成した構成ファイルのまとめ
ここまでの内容を構築したファイル構成のまとめです。
ディレクトリ構成
package.json
browserslistは環境に合わせて書き換えてください。
devDependencies”の各バージョンは記事執筆時のものですので、package.jsonをコピペで利用する場合は更新がないか確認をしてください。
package.json
vite.config.js
vite.config.js
postcss.config.cjs
postcss.config.cjs
.jsbeautifyrc
.jsbeautifyrc
開発を開始する
以下のコマンドを実行すると開発サーバが起動するのでコーディングを開始できます。
エラーが出た場合はコンソール上に詳細が書いてあるので、しっかり確認すると殆どの原因はすぐに特定できると思います。
よくありそうなエラーは、パスの記述ミス、vite.config.jsやpostcss.config.cjsファイルなどの構文エラー、存在しないファイルを参照しているなどが考えられます。
CSSでfont-familyに日本語を設定する場合の注意点
Viteに内蔵された機能でCSSを圧縮すると日本語文字列をUnicodeエスケープシーケンスに変換(例:\65e5\672c\8a9e)しますが、変換されるとWindows環境などでfont-family設定が効かなくなる場合があり、これを回避するには別途設定が必要です。
詳細は以下の記事にまとめましたので、必要に応じて追加で設定をしてください。
Tailwind CSSを導入する
ViteでTailwind CSSを導入する方法を以下の記事にまとめました。
Tailwind CSSの最適化(リセットCSSの削除、変数の削減、独自拡張)や、最適化した独自styleを混在させることができるのか検証しています。