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にソースマップを出力するよう修正