【问题标题】:Export a Global and Define via TypeScript Module System?通过 TypeScript 模块系统导出全局和定义?
【发布时间】:2017-04-23 01:52:39
【问题描述】:

我在工作中一直在使用 TypeScript,我们使用 RequireJS 作为我们的 AMD 加载器,它运行良好。我想将我的一些个人 JS 库转换为 TypeScript,我想知道 - 是否可以使用 TypeScript 的内置模块系统来导出 global AND define 如果最终用户恰好在使用 require/amd?

我想避免破坏与现有用户的兼容性/强迫他们使用 Require。

我现有的 JS 文件的布局是这样的,它定义了一个全局 AND 如果定义了定义,则定义 TickerGraph:

var TickerGraph = (function () { …class code… });

if( typeof define == "function" ) {
    define([], function() {
        return TickerGraph;
    });
}

在我的 TypeScript 重写中,我使用定义为 UMD 的模块类型进行了如下布局:

export = class TickerGraph { …class code… }

输出

(function (dependencies, 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(dependencies, factory);
    }
})(["require", "exports"], function (require, exports) {
    "use strict";
    return (function () {

检查定义/导出但 NOT 定义一个全局...

我已经尝试过将 export 全部消除并一起导出全局,但当然不再定义。在这里的任何帮助将不胜感激。

【问题讨论】:

    标签: typescript requirejs


    【解决方案1】:

    看来,这样做的唯一方法是使用打字稿模块系统。

    Typescript 编译器本身就是一个很好的例子 - lib/tsc.js 可以用作节点模块和全局脚本。

    为了实现这一点,他们必须遵循一组鲜为人知的(至少对我而言)规则:

    • 在顶层没有任何 exportimport。他们拥有的每个export 都在namespace ts { }

    • 一个文件可以使用另一个文件中的符号,前提是每个文件的所有内容都在namespace ts { } 中。您必须确保所有相互依赖的文件都编译在一起,或者具有正确的/// <reference 指令。这假设您使用 --outFile 选项从多个打字稿文件生成单个输出文件。

    本质上,您正在创建一个由所有文件组成的巨大的全局脚本,所有内容都在命名空间ts 中。结果输出将在顶层具有var ts,如果您将其作为纯脚本包含,它将变为全局。

    为了使其可用作节点模块,他们在shims.ts 中有此代码:

    // Here we expose the TypeScript services as an external module
    // so that it may be consumed easily like a node module.
    declare var module: any;
    if (typeof module !== "undefined" && module.exports) {
        module.exports = ts;
    }
    

    您必须为您的模块做类似的事情,使用define 而不是module。据我所知,没有内置支持。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-14
      • 1970-01-01
      • 1970-01-01
      • 2018-05-06
      • 1970-01-01
      • 2015-05-08
      • 2017-09-29
      • 2016-02-25
      相关资源
      最近更新 更多