【发布时间】:2016-08-24 10:16:51
【问题描述】:
我的设置
我在 Visual Studio 2015 中将我的 .ts 模块“FooModule”编译为 UMD module。我想扩展此 UMD 语法,以便在没有模块时将该模块作为后备注入到全局对象中存在加载系统,我想将此任务作为构建过程的一部分自动执行。
UMD 语法
使用 UMD 语法(通用模块定义语法)编译 TypeScript 模块时,会发出同时兼容 RequireJS 和 NodeJS 的模块:
foo-module.ts
export class Foo {
// ...
}
...编译成:
foo-module.js
(function (factory) {
if (typeof module === 'object' && typeof module.exports === 'object') {
var v = factory(require, exports); if (v !== undefined) module.exports = v;
} else if (typeof define === 'function' && define.amd) {
define(["require", "exports"], factory);
}
})(function (require, exports) {
"use strict";
var Foo = (function () {
function Foo() {
}
return Foo;
}());
exports.Foo = Foo;
});
回退到全局注入
但是,作为 UMD 的 Universal 部分的一部分,我希望我的模块也可以在没有任何模块加载系统的情况下使用。 我的模块没有依赖关系。
这通常是通过添加第三种情况来完成的,当 RequireJS 和 NodeJS 模块系统都不存在时,这将有效地注入到全局对象中。对于foo-module,如下所示:
(function (global, factory) {
if (typeof module === 'object' && typeof module.exports === 'object') {
var v = factory(require, exports); if (v !== undefined) module.exports = v;
} else if (typeof define === 'function' && define.amd) {
define(["require", "exports"], factory);
} else {
// *****************************
factory(null, global.FooModule || (global.FooModule = {})); // <- This part.
// *****************************
}
})(this, function (require, exports) {
"use strict";
var Foo = (function () {
function Foo() {
}
return Foo;
}());
// In browsers, this means 'window.FooModule.Foo = Foo'.
exports.Foo = Foo;
});
我相信这在没有外部依赖项的所有情况下都足够了(假设没有以这种方式加载两个同名模块)。
我知道我可以在每次构建后手动重写,但是我如何在 Visual Studio (2015) 中将这个任务(或具有相同结果的任务)自动化作为构建过程的一部分?
【问题讨论】:
标签: build module typescript