なんかCoffeescriptをGruntでコンパイルして、concatしたりとかだるいなーってずーっと思ってました。
Classとかを他のファイルから参照しようとするとwindow.classNameとか@classNameとかにしないといけないですし、ファイル名順に結合するので、アルファベット順で後ろにくるクラスを読もうとするとエラー吐いたり、いまいち依存関係が見えなかったり。
小規模な開発であれば問題ないのですが、Coffeescriptで大量にClassを作ったりすると、結構大きな問題になってきます。かといってrequire.jsとか面倒くさい。
というわけで、最近流行のbrowserifyを使ってみました。
npmとbrowserifyを使ったクライアントサイドのウェブアプリ開発
Browserify: それはrequire()を使うための魔法の杖
ざっくり言うと、ブラウザで、node.jsのようなrequireが使えるようになるツールです。
たとえば、以下のようなHoge.coffeeがあるとすると
class Hoge piyo: -> module.exports = Hoge
以下のコードで、読み込んでくることができるという代物です。
Hoge = require("./Hoge") hoge = new Hoge()
debowerifyとかをtransformに指定しておくと、bowerでインストールしたモジュールなんかも取ってこれるので、大変素敵です。
$ = require("jquery")
それをgruntでファイル監視して自動化するようにしたのがこちらです。
module.exports = function(grunt) { grunt.initConfig({ dir: { coffee: 'coffee', javascripts: 'javascripts' }, esteWatch: { options: { dirs: [ 'coffee/**' ], extensions: ['coffee'], } coffee: function(filepath) { return ["browserify"]; } }, browserify: { dist: { files: { 'javascripts/all.js': ['coffee/all.coffee'] }, options: { transform: ['coffeeify', "debowerify"], browserifyOptions: { extensions: ['.coffee'] } } } } }); grunt.loadNpmTasks('grunt-browserify'); grunt.registerTask('default', ['esteWatch']); };
transformにcoffeeifyを設定しておくと、CoffeeScriptでもコンパイルできるようになります。
browserifyOptionsのextensionsに.coffeeを指定しておくと、CoffeeScriptのファイルでも拡張子を省略してrequireできました。
名前空間も汚染しないし、依存するClass等は明示的になるし、読み込み順に左右されないJSを書くことができるようになります。その代わり、$ = require(“jquery”)等は各ファイルで行う必要があります。実行時には一度しか読み込まれないようなので、パフォーマンス的にもよろしいです。
GruntでBowerしたり、Coffeeしたり、ConcatしてJSを書いている人にはホントに便利です。