我正在尝试使用Typescript将Durandal与node.js服务器集成,以便在服务器端和客户端上定义模块 .
我遇到的问题是Durandal强烈依赖于RequireJS和AMD风格的定义模块,我不想在服务器端引入,因为它使用RequireJS我没有任何机会运行CommonJS-ish模块在客户端上(node.js的默认值) .
棺材中的最后一个问题是,我发现无法定义哪些文件应该编译为AMD模块,哪个文件可以通过tsc定义为CommonJS - 这似乎是最简单的解决方案 .
我不认为分离客户端部分和服务器部分是一种选择,因为很多代码对两个部分都是通用的 .
所以,我的问题有三个:
-
有没有办法在相同的Typescript项目中混合AMD和CommonJS模块(最好使用NodejsTools)
-
如果没有,有没有办法强制Durandal使用CommonJS文件来加载视图/视图模型等等
-
如果这一切都不可能(和 wise )在node.js服务器上使用AMD模块
任何想法都受到高度赞赏
4 回答
应该可以混合基于需求的AMD文件和常见的js . 然后,您的html页面将包含类似于以下内容的脚本:
但是特定的TypeScript项目只能是AMD或常见的js - 因为编译器选项是每个项目 .
此问题的解决方案可能是将TypeScript子项目(.prj)嵌套在主Web应用程序的子目录中,如下所示:
只需创建2个* .njsproj文件的副本 . 服务器的一个副本和客户端代码的一个副本 . 在客户端项目中,只保留
public
和view
(排除与服务器相关的所有内容) . 仅保留与服务器端项目中的服务器相关的内容 . 确保客户端's project has AMD and the server'具有CommonJs . 请享用!是 . 使用
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构建过程(Webstorm)观察者是一个例外,因为它与咕噜声或任何其他观察者相同,易于复制,并且它只是方便尝试配置);我目前正在使用内部模块,但仅编译带有文件过滤器的“导出”模块(基于扩展,更清洁),并且在引用时tsc加载链;
根据我想要实现的目标,我有不同的输出目标,如节点,浏览器,角度,测试,摩卡,茉莉等......
像:
不依赖于Ts'导出模块'的能力
它可以工作,但是......但是我不是百分之百的幸福,很多文件....它闻起来......太多目标Gruntfile难以阅读(太大),我需要记住或记录它是如何工作的,直到我有时间完全自动化(如果合理的话)
我认为下面的选项对DRY和KISS的感觉更有意义,但我也不是100%在所需的样板上出售 .
Typescript模块应该是模板化的,所以当它们编译时,模块可以具有我想要的“形状”,而不依赖于额外的构建步骤
有些选项不需要编译多个目标或文件重复
UMD (Universal Module Definition)
Browserify
amdefine
RequireJs in Node
Requirejs LOADING MODULES FROM COMMONJS PACKAGES