关于node.js:是否可以在同一个Typescript项目中混合使用AMD和CommonJS模块

Is it possible to mix AMD and CommonJS modules within same Typescript project

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

我遇到的问题是,Durandal非常依赖于RequireJS和AMD定义我不想在服务器端引入的模块的风格,而且由于它使用RequireJS,所以我没有机会在客户机上运行普通的JS ISH模块(node.js的默认设置)。

最后一个问题是,我找不到定义哪些文件应该被编译为AMD模块,哪些文件应该被TSC编译为CommonJS的方法——这似乎是一个最简单的解决方案。

我不认为将客户机部分和服务器部分分开是一种选择,因为很多代码对这两部分都是通用的。

所以,我的问题是三个方面:

  • 在同一个typescript项目中是否有混合AMD和commonJS模块的方法(最好使用nodejstools)

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

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

任何想法都很受欢迎


is there a way to mix AMD and CommonJS modules in the same Typescript project (preferably using 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


这与其说是一个答案,不如说是一个冗长的评论。

我一直在寻找同样的问题,我尝试了咕噜ts,咕噜ts,webstorm文件观察程序,命令行脚本,除了Visual Studio之外的所有东西,因为我害怕依赖于IDE来进行构建过程(webstorm观察程序是一个例外,因为它与咕噜t或任何其他观察程序相同,易于复制,而且它只是一个方便的尝试配置NS);我目前使用的是内部模块,但只编译带有文件过滤器的"导出"模块(基于扩展名,更干净)当它们被引用时,TSC加载链;

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

比如:

1
2
3
4
5
6
7
/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很难读取(太大),我需要记住或记录它是如何工作的,直到我有时间完全自动化它(如果可能的话)。

我认为下面的选择在干性和亲吻上更有意义但我也不是百分之百地出售所需的样板。

typescript模块应该是可模板化的,因此在编译时,模块可以具有我想要的"形状",而不需要依赖额外的构建步骤。

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

通用模块定义

浏览

定义

节点中的要求

需要从CommonJS包加载模块


应该可以混合使用基于需求的AMD文件和通用JS。然后,您的HTML页面将包含类似于以下内容的脚本:

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

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

1
2
3
4
5
6
7
8
9
10
+- / (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文件。一个副本用于服务器,一个副本用于客户端代码。在客户机项目中,只保留publicview(不包括与服务器相关的所有内容)。在服务器端项目中只保留与服务器相关的内容。确保客户端的项目有AMD,服务器的项目有CommonJS。享受!