是否可以在同一个Typescript项目中混合使用AMD和CommonJS模块

时间:2014-03-13 13:20:33

标签: node.js typescript durandal amd commonjs

我尝试使用Typescript将Durandal与node.js服务器集成,以便在服务器端和客户端定义模块。

我遇到的问题是Durandal强烈依赖于RequireJS和AMD风格的定义模块,我不想在服务器端引入,因为它使用RequireJS我没有任何有机会在客户端上运行CommonJS-ish模块(node.js的默认值)。

棺材中的最后一个问题是,我发现无法定义哪些文件应该编译为AMD模块,哪些文件可以通过tsc定义为CommonJS - 这似乎是最简单的解决方案。

我不认为分离客户端部件和服务器部件是一种选择,因为很多代码对于这两个部件都是通用的。

所以,我的问题有三个:

  • 有没有办法在相同的Typescript项目中混合AMD和CommonJS模块(最好使用NodejsTools)

  • 如果没有,是否有办法强制Durandal使用CommonJS文件来加载视图/视图模型等等

  • 如果这一切都不可能(并且明智)在node.js服务器上使用AMD模块

任何想法都受到高度赞赏

4 个答案:

答案 0 :(得分:6)

  

有没有办法在相同的Typescript项目中混合AMD和CommonJS模块(最好使用NodejsTools)

是。使用grunt-ts。请参阅https://github.com/basarat/demo-fullstack/tree/master/src,特别是gruntfile常用文件:https://github.com/basarat/demo-fullstack/blob/master/src/Gruntfile.js#L4-L6 commonjs:https://github.com/basarat/demo-fullstack/blob/master/src/Gruntfile.js#L26 amd:https://github.com/basarat/demo-fullstack/blob/master/src/Gruntfile.js#L37

答案 1 :(得分:3)

这是一个长期评论而非答案

我一直在寻找同样的问题,我确实尝试过grunt-ts,gulp-ts,Webstorm文件观察器,cmd行脚本,除了Visual Studio之外的一切,因为我害怕依赖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'导出模块'的能力

它有效但...... 但我不是百分之百的幸福,对许多文件......它闻起来......太多的目标 Gruntfile难以阅读(太大),我需要记住或记录它是如何工作的,直到我有时间完全自动化它(如果合理的话)

我认为以下选项对DRY和KISS意义更有意义 但我也不是100%在所需的样板上出售。

Typescript模块应该是模板化的,所以当它们编译时,模块可以具有我想要的'形状',而不依赖于额外的构建步骤

某些选项不需要编译多个目标或文件重复

UMD (Universal Module Definition)

Browserify

amdefine

RequireJs in Node

Requirejs LOADING MODULES FROM COMMONJS PACKAGES

答案 2 :(得分: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>

但是特定的TypeScript项目只能是AMD或常见的js - 因为编译器选项是每个项目 此问题的解决方案可能是将TypeScript子项目(.prj)嵌套在主Web应用程序的子目录中,如下所示:

+- / (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 )

答案 3 :(得分:-2)

只需创建2个* .njsproj文件的副本。服务器的一个副本和客户端代码的一个副本。在客户端项目中,只保留publicview(排除与服务器相关的所有内容)。仅保留与服务器端项目中的服务器相关的内容。确保客户的项目有AMD,服务器有CommonJs。享受!