2010-11-10 99 views
12

如果生成的JavaScript文件最終需要連接在一起以便在客戶端使用,那麼在CoffeeScript文件中執行依賴管理的最佳方式是什麼?CoffeeScript中的客戶端依賴管理

對於服務器端的CoffeeScript,我可以使用'require'關鍵字來要求其他javascript代碼。當這是爲客戶端應用程序編譯具有依賴關係樹時,根據需求計算並生成一個串聯的獨立JavaScript文件。無論如何以通用的方式做到這一點?

回答

2

通常,對於JavaScript(和CSS)的客戶端打包,您需要某種資產打包插件。我們使用Jammit,但還有很多其他選項:Sprockets,Django-Compress ...以及更多。

2

Villain(一個適用於瀏覽器的CoffeeScript遊戲引擎)定義了這樣做的函數(依賴關係管理和js連接)。

的代碼是在這兩個文件:

  • cake.coffee,看,determineDependencies()wrapModule()bundleSources()
  • brequire.coffee,一個需要更換的瀏覽器,與wrapModule()
使用

我使用它here(請參閱'bundle' Cake任務)。

注:我剛剛宣佈'main'模塊的構建目錄,小人掃描我的編譯JS文件建立依賴關係樹(開始index.js),然後創建一個包含對手的require更換和我所有的相關代碼排序,一個JavaScript包文件正確包裝。

Villain的作者在與Villain合作的CoffeeScript遊戲orona中使用它。

1

對於客戶端的依賴關係管理,我使用requirejs作爲javascript和coffeescript源代碼。可以使用requirejs插件來加載本地咖啡文件,但我更願意「編譯」爲js。

requirejs也提供/使用r.js optimizer。它可以用來將一組js文件聚合成一個並縮小它。你不必指定要聚合的文件,而是你的「main.js」需要的每個模塊的依賴性定義。 (功能符合你的要求)

我喜歡requirejs的東西,它「promots」創建模塊並聲明顯式依賴。

# A.coffee 
define(() -> 
    class A 
    constructor: (@c1, @c2) -> 
     @c2 ?= 1 

    m1 :() -> 
     "hello" 

    toString :() -> "#{@c1}#{@c2}" 
) 


# B.coffee 
define(['A'], (A) -> 
    a = new A(33) 
    console.log(a, a.m1()) 
) 
1

我用(我猜我仍然在使用)requirejs,但我已經開始找到它是相當笨拙。我的很多文件最終在頂部有10-12個進口,只佔用大量空間,看起來不太好。

對於一個新項目,我嘗試browserify。這很棒!如果你使用grunt(你應該),你可以做一個監視任務來改變你的代碼。 grunt-browserify也提供了做咖啡轉換的功能。

https://github.com/jmreidy/grunt-browserify

因此,在你的手錶任務的Gruntfile.coffee看起來是這樣的:

watch: 
    files: [ 
    "app/**/*.coffee" 
    ] 
    tasks: "browserify" 

browserify: 
    'build/app.js': ['app/**/*.coffee'] 
    options: 
    transform: ['coffeeify']