【发布时间】:2015-09-27 13:07:30
【问题描述】:
我正在尝试创建一个由许多小文件(编译为 JavaScript-AMD 模块的 TypeScript 文件)构建的单个 AMD 库(模块)文件。
问题是:
- 类之间存在循环依赖关系。 (父母需要了解孩子,孩子需要了解父母)
- 我想摆脱所有的 define() 和 require() 调用,除了 "myLibrary" 的主定义
创建单个文件的主要原因:
- 加载时间(requirejs 不应用于引用所有小文件)
- 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");
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;
});
【问题讨论】:
标签: javascript build gruntjs typescript amd