Single Page
gulp.jsでPHPも動くウェブ制作環境を作る

まえがき

ウェブ制作環境をタスクランナーで作る場合、gulp.jsを使う記事をよく見る。

日本語での解説記事が多いので日本人の利用者が多いということなんだろうと思う。

開発モードを付ける、Pug・Sass・TypeScriptなど好みの言語を扱う、処理(タスク)を1つのファイルにまとめて書ける、設定は.envやtsconfig.jsonなど別ファイルに格納してもいい、などなど好きなように機能追加ができるので実際問題すごい楽。

開発モードをPHPで動かすこともできるし、ローカルサーバに依存しないでVS Codeのターミナルでコマンドを打てば自動的にブラウザで確認できるのだが少しだけ問題がある。

PHPの開発モードは、パソコンの店舗出荷状態のままでは使えない。

別にWindowsではApacheとPHPを、macOSではHomebrewとPHPをインストールする必要があるのだ。

Windowsの場合はApacheもPHPも標準インストールされていないので、自分で導入する必要がある。

一方macOSはApacheが標準インストールされているためローカルサーバが最初から使えるのだが、PHPはインストールされていないために使えない。

以前は標準インストールされていたのだが、macOS 12以降からPHPは外されるようになった。

ハブられた理由は知らん。

gulp.jsの開発モードでPHPを動くようにするgulp-connect-phpパッケージだが、内部的な仕組みとしてパソコンにインストールされているPHPを使っている。

そのため結局のところApacheとPHPをインストールしてローカルサーバを作る必要があるのだ。

一度インストールさえしてしまえば、ローカルサーバの効力外フォルダであっても開発モードでのPHPは動く。

gulp-connect-php.server関数
gulpConnectPhp.server(
  {
    base: './dist',
    port: 8000,
    ini: '/usr/local/etc/php/8.3/php.ini',
  },
  () => {
    browserSync.init({
      proxy: 'localhost:8000',
    });
  }
);

第1引数にiniプロパティとしてphp.iniファイルへとルート絶対パスを指定すればいい。

後は環境変数やら.zshrcやらを経由してPHPの実行ファイルを呼び出してくれる。

macOSにPHPをインストールする

パッケージマネージャの一種であるHomebrewを使うので、ターミナルからコマンドを実行してインストール。

インストール方法はトップページにコマンドが書いてある。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

PHPのインストールもターミナルから実行して有効化。

brew install php
brew services start php

インストール完了メッセージの中にphp.iniが保存された場所を表示してくれるのでコピーすること。

The php.ini and php-fpm.ini file can be found in:

/usr/local/etc/php/8.3/php.ini

バージョン違いフォルダ違いはあると思うが、概ねこんな感じだと思われる。

macOSのローカルサーバでもPHPを使う場合

gulp.jsだけでなく、ローカルサーバのApacheと連携させたい場合はもうひと手間。

ただし色々いじったパソコンだったせいか正攻法ではダメだった。

/etc/apache2/httpd.confで次の更新を行うのを飛ばしている。

  • libphp.soの読み込み
  • application/x-httpd-phpハンドラの登録
  • ディレクトリインデックスの更新
.zshrcの更新

~/.zshrcを更新する(存在しない場合は新規作成する)

export PATH="/usr/local/opt/php/bin:$PATH"
export PATH="/usr/local/opt/php/sbin:$PATH"
export LDFLAGS="-L/opt/homebrew/opt/php@8.0/lib"
export CPPFLAGS="-I/opt/homebrew/opt/php@8.0/include"

ターミナルから次を実行して(いわゆる)環境変数を適用する。

source ~/.zshrc

ここで一旦パソコンの再起動が多分要る。

oadModule php_module /usr/local/opt/php/lib/httpd/modules/libphp.so

ターミナルから次のコマンドを実行すると、開発モードのような感じでApache+PHPの連携ができた。

php -S localhost:8888 -t /Library/WebServer/Documents

URLはhttp://localhost:8888とポート番号付きになる。

またPHPを実行している間しか使えないのでControl+Cで終了したりパソコンを再起動したりすると、localhost:8888も閉じられてしまう。

正直すごい面倒なので、macOSでのPHPはおすすめしない。

多分楽な方法があるはずなので調査継続。

ファイルとフォルダ作成

Pug・SCSS・TypeScriptでのタスクタンナーを作ってみた。

例によってコンテンツはphewを流用する。

プロジェクトフォルダを作る

フォルダ名をphewとして新規作成。

VS Codeを新しいウィンドウをで開き、フォルダをドラッグ&ドロップ。

今回もパブリッシュしないのでphew4というフォルダ名で作成している。

mkdir src
mkdir src/css
mkdir src/js
mkdir src/img
mkdir src/public
mkdir dist

npm

npmの初期化など。

npm init -y
npm i -D cross-env dotenv gulp gulp-plumber gulp-if gulp-filter gulp-rename gulp-pug gulp-htmlmin glob fs-extra browser-sync gulp-connect-php@1.0.3 sass gulp-sass gulp-postcss autoprefixer postcss-csso tailwindcss gulp-typescript gulp-esbuild gulp-sharp-optimize-images
npx tailwindcss init

smooth-scrollbarはサイトデザインとして導入しているだけなので必須ではない。

npm i smooth-scrollbar

ファイルの作成・編集

  • .gitignore(新規作成)
  • .env(新規作成)
  • package.json(scriptsメソッドの更新)
  • tailwind.config.js(contentメソッドの更新)
  • gulpfile.mjs(新規作成)

GitHubリポジトリの作成

プロジェクトフォルダをGitHub Desktopのウィンドウにドラッグ・アンド・ドロップしてリポジトリを新規作成する。

「create a repository」「Create repository」「Publish repository]」「Publish repository」と4回クリックすれば制作前の準備は全て完了。

制作

書き出しに関する設定は.envファイルを編集。

それ以外のすべてはsrcフォルダの中身を編集。

npm run devで開発モードを起動して、がしがし作っていくだけ。

.htmlか.phpかの書き出しファイル形式を行う設定は、.envの IS_PHP 変数にある点は要注意。

編集するファイルは次の通り。

  • src/*.pug
  • src/css/**/*.scss
  • src/js/**/*.ts
  • src/img/**/*.*
  • src/public/**/*.*

pug・Sass・TypeScriptはそのままHTML・CSS・Javascriptに変換される。

「_」で始まるファイル名のものは出力されないので、ミックスインなど設定ファイルとしてどうぞ。

imgフォルダ内のファイルはdist/imgへ出力されるが、圧縮画像とWebP画像が同時に生成される。

src/img/filename.jpgの場合、dist/img/filename.jpgとdist/img/filename.webpが生成される。

publicフォルダ内のファイルは何も変換されることなく、distフォルダ直下にコピーされる。

モード

開発モード
npm run dev
製品モード(ローカルサーバ)
npm run build
製品モード(GitHub Pages)
npm run build:githubpages
製品モード(レンタルサーバ)
npm run build:xserver

.htmlか.phpか、出力形式は.envの IS_PHP で設定する。

これを途中で変更することはまずないと思うが、途中で変更した場合は.htmlと.phpが併存してしまう。

こういうゴミファイルを含めてdistフォルダの中身を一掃するためのコマンドも用意しておいた。

npm run delete

補足説明

gulpfile.mjs

gulp.js関連の記事でよく見るのはCommonJS形式のgulpfile.jsだが、今回はESModules形式で書いた。

大雑把に言うと、npmパッケージの読み込みにはrequire関数でなくimport命令で行うのが違い。

npmパッケージの更新の課程でESModulesへ移行されたために、インストール可能なバージョンの上限が発生する問題は前からあった。

そうでないにしてもCommonJSとESModulesの両方に対応するものが増えているし、緩やかにCommonJSからESModulesへの移行が進むものと見ている。

いつまでもバージョンの壁に阻まれ続けて新機能やバグフィックスに対応できないのも癪なので、gulp.jsもgulpfile.mjs(ESModules用にJavascriptが拡張されたことを明示する拡張子)にしてみた。

なおCommonJSとESModulesは併存できない。

古いままで残っているESModules非対応パッケージとは競合してしまうから要注意。

imagemin

画像処理は長くimagemin関連で一強と思っていたが、どうも2022年あたりを境に不具合をぼやく記事が出ている

実際に環境を作り直してみると本当に不具合が発生。

出力する画像がそもそも壊れており、バージョンを下げないとダメだった

そこで処理をsharp系に変更。

普通にいい感じだが小回りが効かないのはやや難点かなと。

gulp.jsのVinylでパイプ処理を連続させている途中にsharpを割り込ませているが、このsharpもPromiseやメソッドチェーンで連続処理をしていて、処理をVinylに返すという仕組みになっているようだ。

そこに別の処理を加えたいとなると、これはもう自分で書かないと無理かなと言った具合。

gulp-connect-php

パッケージはあえてバージョン1.0.3を導入している。

普通にバージョン指定なしだと0.0.2が入るが、これを使うとmacOSで動かなくなる。

そして更にnpm audit fix(あるいはnpm audit fix --force)をしても0.0.2に差し戻される。

根本の原因はパッケージの依存関係。

gulp-typescriptでも同様の問題は起きているが、特に既に廃止されてbinary-version-checkへと移行完了しているbin-version-checkパッケージを未だに使い続けている所が問題。

gulp-htmlminに至っては「打つ手なし」と言われている。

タスクランナーとして満足に動くんだけれども改善の余地あり。

【追記】この辺りの改善などをしました

ただしgulp-connect-phpだけはどうしようもないので自分でパッケージを作るしかないかなって。