最初に

やり方1

  • 入力
    下記で何故、globalが取れるのかはWebModuleIdiomで確認して下さい
 1 ((global)->
 2   #エクスポーズをスマートにまとめてしまう方法
 3   "use strict"
 4   # Class
 5   ModuleName = ->
 6   # Header
 7   ModuleName["prototype"]["method"] = ModuleMethod
 8   # Implementation
 9   ModuleMethod = (Arg) ->
10   # Exports
11   if ("process" of global)
12     module["exports"] = ModuleName
13   global["ModuleName"] = ModuleName
14 )(
15   (this or 0)
16     .self or global
17 )
  • 出力
 1 (function(global) {
 2   "use strict";
 3   var ModuleMethod, ModuleName;
 4   ModuleName = function() {};
 5   ModuleName["prototype"]["method"] = ModuleMethod;
 6   ModuleMethod = function(Arg) {};
 7   if ("process" in global) {
 8     module["exports"] = ModuleName;
 9   }
10   return global["ModuleName"] = ModuleName;
11 })((this || 0).self || global);

やり方2

(なんかはやってる、処理を上で直接的に書けるから仕様変更には強そう)

  • 入力
 1 ((definition) ->
 2   # 定義する関数を引数にとる
 3   # ロードされた文脈に応じてエクスポート方法を変える
 4   if typeof exports is "object"
 5     # CommonJS
 6     module.exports = definition()
 7   else if typeof define is "function" and define.amd
 8     # RequireJS
 9     define definition
10   else
11     # <script>
12     MyModule = definition()
13 )(->
14   # 実際の定義を行う関数
15   "use strict"
16   MyModule = ->
17   MyModule:: = {}
18   MyModule()
19 )
  • 出力
 1 (function(definition) {
 2   var MyModule;
 3   if (typeof exports === "object") {
 4     return module.exports = definition();
 5   } else if (typeof define === "function" && define.amd) {
 6     return define(definition);
 7   } else {
 8     return MyModule = definition();
 9   }
10 })(function() {
11   "use strict";
12   var MyModule;
13   MyModule = function() {};
14   MyModule.prototype = {};
15   return MyModule();
16 });