ES6を使ったフロントエンドの開発環境を作ってみた。概要としては、タスクランナーにgulpを使い、いくつかのソースファイルにわかれたES6のコードをbrowserifyで1つにまとめて、Babelで現行のブラウザで動くJavaScriptコードにトランスパイルする。他にuglifyで難読化やソースマップの出力、HTMLやCSSのビルドも行う。
前提としてnode.js, npmがインストールしてあるものとする。
俺用完成コード:https://github.com/tyfkda/FrontendTemplate (追記:本記事から多少内容が変更されてます)
git clone, npm install して使える。
プロジェクトディレクトリの作成
プロジェクト用にディレクトリを作り、その中で環境を構築していく:
$ mkdir ~/gulptest # プロジェクト用ディレクトリ作成 |
npm installとすることで必要なパッケージがpackage.jsonに記録され、他の環境でnpm installしたときに自動的に反映されるようになる--save-devで、開発時にのみ必要なモジュールという指定になる-gを指定しない場合にはローカル(package.jsonがあるディレクトリのnode_modules以下)にパッケージがダウンロードされ保存される
- 実際のところ、npmで使用する
package.jsonのscriptにコマンドを記述してやればgulpをグローバルにインストールする必要はないが、以降の説明の都合上
gulpの設定ファイル作成
gulpを動かすのに設定ファイルgulpfile.jsが必要だが、それもES6で統一して書くためにgulpfile.babel.jsというファイル名にする。これはバッチファイルみたいなもので、ソースの変換などどういう処理をさせるかを記述する:
// gulpfile.babel.js |
ES6を使うためには.babelrcという、Babelに関する設定ファイルに使用するプリセットを記述する:
{ |
この状態でgulpを実行するとdefaultのタスクが実行される:
$ gulp |
ES6をトランスパイルするタスクの作成
ES6を現行のブラウザ上で動くJavaScriptコードに変換するために、Babelを使う。実際にはbrowserifyのtransformでbabelifyを指定する。
まずシェルで、npmのパッケージをインストールする:
$ npm install --save-dev browserify babelify vinyl-source-stream vinyl-buffer \ |
gulpにES6を変換するタスクを追加:
// gulpfile.babel.js |
エントリポイントとなるファイルをsrc/main.jsと指定しているので、テストとして適当にES6のソースファイルを用意して
// src/main.js |
// src/util/util.js |
ビルドしてみると
$ gulp es6 |
requireをまとめてES5に変換され圧縮されたコードが public/main.js にが出力される:
$ cat public/main.js |
gulp-sourcemapsでソースマップ出力gulp-uglifyでJSコードの圧縮vinyl-source-streamやvinyl-bufferはgulpのストリームを操作する?よくわからんbrowserSync.reload()で、serverで開いたページのリロードをかける(後述)- browserifyよりもwebpackの方が新しくて良い?という話だが、ひとまずこれで…
HTMLの変換
HTMLも1つのファイルにすべて書くのではなく、パーツに分けてインクルードしたり圧縮したりしたいので、いろいろモジュールを使う。HTMLのテンプレートエンジンとして、ejsを使い、gulp-htmlminで圧縮する:
$ npm install --save-dev gulp-ejs gulp-htmlmin |
// gulpfile.babel.js |
- アンダースコアで始まるファイル名はインクルードされるファイルという取り決めにして、ビルドから除外する
gulp-ejsがテンプレートエンジンgulp-htmlminで圧縮(内部ではhtml-minifierを使ってる)
<!-- src/index.html --> |
<!-- src/html/_footer.html --> |
gulpのタスクを実行すると、インクルードがまとめられ、圧縮されたHTMLがpublic/index.htmlに出力される:
$ gulp html |
SASSの変換
CSSはSASSを変換して作るようにする:
// gulpfile.babel.js |
/* default.scss */ |
npm installは推測してください- gulp-plumber で、文法エラーが出てもgulpが終了しないようにする
サーバを起動するタスク
// gulpfile.babel.js |
- browser-sync で指定のディレクトリ以下を返すサーバを立ち上げる
- http://localhost:3000/ にサーバが立ち上がる
- なぜわざわざサーバを立ち上げるのかは、次の項目を参照
ファイルの変更を監視して自動ビルド
シェルからgulpの呼び出しは起動に結構時間がかかる。gulp.watchでファイルを監視して、変更があったらタスクを実行するようにして、起動時間を気にしなくてよいようにする。
// gulpfile.babel.js |
- ES6などのタスクが実行された時には
browserSync.reload()が指定されているので、自動的にリロードがかかる
最後に、一番最初に定義したdefaultタスクを修正する:
// gulpfile.babel.js |
以上で、シェルからgulpのデフォルトタスクを動かす
$ gulp |
でサーバが起動し、ソースに変更があると自動ビルドがかかり、ブラウザで開いているページが自動的にリロードされる。
- 2016/01/07:
gulp-minify-htmlとgulp-minify-cssがdeprecatedということなのでgulp-htmlminとgulp-cssnanoに変更 - 2015/12/27: gulpfileをES6で書く - Qiitaを参考にgulpfileもES6で書けるように、babelifyでv7.x系を利用する - to-Rを参考にbabelifyの7系を使うように、またbrowserifyやuglifyで変換したJavaScriptにソースマップを出力するよう修正