Javascript 从许多编译为AMD模块的TypeScript类创建单个AMD模块?

Javascript 从许多编译为AMD模块的TypeScript类创建单个AMD模块?,javascript,build,gruntjs,typescript,amd,Javascript,Build,Gruntjs,Typescript,Amd,我试图创建一个AMD库(模块)文件,它是由许多小文件(编译为JavaScript AMD模块的TypeScript文件)构建而成的 问题是: 我在类之间有循环依赖关系。(父母需要了解孩子,孩子需要了解父母) 我想去掉所有define()和require()调用,除了“myLibrary”的主define 创建单个文件的主要原因: 加载时间(不应使用ReJS来引用所有的小文件) AMD模块无法解析的循环依赖关系 我的主要问题是: 有没有工具可以做到这一点?r、 js(grunt contrib

我试图创建一个AMD库(模块)文件,它是由许多小文件(编译为JavaScript AMD模块的TypeScript文件)构建而成的

问题是:

  • 我在类之间有循环依赖关系。(父母需要了解孩子,孩子需要了解父母)
  • 我想去掉所有define()和require()调用,除了“myLibrary”的主define
  • 创建单个文件的主要原因:

  • 加载时间(不应使用ReJS来引用所有的小文件)
  • AMD模块无法解析的循环依赖关系
  • 我的主要问题是:

    • 有没有工具可以做到这一点?r、 js(grunt contrib requirejs)将所有内部调用都留在define()中,这让我很失望
    我当前的项目布局类似于以下示例:

    root
    |-- myLibrary
    |   |-- packageA
    |   |   |-- ClassA1.ts
    |   |   +-- ClassA2.ts
    |   |-- packageB
    |   |   |-- ClassB1.ts
    |   |   +-- ClassB2.ts
    |   |-- packageA.ts
    |   +-- packageB.ts
    +-- myLibrary.ts
    
    myLibrary.ts的代码很简单:

    export-import-packageA=require(“/packageA”);
    进出口包装B=需要(“./packageB”);
    
    它简单地编译成如下AMD模块:

    define([“require”、“exports”、“/myLibrary/packageA”、“/myLibrary/packageB”]、函数(require、exports、packageA、packageB){
    exports.packageA=packageA;
    exports.packageB=packageB;
    });
    
    包文件的结构与此相同。例如,packageA.ts如下所示:

    //类型脚本源:
    从“/packageA/ClassA1”导出*;
    从“/packageA/ClassA2”导出*;
    //编译为Javascript:
    定义([“require”、“exports”、“/packageA/ClassA1”、“/packageA/ClassA2”]、函数(require、exports、ClassA1_1、ClassA2_1){
    功能导出(m){
    如果(!exports.hasOwnProperty(p))导出[p]=m[p];
    }
    __出口(A1类1);
    __出口(A1类2);
    });
    
    当前正在获取的内容:

    define(“myLibrary/packageA/ClassA1”、[“require”、“exports”]、函数(require、exports){
    var MyClassA1=(函数(){
    //课程内容。。。
    })();
    exports.MyClassA1=MyClassA1;
    });
    定义(“myLibrary/packageA/ClassA2”。。。
    //其他的东西。。。
    定义([“require”、“exports”、“/myLibrary/packageA”、“/myLibrary/packageB”]、函数(require、exports、packageA、packageB){
    exports.packageA=packageA;
    exports.packageB=packageB;
    });
    
    我想要的是:

    define([“require”,“exports”],函数(require,exports){
    //…packageA的完整代码,无需定义或要求。
    var-packageA=。。。;
    //...
    export.packageA=packageA;
    export.packageB=packageB;
    });
    
    他们已经绑定了一个模块


    因为我们在撰写本文时使用的是TypeScript 1.6,他们说它将在1.7中实现,所以您需要等待vnext,该版本很快就会发布。

    目前,您需要使用其他类型的AMD Optimizer。特别是您可以使用它,它是RequireJS项目的一部分。它将检查您的AMD模块nd将它们发射到不同的层中

    但目前,如果您将TypeScript项目配置为使用UMD,r.js Optimizer不会识别,因此唯一的选择是针对AMD进行项目

    我认为,即使在TypeScript 1.7+中添加了某种连接,您可能仍然希望使用功能更丰富的工具,如r.js,因为它将允许更好地优化和控制AMD应用程序,因为在复杂的项目中,层和依赖关系往往是复杂的

    指定--outFile与--module amd或--module一起使用 系统将把编译中的所有模块连接成一个单独的模块 包含多个模块闭包的输出文件


    请看。

    很高兴听到这个消息,但遗憾的是,这并不能解决我当前的问题。我真的很想看看如何使用现有的工具来完成它。@Niabot这是我们大多数人的一大愿望,不幸的是,没有简单的方法来实现你想要的。你需要自己开发它。我几乎就要这么做了,when他们最终批准了下一个版本的模块捆绑,所以我会等待(它将在下个月提供,所以,不是一个大的等待)。但让我们看看是否有人在这里提供了奇迹般的帮助:)如果RequireJS(r.js)真的能够解决AMD模块内的循环依赖性,我会使用这个选项。但事实并非如此!所以我尝试了SystemJS,它声称能够解决“register”格式的循环依赖关系。但是我遇到了类似的问题,因为typescript编译器为每个类都发出一个扩展函数。难道就不能有一个工具将整个库放到一个文件中,删除所有包/依赖项吗(@Niabot如果您将
    .tsconfig
    文件定位为使用模块系统
    none
    ,它将删除所有包/依赖项内容,不是吗?是的,但是我无法再导出类,这使得不可能有类似包的结构。我想从多个文件中创建一个库,其中包含一些类和方法s作为模块的一部分公开。但我不希望该模块的每个部分在内部都是一个模块本身。这更像是将许多小模块组合成一个大模块,消除了模块定义的所有开销,同时仍然能够使用循环依赖项。java(原文如此!)编译器永远都是这样做的,对于这种情况来说,它将是完美的。