CoffeeScriptの名前空間に対する本質的なサポートはありますか?
適切な名前空間は、coffeescriptが本当に役立つもののように思えますが、これがサポートされていることを示唆するものは何も見つからないようです。
独自の「名前空間」(閉じた関数)とグローバル名前空間の両方でクラスを簡単に参照できるようにする方法は、クラスをすぐに割り当てることです。例:
# Define namespace unless it already exists
window.Test or= {}
# Create a class in the namespace and locally
window.Test.MyClass = class MyClass
constructor: (@a) ->
# Alerts 3
alert new Test.MyClass(1).a + new MyClass(2).a
ご覧のとおり、ファイル内ではMyClass
として参照できますが、外部で必要な場合はTest.MyClass
として使用できます。 Test名前空間にのみ必要な場合は、さらに単純化できます。
window.Test or= {}
# Create only in the namespace
class window.Test.MyClass
constructor: (@a) ->
私はこのパターンを「名前空間」に使用することを好みます。これは実際には名前空間ではなくオブジェクトツリーですが、次のような役割を果たします。
アプリの起動時に、名前空間をグローバルに定義します(環境に基づいて、window
をexports
またはglobal
に置き換えます。
window.App =
Models: {}
Collections: {}
Views: {}
次に、クラスを宣言する場合は、次のようにすることができます。
class App.Models.MyModel
# The class is namespaced in App.Models
そして、あなたがそれを参照したいとき:
myModel = new App.Models.MyModel()
名前空間を定義するグローバルな方法が気に入らない場合は、クラスの前に行うことができます。
window.App.Models ?= {} # Create the "namespace" if Models does not already exist.
class App.Models.MyModel
これが私の個人的な実装です:
https://github.com/MaksJS/Namespace-in-CoffeeScript
ブラウザでの使用方法:
namespace Foo:SubPackage1:SubPackage2:
class Bar extends Baz
#[...]
CommonJS環境での使用方法:
require './path/to/this/file' # once
namespace Foo:SubPackage1:SubPackage2:
class Bar extends Baz
#[...]
Wikiの名前空間に関するセクションから: https://github.com/jashkenas/coffee-script/wiki/FAQ
# Code:
#
namespace = (target, name, block) ->
[target, name, block] = [(if typeof exports isnt 'undefined' then exports else window), arguments...] if arguments.length < 3
top = target
target = target[item] or= {} for item in name.split '.'
block target, top
# Usage:
#
namespace 'Hello.World', (exports) ->
# `exports` is where you attach namespace members
exports.hi = -> console.log 'Hi World!'
namespace 'Say.Hello', (exports, top) ->
# `top` is a reference to the main namespace
exports.fn = -> top.Hello.World.hi()
Say.Hello.fn() # prints 'Hi World!'
あなたは本当にCoffeeToasterをチェックする必要があります:
https://github.com/serpentem/coffee-toaster
有効にすると、必要に応じてクラスへの名前空間宣言としてフォルダーの階層を使用するパッケージシステムが付属しています。その後、次のように、複数のファイルからクラスを拡張したり、インポートや息子を実行したりできます。
#<< another/package/myclass
class SomeClass extends another.package.MyClass
ビルド構成は非常にミニマリストでシンプルであり、明白になっています。
# => SRC FOLDER
toast 'src_folder'
# => VENDORS (optional)
# vendors: ['vendors/x.js', 'vendors/y.js', ... ]
# => OPTIONS (optional, default values listed)
# bare: false
# packaging: true
# expose: ''
# minify: false
# => HTTPFOLDER (optional), RELEASE / DEBUG (required)
httpfolder: 'js'
release: 'www/js/app.js'
debug: 'www/js/app-debug.js'
デバッグプロセスやその他の便利な機能を簡単にするために、ファイルを個別にコンパイルするデバッグオプションもあります。
それが役に立てば幸い。
次のように書くことができることに注意してください。
class MyObject.MyClass
constructor: () ->
initializeStuff()
myfunction: () ->
doStuff()
object/nsMyObjectを宣言した場合。
そして、私たちがそれに取り組んでいる間、これがjquery-ns-functionの私の実装です:
(function($) {
$.namespace = function(namespace, initVal) {
var nsParts = namespace.split("."),
nsPart = nsParts.shift(),
parent = window[nsPart] = window[nsPart] || {},
myGlobal = parent;
while(nsPart = nsParts.shift()) {
parent = parent[nsPart] = parent[nsPart] || {};
}
return myGlobal;
}
})(jQuery);
Requirejs.orgまたは同様の戦闘テスト済みモジュールローダーを使用することを強くお勧めします。特に非同期でロードしたい場合。
単純で簡単で素朴なアプローチを無視すると、独自の名前空間/モジュールスキームを作成するのは非常に困難です。
ファイルを構造化し、バックボーンとケーキと組み合わせてコーヒースクリプトを使用する最良の方法を学ぶのにも忙しいので、私は smallを作成しましたgithub のプロジェクトは、それを自分自身の参照として保持するために、ケーキやいくつかの基本的なことについても役立つかもしれません。すべての.js(ケーキコンパイル済みファイルを含む)はwwwフォルダーにあるため、ブラウザーおよびすべてのソースファイル(ケーキ構成を除く)で開くことができます。 srcフォルダにあります。この例では、すべての.coffeeファイルがコンパイルされてone出力.jsファイルに結合され、htmlに含まれます。
StackOverflowでの回答のいくつかに基づいて、コードの残りの部分に「名前空間」を公開する小さなutil.coffeeファイル(srcフォルダー内)を作成しました。