2014-03-13 95 views
10

我試圖將Durandal與使用Typescript的node.js服務器集成在一起,以在服務器和客戶端定義模塊。是否有可能在同一個Typescript項目中混合使用AMD和CommonJS模塊

我遇到的問題是Durandal強烈依賴於RequireJS和AMD定義模塊的樣式,我不想在服務器端引入它,因爲它使用RequireJS我沒有任何運行的機會客戶端上的CommonJS-ish模塊(默認爲node.js)。

在棺材上的最後一顆釘子是,我沒有發現任何的定義方式哪些文件應該被編譯爲AMD模塊和一個由TSC CommonJS的 - 這似乎是一個簡單的解決方案。

我不認爲分離客戶端部分和服務器部分是一個選項,因爲大量的代碼將是共用的兩個部分。

所以,我的問題有三個方面:

  • 有沒有辦法在同一打字稿項目(最好使用NodejsTools)

  • 如果不要混用AMD和CommonJS的模塊,有沒有辦法給力迪朗達爾與CommonJS的文件工作負載的意見/的ViewModels等

  • 如果沒有這個可能,纔有可能(和明智)到n個採用AMD模塊ode.js服務器

任何想法受到了高度評​​價

回答

6
+1

啊,這看起來像我正在尋找一個解決方案。謝謝 – Slawek

+1

注意:我只是更新了這個演示,以至於更加棒 – basarat

0

它應該是可以混合要求基於AMD文件和常見的JS。那麼你的HTML頁面將包括類似下面的腳本:

<script src="/tscode_common/common_js_file.js"></script> 
<script data-main="/tscode_amd/tscode_amd_config.js" type="text/javascript" src="lib/require.js"></script> 

但具體的打字稿的項目只能是AMD或共同JS - 因爲編譯器選項是每個項目。
解決這個問題,可能是在你的主要的Web應用程序類似下面的子目錄巢打字稿分項目(.PRJ):

+-/(base directory for web application) 
+- /main_app.prj (main web app project file) 
+- index.html 
+- /tscode_common/ (put all common js files here) 
+- /tscode_common/common_js.prj (project file with commonjs options) 
+- /tscode_common/common_js_file.ts (common ts files) 
+- /tscode_amd/ (put all amd files here) 
+- /tscode_amd/amd_js.prj (project file with amd options) 
+- /tscode_amd/tscode_amd_config.ts (require config file) 
+- /tscode_amd/amd_js_file.ts (amd ts files) 
-2

只需創建* .njsproj文件2份。一個副本用於服務器,一個用於客戶端代碼。在客戶端項目中只保留publicview(排除與服務器相關的所有內容)。只保留與服務器端項目中的服務器相關的內容。確保客戶端的項目具有AMD並且服務器具有CommonJs。請享用!

3

這是一個比一個答案

我一直在尋找同樣的問題,更多的是長註釋的,我也嘗試咕嚕-TS,吞掉-TS,Webstorm文件觀察家,CMD行腳本,但一切因爲我害怕依賴IDE進行構建過程(Webstorm觀察者是一個例外,因爲它與咕嚕聲或任何其他觀察者相同,易於複製,並且它只是方便地嘗試配置); 我目前正在使用內部模塊,但只編譯帶有文件過濾器的'導出'模塊(基於擴展名,更清潔) 和tsc加載引用鏈時;

我根據我想要實現的,在節點,瀏覽器,角,測試,摩卡,茉莉等不同的輸出目標...

像:

/MyModule 
myModule.ts 
myModule.d.ts 
myModule.mdl.ts (exports amd) 
myModule.export.ts (exports commonjs) 
myModule.test.ts (exports mocha test, no KARMA!) 
etc... 

不是依靠TS「輸出模塊」的能力

它的工作原理,但... 但我不是100%滿意,將多個文件....它的氣味......太多的目標 Gruntfile很難閱讀(太大),我需要記住或記錄它是如何工作的ks直到我有時間完全自動化(如果可能的話)

我認爲下面的選項對DRY和KISS的意義更有意義 但我也不是100%的需要的樣板。

打字稿模塊應該是模板化的,所以當他們編譯模塊可以有「形」我想不依靠額外的構建步驟

了一些選項,不需要編譯多個目標,或文件複製,

UMD (Universal Module Definition)

Browserify

amdefine

RequireJs in Node

Requirejs LOADING MODULES FROM COMMONJS PACKAGES

相關問題