2014-03-13 50 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

相关问题