【gulp】BrowserSyncでSSIを使う方法についてメモメモ
みなさま、こんにちは。
嫁に20年前の写真を見せて、「誰に似てる?」って聞いたら「堺雅人」と言ってもらえて喜んでいる
kourakuです。
さてさて、たまにですけどSSIを使ってコーディングする案件が来ることがあります。
そんなとき、わざわざSSIが使えるようにサーバを立ち上げるとか、ちょっと手間ですよね。
そんな面倒も gulp+BrowserSync に見てもらう設定をしてみよう!ということについてメモメモ。
※前提:gulp、CofeeScript導入済。
※前回の記事『【gulp】CoffeeScriptとBrowserSync導入をメモメモ』の内容を元に進めていきます。
BrowserSyncでSSIを使う準備
それでは早速、次のコマンドを叩いて、SSIを使うためのプラグインをインストールします。
ここではconnect-ssiを使用します。
$ npm install connect-ssi --save-dev
インストールが完了したら、BrowserSyncでSSIを使えるようgulpfile.coffeeに設定しましょう。
まずは、先ほどインストールしたプラグインをrequireします。
BrowserSyncの下にでも書きましょうか。
[gulpfile.coffee]
:
browserSync = require 'browser-sync'
connectSSI = require 'connect-ssi'
:
続いて、BrowserSyncのサーバ設定にmiddlewareとしてSSIを設定します。
以下の様にコードを書きます。
[gulpfile.coffee]
:
# BrowserSyncの設定
gulp.task 'browser-sync', ->
browserSync.init
server:
# ルートを指定します
baseDir: paths.pub
# middlewareを使う設定
middleware: [
# SSIの設定情報
connectSSI(
baseDir: __dirname + '/htdocs'
ext: '.html'
)
]
:
gulp側の設定はこれで完了しました。
あとは、HTMLに次のようなコメントを書いて、includeさせるファイルを用意すればOKです。
[/htdocs/index.html]
:
<!--#include file="/ssi/_header.txt" -->
:
[/htdocs/content1/index.html]
:
<!--#include file="/ssi/_header.txt" -->
:
[/htdocs/content2/index.html]
:
<!--#include file="/ssi/_header.txt" -->
:
[/htdocs/ssi/_header.txt]
<header>
<p>ヘッダーだよ</p>
</header>
はい、これでindex.html、/content1/index.html、/content2/index.htmlを開くと
_header.txtの内容が表示されるようになりました。
ここまでのディレクトリ構造はこんな感じです。
┬ [htdocs] ──────┬ index.html
| ├ [content1] ─── index.html
| ├ [content2] ─── index.html
| └ [ssi] ───── _header.txt
├ [node_modules] ─── plugin
├ gulpfile.coffee
├ gulpfile.js
└ package.json
virtualを使いたいけど使えない・・・そんな時の対処方法
さて、1点注意することがあります。
今回file="~"で読み込むファイルを指定しています。
この場合は、gulpfile.coffeeで設定したbaseDirをルートとして認識してもらえます。
場合によってはvirtual="~"で仮想パスを設定しないといけない場合があります。
しかし、virtualはbaseDirをルートとして認識しません。。。
今回使用しているプラグインconnect-ssiはnode-ssiを利用しているのですが、
そのnode-ssiのドキュメントを見るとこう書かれています。
Note:
・file includes are always relative to the baseDir provided in the options.
・virtual includes are relative to the current file.
英語力が全くないkourakuが頑張って脳内翻訳をしてみたところ、
なるほど・・・やはり相対パスしか見てくれないようです。
ということで、こんな時の対処方法は・・・
まずは一旦file="~"でコーディングを進めましょう(笑)。
あ、笑ってますが冗談ではないですよ。
一旦fileで組んで、納品する時にvirtualに一括置換をかければ良いわけです。
ただ、その一括置換をエディタとかでやるのも芸がないので、
gulpのタスクとして追加してみてはいかがでしょう?
置換はgulp-replaceにお任せ!
ということで、次のコマンドを叩いて、置換を行うためのプラグインgulp-replaceを
インストールしましょう。
$ npm install gulp-replace --save-dev
続いて、file → virtualへの置換タスクを作ります。
gulpfile.coffeeに次の様なコードを書きます。
[gulpfile.coffee]
:
plumber = require 'gulp-plumber'
replace = require 'gulp-replace'
:
# SSI Code Change : file -> virtual
gulp.task 'ssiChangeVirtual', ->
gulp
.src paths.pub+'**/*.html'
.pipe plumber()
.pipe replace(/<!--#include file/g, '<!--#include virtual')
.pipe gulp.dest paths.pub
return
:
はい、gulp-plumberというプラグインをこっそり追加しています。
これは一体何かと言いますと、途中でエラーが起こってもタスクを
強制停止させないようにするためのものです。
これを入れておかないと、後々SassだのJadeだの使い始めたときに面倒なことが起こります。
ということで、次のコマンドでgulp-plumberもインストールしておきます。
$ npm install gulp-plumber --save-dev
これで
$ gulp ssiChangeVirtual
とコマンドを叩くと、htdocsディレクトリ内のHTMLファイルに記述されている
「<!--#include file」を「<!--#include virtual」に置換してくれます。
virtual → file に戻したければ、逆のタスクを作ってコマンドを叩けばOKです。
あとは、納品用データ作成タスクなど作り、そこに放り込めば完了ですね。
まとめ
SSIを使う、という今回のテーマは、結果を見れば単純だけど結構ハマった記憶があります。
なので、忘れないようにしっかりとメモしておかないといけませんね。
あと、プラグインのバージョンアップ情報は細目にチェックしておきたいところですね。
あ、そうそう、そう言えば、嫁にこんな質問もしてみたんです。
「今のkourakuは誰に似てるかな?」
「(春風亭)昇太さん」
お後がよろしいようで・・・
アルバイトの方を募集中!
シーブレインでは、一緒に働いてくれるアルバイトの方を募集しております。
興味がある方は、下記リンクをチェックしてください。たくさんのご応募お待ちしております!
アルバイト募集に関する詳細はこちら