2016-12-07 38 views
0

我一直在使用TypeScript工作,我们使用RequireJS作为我们的AMD加载器,并且工作得很好。我想将一些我个人的JS库,以打字稿的,我想知道 - 是否有可能使用打字稿内置的模块系统导出全球和使用要求定义/AMD如果最终用户恰好是使用它?通过TypeScript模块系统导出全局和定义?

我想避免打破现有用户的兼容性/强制他们进入要求。

我现有的JS文件布局为使得其限定一个全球性的,如果定义定义,定义TickerGraph:

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

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

在我的打字稿重写,我已经定义的模块类型制定出来作为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() { 

其中用于解检查罚款/出口,但确实定义一个全球...

我已经试验和消除出口一起出口全球,但当然不再定义。任何帮助在这里将不胜感激。

回答

1

唯一能做的就是而不是使用打字稿模块系统,看来。

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

没有-知名的(对我来说,至少)一套,他们必须遵循以实现规则:

  • 没有任何exportimport在顶层。每个export他们在里面namespace ts { }

  • 一个文件,可以使用符号从另一个文件,只要每个文件都有其namespace ts { }的所有内容。你必须确保所有相互依赖的文件都被编译在一起,或者有适当的指令。这假设您使用--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。就我所知,没有内置的支持。