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

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

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

在棺材的最后一个钉子是,我发现没有办法定义哪些文件应该被编译为AMD模块,哪一个作为CommonJS由TSC – 这似乎是一个最简单的解决scheme。

我不认为分离客户端部分和服务器部分是一个选项,因为很多代码将是通用的两个部分。

所以,我的问题是三重的:

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

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

  • 如果这些都不可能的话,那么在node.js服务器上使用AMD模块是可能的(也是明智的

任何想法,高度赞赏

有没有在同一个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

这是一个比答案更长的评论

我一直在寻找同样的问题,我曾经尝试过使用grunt-ts,gulp-ts,Webstorm文件监视器,cmd行脚本,除Visual Studio之外的所有东西,因为我害怕依靠IDE进行构build过程(Webstorm观察者是一个例外,因为它与咕噜声或任何其他观察者一样,易于复制,而且它只是试用configuration)。 我目前正在使用内部模块,但只编译带有文件filter的“导出”模块(基于扩展名,是清洁工),并在引用时加载链;

我有不同的输出目标基于我试图实现,如在节点,浏览器,angular,testing,摩卡,茉莉花等…

像:

 /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难以阅读(太大),我需要记住或文件如何工作,直到我有时间来完全自动化(如果可能的话)

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

Typescript模块应该是模板化的,所以当他们编译模块时可以有我想要的“形状”,而不需要依赖额外的构build步骤

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

UMD(通用模块定义)

Browserify

amdefine

RequireJs在节点

Requirejs从COMMONJS包中加载模块

应该可以将基于需求的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,因为编译器选项是每个项目。
解决此问题的方法可能是在主Web应用程序的子目录中embeddedTypeScript子项目(.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 ) 

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