目次
数ページのサイトとはいえテンプレ化はしたい、includeを使うと共通要素を外部ファイル化できて効率いいよね。
サンプルとしてファイルは以下におてます。
https://github.com/shigekitakeguchi/yarn-webpack-ejs
ちょっとした、例えばブランドサイトとかキャンペーンサイト、小規模な企業や組織、お店のサイトというと構成によっては1ページってこともあるけど数ページから20ページくらいの規模になると思う。
いやいやもっとあるよってことになるかもしれないけど今回紹介しようと思うやり方は数ページから20ページくらいの規模のものが便利なんじゃないかな。
それ以上のサイトになるともうちょっと本格的な静的サイトジェネレーターとかを検討したほうが良いと思う。
数ページとはいえヘッダーやフッター、あとmeta要素やナビゲーション、細かいところでいうとGoogle Analitycsの記述ってサイト全体で共通するものを手作業、ベタ書きでやるってちょっと変更とかあるとツラい。ひと昔前だったらサーバー側でssiなんてものもあった。
サーバー管理している人にセキュリティ的懸念があるよと言われながら設定を依頼したりローカルで開発する時はMAMPとか使っているとhttpd.confを変更してでも本番の環境でうまく動かなかったり、そもそも今だったらS3とかもちろんssi使えない。
じゃあどうするかというとmiddlemanだの静的サイトジェネレーターの出番なんだけどmiddlemanでやるとなるともうすべてmiddlemanにおまかせしないとだめだったりする。
それならってことでwebpackでincludeつかえるようなパッケージないかなと探したら思ったよりもなくて調べるとhtml-webpack-pluginってのとejs-render-loaderを組み合わせるとできそうだってことでやってみました。
テンプレートエンジンに何を使うかなんだけど経験的なものだけなんだけどejsでだいたいがおさまるかなというのがある。
EJS Embedded JavaScript templates (https://github.com/mde/ejs)
プログラム的な要素ががっしり使ってHTMLを出力するってことになるとカッコがない、閉じ要素がないってことでJadeの方が見通しが良かったりするんだけど今回はejsです。 Node.jsのフレームワークであるexpressを利用したことない人にはejs馴染みないと思いますが扱いやすいテンプレートエンジンだと思います。
初期設定
1 | node -v |
まずはお決まりのNode.js入ってるか確認。
1 | yarn -v |
Yarn(もしくはnpm)も入ってるか確認。個人的には完全にYarnに移行しました。
1 | webpack -v |
webpackも入っているか確認。どうも2.1なのか2.0からなのかextract-text-webpack-pluginが使えないような 不具合があるようで1.1系を使ってます。
1 | webpack --version |
もし入ってなかったら今回はバージョン指定してインストールします。
1 | yarn add global webpack@1.14.0 |
1 | npm install -g webpack@1.14.0 |
以下yarnはnpmに置き換えて実行してもらえれば問題なしです。
どんなパッケージを使ってるか(package.json)
node-sassはグローバルで入っているはずなので不要かと思ったのですがエラーはかれたのでインストールしてます。scssをロードしてcssにコンパイルしてってのもいれてます。 もしpost-css的なものがいいとかautoprefixerいれたいとかあれば置き換えてもらえたらと思います。webpack使ってもろもろすると複雑になりがちなのでわかりやすいように最低限な感じです。
1 | { |
ファイル・フォルダ構成
まぁこんな感じの構成になってます。
1 | ├── app |
normalize.scssはわかりやすいように入れているだけです。 yarnなのでyarn.lockというファイルが入ってます。 appの直下がサーバーのドキュメントルートになります。
これがindex.htmlとして作られる元のindex.ejs
src/index.ejsからsrc/includesの中のheader.ejsとfooter.ejsをインクルードしてapp/index.htmlを作ってます。ここではincludesの記述方法をみてもらえれば大丈夫です。
1 |
|
webpack.config.js
webpackの設定ファイルです。 html-webpack-pluginというプラグインを使ってHTMLを作ってます。 browser-sync-webpack-pluginはbrowsersync(開いているブラウザすべてで同じ操作ができる的な)の機能だけではなくローカルサーバーとしても使えるので別でサーバー機能のパッケージは使っていません。
1 | var webpack = require('webpack'); |
今回ejsにインクルードしてHTMLをレンダリングするためにejs-render-loaderというパッケージを使っています。 HtmlWebpackPluginでtemplateとして扱うindex.ejsにこのように指定します。
1 | plugins: [ |
複数のページへ共通要素をインクルードすれば効率的にHTMLを管理できると思います。 例えばabout.html(index.htmlとは内容の違うHTML)を作る場合は以下のような感じで指定します。 about.ejsを用意してindex.ejsと同じように共通要素をインクルード指定しpluginsで生成するHTMLのファイル名、元となるejsを指定します。
1 | plugins: [ |