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

时间:2015-09-27 13:07:31

标签: javascript build gruntjs typescript amd

我正在尝试创建一个单独的AMD库(模块)文件,该文件是由许多小文件(编译为JavaScript-AMD模块的TypeScript文件)构建的。

问题是:

  1. 我在类之间有循环依赖关系。 (家长需要知道孩子和孩子需要知道父母)
  2. 我想摆脱所有的define()和require()调用,除了“myLibrary”的主要定义
  3. 创建单个文件的主要原因:

    1. 加载时间(不应使用requirejs来引用所有小文件)
    2. AMD模块无法(?)重新调整的循环依赖项
    3. 我的主要问题是:

      • 有没有工具可以做到这一点? 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");
      export import packageB = require("./packageB");
      

      这只是编译成这样的AMD模块:

      define(["require", "exports", "./myLibrary/packageA", "./myLibrary/packageB"], function (require, exports, packageA, packageB) {
          exports.packageA = packageA;
          exports.packageB = packageB;
      });
      

      包文件的结构相同。例如packageA.ts看起来像这样:

      // Typescript source:
      export * from "./packageA/ClassA1";
      export * from "./packageA/ClassA2";
      
      // Compiled as Javascript:
      define(["require", "exports", "./packageA/ClassA1", "./packageA/ClassA2"], function (require, exports, ClassA1_1, ClassA2_1) {
          function __export(m) {
              for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
          }
          __export(ClassA1_1);
          __export(ClassA1_2);
      });
      

      目前获得的是什么:

      define("myLibrary/packageA/ClassA1",["require", "exports"], function(require, exports) {
          var MyClassA1 = (function() {
              // The content of the class ...
          })();
          exports.MyClassA1 = MyClassA1;
      });
      define("myLibrary/packageA/ClassA2", ...
      
      // The other stuff ...    
      
      define(["require", "exports", "./myLibrary/packageA", "./myLibrary/packageB"], function (require, exports, packageA, packageB) {
          exports.packageA = packageA;
          exports.packageB = packageB;
      });
      

      我想要的是什么:

      define(["require", "exports"], function(require, exports) {
          //... The entire code of packageA without define or require.
          var packageA = ...;
          //...
          export.packageA = packageA;
          export.packageB = packageB;
      });
      

3 个答案:

答案 0 :(得分:2)

他们已经在their roadmap中捆绑了一个模块。

由于我们在撰写本文时处于TypeScript 1.6,并且他们说它将在1.7中实现,因此您需要等待vnext,这应该很快就会发布。

答案 1 :(得分:1)

目前,您需要使用其他类型的AMD优化器。特别是,您可以使用r.js,这是RequireJS项目的一部分。它将检查您的AMD模块并将它们发送到不同的层。

目前,如果您将TypeScript项目配置为使用UMD,则r.js优化器无法识别properly your UMD modules,因此唯一的选择是针对您的项目定位AMD。

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

答案 2 :(得分:1)

  

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

请参阅outfile + amd