- 更新日: 2015年3月23日
- jQuery & JavaScript
Browserify + GulpでクライアントのJavaScript / CoffeeScriptでrequire
先日以下の記事で、クライアントサイド JavaScript での require による依存解決の方法を読みました。一言で言うと Browserify というライブラリを使って、クライアント側 JavaScript でも、モジュールをファイルごとに分割して require で読み込むための手順。
Browserifyでrequireを使ってjavascriptの依存関係をすっきりにしてみる – ぼくのかんがえたさいきょうのうぇぶさーびす
これを真似したくて、昨日日曜日に試したのでその記録です。
ぼくうぇぶさんのページでは、JavaScript のビルドツール(タスクランナー)として Grunt を使ってありますが、個人の好みにより私は Gulp を使用します。Grunt も Gulp も JavaScript/CSS などフロントエンド用のビルドツールで、C言語の Make、Ruby の Rake に相当するようなツールです。
browserify の公式ページ&ドキュメント。
Browserify
https://github.com/substack/node-browserify
gulp の公式ページ&ドキュメント。
gulp.js – the streaming build system
https://github.com/gulpjs/gulp/blob/master/docs/getting-started.md
— 環境 —
Mac OS X
node v0.10.28
npm 2.4.1
gulp CLI version 3.8.11
browserify 9.0.3
では以降、作業記録です。
Gulp と Browserify をインストール
node.js が入ってなかったら最初に入れておきます。私の環境では、Mac 上 Homebrew でインストール。
1 2 3 |
$ brew install node.js |
デフォルトでは brew install node.js で、npm もインストールされます。
1 2 3 4 5 6 |
$ node -v v0.10.28 $ npm -v 2.4.1 |
続いて、npm で gulp と browserify を入れる。-g オプションでグローバルにインストール。
1 2 3 4 5 6 7 8 |
$ npm install -g gulp $ npm install -g browserify $ gulp -v [22:03:59] CLI version 3.8.11 $ browserify -v 9.0.3 |
必要な npm パッケージを作業ディレクトリにインストール
次に、作業用のディレクトリ作成して、必要となる npm パッケージをインストールしていきます。
1 2 3 4 5 6 |
$ mkdir -p ~/work/browserify-gulp-test $ cd ~/work/browserify-gulp-test $ mkdir dest $ mkdir lib |
dest はビルドした JavaScript ファイルを配置するディレクトリ、lib は後ほど作成する CoffeeScript のモジュールを配置するディレクトリです。
続いて必要な npm パッケージのインストール。どうやら gulp, browserify などは、作業ディレクトリにもインストールする必要がある模様。その他、CoffeeScript を使えるようにするモジュールを入れます。
1 2 3 |
$ npm install gulp browserify coffee-script coffeeify vinyl-source-stream |
-g オプションを付けないと、作業中ディレクトリに node_modules というディレクトリが作成されて、そこに npm ライブラリが入る。
coffee-script: gulp のタスクを CoffeeScript で書けるようにする。
coffeeify: CoffeeScript で書いたファイルを Browserify でビルドできるようにする。
vinyl-source-stream: 謎。よく分からんけどなんか必要らしい。
また、調査中に npm install コマンドで –save-dev オプションを付ける書き方を何度も見たのですが、これは…
1 2 3 4 |
$ npm init $ npm install --save-dev gulp browserify coffee-script coffeeify vinyl-source-stream |
と npm init して –save-dev オプションを付けてインストールすると、npm init で生成される package.json に、インストールしたライブラリの情報を書き込んでくれるそうです。node.js ライブラリとして公開する場合は、package.json が必要とのことですが、今回は本題から外れるのでスキップ。
npmでnode.jsのpackageを管理する – Qiita
npmの使い方の勉強メモ1(node.js=v0.11.16, npm=2.3.0) – msakamoto-sfのはてなブログ
動作テスト用のファイルを作成
続いて、CoffeeScript ファイルを作成していきます。四角形、三角形、円の面積を求めるモジュールとそれを使う main.coffee を作りました。以下のようなディレクトリ構成になり、モジュール用のファイルは lib ディレクトリ以下に配置します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
browserify-gulp-test/ | dest/ | lib/ | | circle.coffee | | rectangle.coffee | | shape.coffee | | triangle.coffee | node_modules/ | gulpfile.coffee | main.coffee | main.html |
lib/shape.coffee
1 2 3 4 5 6 7 8 9 10 11 |
class Shape constructor: (x = 0, y = 0) -> # instance variables @x = x @y = y # public instance method to be overridden area: -> "Can not calculate my area!" module.exports = Shape |
lib/rectangle.coffee
1 2 3 4 5 6 7 8 9 10 |
Shape = require './shape' class Rectangle extends Shape constructor: (x, y) -> super(x, y) area: -> @x * @y module.exports = Rectangle |
lib/triangle.coffee
1 2 3 4 5 6 7 8 9 10 |
Shape = require './shape' class Triangle extends Shape constructor: (x, y) -> super(x, y) area: -> @x * @y / 2 module.exports = Triangle |
lib/circle.coffee
1 2 3 4 5 6 7 8 9 10 |
Shape = require './shape' class Circle extends Shape constructor: (r) -> super(r) area: -> Math.PI * @x * @x module.exports = Circle |
main.coffee
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Rectangle = require './lib/rectangle' Triangle = require './lib/triangle' Circle = require './lib/circle' # Rectangle rec = new Rectangle(3, 5) alert rec.area() # => 15 # Triangle tri = new Triangle(3, 5) alert tri.area() # => 7.5 # Circle cir = new Circle(3) alert cir.area() # => 28.274333882308138 |
Browserify を使うと、以上のように require でモジュールの他ファイルを読み込むように書けます。すごい。require で指定するファイル名で拡張子(.coffee)を省略していますが、これは後述する gulpfile.coffee で省略するように設定することで利用できる。
gulpfile.coffee を作成して Gulp でビルド
以下の gulpfile.coffee を作成。
gulpfile.coffee
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
gulp = require 'gulp' browserify = require 'browserify' source = require 'vinyl-source-stream' gulp.task 'build', -> browserify entries: ['./main.coffee'] # ビルド対象のファイルを指定 extensions: ['.coffee', '.js'] # 省略できる拡張子の指定 .transform 'coffeeify' # CoffeeScript ファイルを Browserify でビルド .bundle() .pipe source 'main.js' # ビルド後のファイル名 .pipe gulp.dest './dest' # ビルド後のファイルを配置するディレクトリ gulp.task('default', ['build']); # デフォルトのタスクを指定 |
続いて gulp でビルド実行。
1 2 3 |
$ gulp |
gulpfile.coffee で default のタスクを書いておくと、コマンドラインでタスクの指定を省略して gulp のみでビルド実行した時に、default に書いたタスクが実行される。
これで CoffeeScript から素の JavaScript にコンパイルされたファイルが、dest/main.js に生成されました。
テスト用の HTML ファイルを作成
コンパイルされた dest/main.js を読み込んで、ブラウザで実行する HTML ファイルを作成します。
main.html
1 2 3 4 5 6 7 8 9 10 11 |
<!DOCTYPE HTML> <html lang="ja"> <head> <meta charset="UTF-8"> <title></title> <script src="./dest/main.js"></script> </head> <body> </body> </html> |
この HTML ファイルをブラウザで実行すると、以下の順で alert が表示されます。
15
7.5
28.274333882308138
以上で完成です!長かった、お疲れ様でした。今回作成したテスト用プロジェクトは、GitHub に上げていますのでご自由にご参考ください。
https://github.com/takafumir/browserify-gulp-test
さらなる課題や類似ツールについて
実践で使う上でのさらなる課題としては、source maps やファイルの変更監視などがある。この辺りについては以下に譲ります。
JavaScript – gulpとBrowserifyでJSをビルドしてみた – Qiita
SassのデバッグにSource Mapsを使うべきたくさんの理由 | Dress Cording
また Browserify と同じように JavaScript での依存を解決するツールとして、webpack というものもあるそうです。browserify と webpack の比較は以下。
今回の記事内容、Gulp + Browserify による require 実現については以下のページ等も参考にしました。とても助かりました、ありがとうございます。以上ですが、つっこみもお待ちしております。
- – 参考リンク –
- gulp.jsで始めるWeb開発爆速自動化入門:便利なGruntの弱点を補うgulp.jsのインストールと使い方 (1/3) – @IT
- 2015年はgulpで決まり!開発環境をgruntから乗り換えよう!(コーダー編)
- クライアントサイドでもモジュールシステムを実現するBrowserify入門 | 技術コラム | つみきブログ
- JavaScript – Browserify: それはrequire()を使うための魔法の杖 – Qiita
- gulp と browserify と vinyl の話 –
- jQuery & JavaScript の関連記事
- React.js用にESLintをインストールして設定、JavaScriptコードを楽に検証しよう
- JavaScriptでHTMLコメント要素を取得する
- YahooのJavaScriptマップAPI(YOLP)で地図を描画
- HTML5のGeolocation APIで現在地の位置情報(緯度/経度)を取得するJavaScriptコード
- JavaScriptでキャメルケースを単語に分割
- JavaScript/jQueryでDOM要素が存在するか確認する方法
- JavaScriptでスクロールを一時的に止める
- JavaScriptでcapitalize、アルファベット一文字目を大文字にする
- JavaScriptでrangeオブジェクトから座標を取得するコード
- CoffeeScript入門、クラス継承とメソッドのオーバーライド
Leave Your Message!