build - 具有回退全局的 UMD 语法

标签 build module typescript

我的设置

我正在将我的 .ts 模块“FooModule”编译成 UMD module在 Visual Studio 2015 中。我想扩展此 UMD 语法,以便在不存在模块加载系统时将模块作为后备注入(inject)到全局对象中,并且我想在构建过程中自动执行此任务.


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;
});

回退到全局注入(inject)

但是,作为 UMD 的 Universal 部分的一部分,我希望我的模块也可以在没有任何模块加载系统的情况下使用。 我的模块没有依赖项。

这通常是通过添加第三种情况作为回退来完成的,当 RequireJS 和 NodeJS 模块系统都不存在时,这将有效地注入(inject)到全局对象中。对于 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) 中将此任务(或具有相同结果的任务)自动化为构建过程的一部分?

最佳答案

I understand I can just rewrite manually after each build, but how could I automate this task (or something with identical results) as part of a build-process in Visual Studio (2015)?

您必须自己创建。

更多

UMD 有几个变体:https://github.com/umdjs/umd你想要的是 fallback browser global : https://github.com/umdjs/umd/blob/master/templates/returnExports.js

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

关于build - 具有回退全局的 UMD 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36935177/

相关文章:

build - 我用 Tailwind 制作的 CSS 不适用于使用 gridsome for netlify 进行构建

ant - Apache Ant 和掘金

node.js - 将 angular2 模块/组件发布为 npm 包

Angular 2 指令及其属性

build - 如何使用cygwin在windows上构建zeromq?

typescript - 使用 yarn workspaces 和 lerna 优先构建顺序

module - Ocaml 值与模块和签名中的参数化类型不匹配

javascript - 在 Node 中导出和要求不起作用,说类未定义

typescript 装饰器作为混合?

javascript - 让 Meteor、Webstorm 和 Typescript 协同工作的最佳实践是什么?