I am trying to create one AMD library file (module), which is built from many small files (TypeScript files compiled for JavaScript-AMD modules).
The problem is this:
- I have cyclical dependencies between classes. (The parent must know that the child and the child must know the parent).
- I want to get rid of all calls to define () and require (), except for the main definition for "myLibrary"
The main reasons for creating a single file:
- Download time (requirejs should not be used to reference all small files)
- Cyclic dependencies that cannot (?) Be replaced by AMD modules
My main questions are:
- Is there a tool for this? r.js (grunt-contrib-requirejs) failed for me, leaving all the internal calls to define () inside.
My current project layout is similar to the following example:
root
|
| |
| | |
| | +
| |
| | |
| | +
| |
| +
+
The code myLibrary.ts is simple:
export import packageA = require("./packageA");
export import packageB = require("./packageB");
Which simply compiles to the AMD module as follows:
define(["require", "exports", "./myLibrary/packageA", "./myLibrary/packageB"], function (require, exports, packageA, packageB) {
exports.packageA = packageA;
exports.packageB = packageB;
});
Package files are structured in the same way. For example, packageA.ts looks like this:
export * from "./packageA/ClassA1";
export * from "./packageA/ClassA2";
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);
});
What is currently receiving:
define("myLibrary/packageA/ClassA1",["require", "exports"], function(require, exports) {
var MyClassA1 = (function() {
})();
exports.MyClassA1 = MyClassA1;
});
define("myLibrary/packageA/ClassA2", ...
define(["require", "exports", "./myLibrary/packageA", "./myLibrary/packageB"], function (require, exports, packageA, packageB) {
exports.packageA = packageA;
exports.packageB = packageB;
});
What I want:
define(["require", "exports"], function(require, exports) {
var packageA = ...;
export.packageA = packageA;
export.packageB = packageB;
});