如果生成的JavaScript文件最終需要連接在一起以便在客戶端使用,那麼在CoffeeScript文件中執行依賴管理的最佳方式是什麼?CoffeeScript中的客戶端依賴管理
對於服務器端的CoffeeScript,我可以使用'require'關鍵字來要求其他javascript代碼。當這是爲客戶端應用程序編譯具有依賴關係樹時,根據需求計算並生成一個串聯的獨立JavaScript文件。無論如何以通用的方式做到這一點?
如果生成的JavaScript文件最終需要連接在一起以便在客戶端使用,那麼在CoffeeScript文件中執行依賴管理的最佳方式是什麼?CoffeeScript中的客戶端依賴管理
對於服務器端的CoffeeScript,我可以使用'require'關鍵字來要求其他javascript代碼。當這是爲客戶端應用程序編譯具有依賴關係樹時,根據需求計算並生成一個串聯的獨立JavaScript文件。無論如何以通用的方式做到這一點?
通常,對於JavaScript(和CSS)的客戶端打包,您需要某種資產打包插件。我們使用Jammit,但還有很多其他選項:Sprockets,Django-Compress ...以及更多。
Villain(一個適用於瀏覽器的CoffeeScript遊戲引擎)定義了這樣做的函數(依賴關係管理和js連接)。
的代碼是在這兩個文件:
determineDependencies()
,wrapModule()
和bundleSources()
wrapModule()
我使用它here(請參閱'bundle'
Cake任務)。
注:我剛剛宣佈'main'
模塊的構建目錄,小人掃描我的編譯JS文件建立依賴關係樹(開始index.js
),然後創建一個包含對手的require
更換和我所有的相關代碼排序,一個JavaScript包文件正確包裝。
Villain的作者在與Villain合作的CoffeeScript遊戲orona中使用它。
對於客戶端的依賴關係管理,我使用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())
)
另一個選擇是使用CoffeeToaster,它使用另一種方法,而不是實現AMD/CJS模塊模式。
我用(我猜我仍然在使用)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']