这是this SO thread的ES6特定副本,其中详细说明了如何创建可导出以在浏览器和节点上下文中使用的javascript模块。
如果更合适的话,我也很高兴在那里出现答案。
对于背景,这里引用了ES5解决方案,以及尝试将其转换为ES6时出现的问题。 (贷记给@caolan和@broesch用户。)
(function(exports){
// Your code goes here. For example:
exports.test = function(){
return 'hello world'
};
})(typeof exports === 'undefined'? this.mymodule = {} : exports);
因此,如果exports
未定义,则您必须在浏览器中,在这种情况下,mymodule
在window
上声明(即this
)。或者,如果定义了exports
,则它位于node
上下文中,在这种情况下,您只能var mymodule = require('mymodule')
。在两种环境下,您都可以将其用作mymodule.test()
。大。
与此有关的一个问题是exports.whatever
在当前作用域中没有公开whatever
,因此,如果您想在模块中使用whatever
,最终需要做< / p>
var whatever = 3;
exports.whatever = whatever;
可能会很麻烦,并且容易忘记。
另一方面,在ES6中,您可以执行export const whatever = 3
,这将导出并公开whatever
,这是DRYer,因此易于维护。
新问题是
export
必须位于文件的顶层,这意味着您不能使用ES5答案中的语法export
不是函数(是吗?),所以您不能使用type of
来实现条件浏览器/节点上下文。 因此,我的问题是:创建.js
文件并可以同时导出到浏览器和节点的ES6版本是什么?