Require.jsはActionScriptのimportのようにjsファイル同士の依存関係を崩さないよう非同期で読み込みつつ、多重読み込みなども防止してくれるライブラリ。
Require.jsを使えば細かくjsファイルを分割してもBackboneやjQuery等のライブラリを依存関係を保ちつつ読み込んでみる。
最小限のコードで挙動を確認してみる。(以降すべてCoffeeScript)
これを実行するとMyModelのmessageに定義された「Hello, World!」が出力される。
Backboneに必要なUnderscoreとjQueryはBackboneより先に読み込まれている。
require([ "libs/jquery-1.10.1.min" "libs/underscore.min" "libs/backbone.min" ], ($, _, Backbone) -> MyModel = Backbone.Model.extend({ message: "Hello, World!" }) MyView = Backbone.View.extend({ initialize: (options) -> console.log @model.message }) view = new MyView({ model: new MyModel() }) @ )
今度はRequire.jsの機能のdefineを使ってモジュールを作ってみる。
こちらも同じく「Hello, World!」が出力される。
define("myModule", [ "libs/jquery-1.10.1.min" "libs/underscore.min" "libs/backbone.min" ], ($, _, Backbone) -> MyModel = Backbone.Model.extend({ message: "Hello, World!" }) MyView = Backbone.View.extend({ initialize: (options) -> console.log @model.message }) return { modelClass: MyModel viewClass: MyView } ) require([ "myModule" ], (module) -> model = new module.modelClass() view = new module.viewClass({ "model": model }) @ )
require.configのshimでライブラリの依存関係をあらかじめ設定してみる。
実行結果は同様。
require.config( shim: "libs/backbone.min": deps: [ "libs/jquery-1.10.1.min" "libs/underscore.min" ] exports: "Backbone" ) define("myModule", [ "libs/backbone.min" ], (Backbone) -> MyModel = Backbone.Model.extend({ message: "Hello, World!" }) MyView = Backbone.View.extend({ initialize: (options) -> console.log @model.message }) return { modelClass: MyModel viewClass: MyView } ) require([ "myModule" ], (module) -> model = new module.modelClass() view = new module.viewClass({ "model": model }) @ )
今度はrequire.configのpathsを使ってライブラリのパスをあらかじめ定義しておく。
こちらも実行結果は同様。
require.config( paths: "jquery": "libs/jquery-1.10.1.min" "underscore": "libs/underscore.min" "backbone": "libs/backbone.min" ) define("myModule", [ "jquery" "underscore" "backbone" ], () -> MyModel = Backbone.Model.extend({ message: "Hello, World!" }) MyView = Backbone.View.extend({ initialize: (options) -> console.log @model.message }) return { modelClass: MyModel viewClass: MyView } ) require([ "myModule" ], (module) -> model = new module.modelClass() view = new module.viewClass({ "model": model }) @ )
今度はshimにもpathsで定義したパスを使ってみる。
require.config( paths: "jquery": "libs/jquery-1.10.1.min" "underscore": "libs/underscore.min" "backbone": "libs/backbone.min" shim: "backbone": deps: [ "jquery" "underscore" ] exports: "Backbone" ) define("myModule", [ "backbone" ], () -> MyModel = Backbone.Model.extend({ message: "Hello, World!" }) MyView = Backbone.View.extend({ initialize: (options) -> console.log @model.message }) return { modelClass: MyModel viewClass: MyView } ) require([ "myModule" ], (module) -> model = new module.modelClass() view = new module.viewClass({ "model": model }) @ )
require.configでの設定は一度きりなのでこれを無視すると、メインのコードはだいぶスッキリした。
参考:
RequireJS moduleについて – 文殊堂
java-ja.js #2 RequireJS実践編 – 文殊堂
[JS] JavaScriptをモジュール分割して開発できるRequireJSに入門 – YoheiM .NET