首页 文章

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

提问于
浏览
10

我正在尝试使用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 回答

  • 3

    应该可以混合基于需求的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 )
    
  • -2

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

  • 6
  • 0

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

    我一直在寻找同样的问题,我确实尝试过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

相关问题