wp-envとViteで作る爆速WordPress開発環境
Viteの速さを知って以来その開発体験の虜になってしまい、Viteを使ったWordPress開発環境を考えたので紹介します。あくまで自分の開発フローに合わせたものであり、全ての開発シーンで利用できるとも限らないので予めご了承ください。
こちらがそのリポジトリになります
ViteのHMRを効かせながら開発できるので高速なWordPress開発体験を提供できるはずです。
前提とコンセプト
この開発環境は下記前提とコンセプトに基づいています。
- 旧来のPHPをベースとしたクラシックテーマでの開発を想定しています。新しいブロックテーマ開発で適用できるかどうか分からないです。
- MacOS環境を前提としています。(Windowsでも動くと思いますが、NPM Scriptsに
rm
コマンドが入っているので適宜置き換えてください) - 静的なHTMLを作成してからWordPress開発を行うフローを前提としていますが、直接WordPressを開発する場合でも利用できます。
- 中長期的に使えることを目標に、できる限りシンプルな構成でサードパーティ製プラグインなどはできるかぎり利用しないようにしています。
- Sass(SCSS)とTypeScriptを使います。
- テーマファイルの中はできるだけクリーンな状態にしたい。
- 複数人での開発でできるだけ開発者間の環境差異も減らすことも考慮しています。
WordPressテーマ開発のみでViteを使うなら、開発するテーマファイルの中にVite環境を構築すれば可能ですが、静的なHTMLを作成→WordPress開発というフローを取ることもあります。それにも対応した形になります。(あと、最終的にアップロードするテーマファイル内に開発用ソースをあまり入れたくないともいうのもあります)
必要環境
こちらの構成は下記のインストールが予め必要です。
- Node.js
- Docker
大まかな構成
この開発環境はwp-envでDocker上にWordPress環境を構築し、Viteで開発用ローカルサーバーを起動します。SassやTypeScriptはVite上のローカルサーバー上のものを参照することで高速な開発体験を提供します。
以下のようなフォルダ構成になっています。
└src
└assets
└images
└js
└style
└pubilc
└images
└wordpress
└wordpress
└plugins
└themes
└uploads
└package.json
└vite.config.ts
静的HTMLはsrc
フォルダ内で行い、完成したらビルドしてWordPressでの開発に移るのが基本的な流れです。しかし、静的HTMLで完成後もCSSやJavaScriptは引き続き変更するのでその度にビルドしなくてもよいことを目指して作りました。
かんたんな仕組み解説
静的開発時とWordPress開発時でViteの設定を変えられるようにしています。
▼vite.config.ts(一部)
const root = resolve(__dirname, "src");
// WordPress用ビルドのinput設定。WordPress用にはhtmlファイルは不要なため、scssとtsのみをビルド対象にする
const inputsForWordPress = {
style: resolve(root, "/assets/style/style.scss"),
// 動的にファイルを取得する @see https://rollupjs.org/configuration-options/#input
...Object.fromEntries(
globSync("src/assets/js/*.ts").map((file) => [
relative(
"src/assets/js",
file.slice(0, file.length - extname(file).length),
),
fileURLToPath(new URL(file, import.meta.url)),
]),
),
};
// 静的開発用のinput設定。静的資材用にはhtmlファイルを経由してscss,tsなどをビルドする
const inputsForStatic = {
style: resolve(root, "/assets/style/style.scss"),
...Object.fromEntries(
globSync("src/**/*.html").map((file) => [
relative("src", file.slice(0, file.length - extname(file).length)),
fileURLToPath(new URL(file, import.meta.url)),
]),
),
};
export default defineConfig(({ mode }) => ({
build: {
rollupOptions: {
input: mode === "wp" ? inputsForWordPress : inputsForStatic,
},
},
}));
静的開発時はCSSおよびsrc
フォルダ内の.html
をViteに読み込みます。WordPress用にビルドする場合はHTMLファイルは不要なので直接CSSと.ts
を読み込みます。これらをNPM Scriptsの--mode
引数を通じて変えています。静的開発せず直接WordPressで開発する場合はrollupOptions
のinput
を場合分けせずinputsForWordPress
のみに設定すればOKです。
またWordPress側のindex.php
のヘッダー部分にも工夫をいれています。
▼index.phpのヘッダー部分
<?php
if(WP_DEBUG){
$root = "http://localhost:5173";
$css_ext = "scss";
$js_ext = "ts";
echo '<script type="module" src="http://localhost:5173/@vite/client"></script>';
}else{
$root = get_template_directory_uri();
$css_ext = "css";
$js_ext = "js";
}
?>
<link rel="stylesheet" href="<?php echo $root;?>/assets/style/style.<?php echo $css_ext?>">
<script src="<?php echo $root;?>/assets/js/script.<?php echo $js_ext?>" type="module"></script>
.wp-env.json
の設定で"WP_DEBUG": true
となっているので開発時は$root
をViteのlocalhost:5173
に向けたSCSSファイルやTypeScriptファイルを参照します。またHMR用のスクリプトも読み込んでいるのでソースの反映がすぐにWordPressの画面に反映されます。
非開発時はテーマファイル内のビルドされたCSSとJavaScriptを参照します。開発時にビルド後のファイルを参照したい場合は、上記のif文をif(false)
などに書き換えると確認できます。.wp-env.json
の値を書き換えるとDockerが別コンテナ扱いになるようなのでおすすめしません。本番環境でWP_DEBUG
がtrue
になることはまずないはずですが、納品時には念のため消しておくと良いです。
WordPressコンテンツをほかの開発者と同期する
WordPress開発時にはWordPress内で作成した記事やページ、その他設定を開発者間でそろえたいこともあります。実際のアクセス制限されたサーバー上にWordPressを構築してそこを共有することでもできますが、都度都度ファイルをアップしないといけないなど手間がかかります。
そこである程度同期できるよう、WordPressのバックアップファイルを開発者間で共有することでコンテンツの同期を図ります。
NPM Scriptsのwp-contents export
コマンドでバックアップファイルを出力、wp-contents import
コマンドでインポートできます。このバックアップファイルをGitなどで管理し、開発者間でのWordPressコンテンツを同期できます。あくまで単一のバックアップファイルなので差分管理などはできず、頻繁な更新には向きません(コンフリクトしてもどちらかのファイルしか採用できません)。
使い方
リポジトリのREADMEからの抜粋ですが、簡単な使い方を説明します。
静的制作時
静的なHTMLを作成する場合はNPM Scriptsのdev
コマンドを起動するとローカルサーバーlocalhost:5173
が立ち上がります。このポート番号はWordPress時にも参照するので固定でお願いします。(変更する場合はWordPress側も変更する必要あります)
静的HTMLは基本src
フォルダ内で作ります。CSSやJavaScriptは直接.scss
ファイルや.ts
を参照すれば、Viteがいい感じにしてくれます。
▼HTMLのヘッダー部分
<link rel="stylesheet" href="/assets/style/style.scss" />
<script src="/assets/js/script.ts" type="module"></script>
あとはそのままHTML・CSS・JavaScriptを開発していけばOKです。
WordPressテーマ開発時
まずDockerを立ち上げてください。静的制作時と同様にNPM Scriptsのdev
コマンドを起動し、さらにwp-start
コマンドを実行します。初回起動のみ色々ダウンロードなどがあるので時間がかかります。wp-start
が立ち上がるとlocalhost:8888
にアクセスできるようになります。ここがWordPressのローカル環境になります。
開発時はCSSやJavaScriptはViteのローカルサーバーのものを参照しているので、静的作成時と同じようにsrc
フォルダ内のファイルを操作してください。終了時はwp-stop
でDockerのコンテナを停止します。
画像の格納先、読み込み方について(大事)
画像パスなどが開発・ビルド後できちんと通るように下記ルールでお願いします。
img
タグで読み込む画像はsrc/public/images
内に、CSSやjsで読み込む画像はsrc/assets/images/
に格納してください。
フォルダ構造
└src
└assets
└images
└background.png
└js.png
└pubilc
└images
└static.png
Viteではpublicフォルダはルートとして扱われるため、/images/static.png
というパスで画像を読み込むことができます。
▼HTML
<img src="/images/static.png" alt="" width="300" height="300" />
CSSで画像を読み込む場合は相対パスではなく、/assets
から始めるパス名にしてください。こちらもビルド時にViteがパスを解決するためです。
▼CSS
background-image: url("/assets/images/background.png");
jsで画像ファイルを読み込む場合はViteにビルド時にパス解決されるようimport
文で読み込んでください。
▼JS
import imgsrc from "/assets/images/js.png";
// jsから画像を読み込むサンプル
const canvas = document.querySelector<HTMLCanvasElement>("#canvas");
const context = canvas!.getContext("2d");
const image = new Image(300, 300);
image.src = imgsrc;
image.addEventListener("load", () => {
context?.drawImage(image, 0, 0, 300, 300);
})
WordPress開発時にPHPで画像を読み込む場合はテンプレートフォルダ内の画像を参照します。WordPress用ビルド時に静的制作時のpublicの画像はテンプレートフォルダに出力されますが、動的に変更はなされないので画像変更時は都度ビルド、もしくは手動でコピーが必要になります。
<img src="<?php echo get_template_directory_uri();?>/images/static.png" alt="" width="300" height="300" />
上記のように静的資材HTMLのコードのsrc
の頭に<?php echo get_template_directory_uri();?>
を付与することでうまく読み込めるようになります。
静的資材ビルドについて
静的資材をビルドする場合はNPM Scriptsのbuid
コマンドを実行してください。dist
フォルダに一式出力されます。
WordPress用ビルドについて
WordPress用にCSSやJavaScriptをビルドする場合はNPM Scriptsのbuid for WP
コマンドを実行してください。wordpress/themes/TEMPLATE_NAME/
内にassets
フォルダとimages
フォルダが出力されます。assets
フォルダにはビルドした各種CSSやJavaScriptが、images
にはHTMLから読み込んだ静的な画像が出力されています。
WordPressのログイン方法
http://localhost:8888/wp-admin/
にアクセスし、IDはadmin
パスワードはpassword
でログインできます。初回は言語設定が英語なので日本語に変えておくと良いでしょう。
さいごに
リンターやフォーマッターなども入っていますがそれらの設定はお好みでお願いします。またプラグインも特に入れていないので適宜案件に応じた形にカスタマイズしてください。
よかったら使ってみてください。
Discussion