我想创建一个可以在浏览器和nodejs中使用的库。为了论证,让我们说这是我的库:
export default class MyClass {
public getString(): string {
return "Message";
}
}
目前浏览器不支持ES2015模块,我不希望在浏览器中依赖requirejs或任何其他模块加载器 - 我希望通过使用包含生成的.js文件来使用此库。 script
标记。感觉我想要的东西可以通过使用内部模块来实现(我不想污染全局命名空间)。
但是,当我将代码包装在namespace
/ module
中时,我很难将其编译为commonjs模块。
实现我想要的正确方法是什么?或者,可能是,我完全脱离了轨道这里是打字稿和javascript noob?
答案 0 :(得分:6)
我认为你需要的是UMD
。 tsconfig.json
包含
{
"compilerOptions": {
"module": "umd"
},
}
生成的JavaScript将如下所示:
(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 MyClass = (function () {
function MyClass() {
}
MyClass.prototype.getString = function () {
return "Message";
};
return MyClass;
}());
exports.__esModule = true;
exports["default"] = MyClass;
});
它适用于节点(CommonJS)以及浏览器(CommonJS,AMD)。要允许您图书馆的用户通过script
标记添加,您需要模块捆绑,例如Webpack,Browserify或Rollup。这些将使用全局导出生成UMD定义,因此库的主文件的默认导出将作为全局范围内的某个变量提供。