【问题标题】:UMD syntax with fallback global具有全局回退的 UMD 语法
【发布时间】: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


    【解决方案1】:

    我知道我可以在每次构建后手动重写,但我如何在 Visual Studio (2015) 中作为构建过程的一部分自动执行此任务(或具有相同结果的任务)?

    您必须自己创建它。

    更多

    UMD 有几种变体:https://github.com/umdjs/umd 您想要的是备用浏览器全局:https://github.com/umdjs/umd/blob/master/templates/returnExports.js

    这不是 TypeScript 中的版本,因为 global 几乎是 没有模块系统

    【讨论】:

    • 我发现一个可行的解决方案是创建全局假 require 和 define 函数(当它们不存在时),它们实际上只不过是 fallback-global 功能的包装器。跨度>
    猜你喜欢
    • 2022-08-05
    • 1970-01-01
    • 2018-02-15
    • 2018-09-06
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 2010-09-19
    相关资源
    最近更新 更多