Javascript 从许多编译为AMD模块的TypeScript类创建单个AMD模块?
我试图创建一个AMD库(模块)文件,它是由许多小文件(编译为JavaScript AMD模块的TypeScript文件)构建而成的 问题是: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
- 有没有工具可以做到这一点?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(原文如此!)编译器永远都是这样做的,对于这种情况来说,它将是完美的。