25

我创建了一个节点模块,它本质上只是一些有用的 JS,也可以在客户端使用。我知道 require.js 可以加载 common.js 组件,但我不一定要强制每个使用我的模块客户端的人也需要 require 或 common.js 什么的。我也不想强迫他们删除module.exports = ...文件底部的。其他人如何解决这个问题?您只是创建 2 个版本,还是 2 个“编译”版本?module.exports 是否无处不在?

4

3 回答 3

22

这就是 underscore.js 所做的:

if (typeof exports !== 'undefined') {
  if (typeof module !== 'undefined' && module.exports) {
    exports = module.exports = _;
  }
  exports._ = _;
} else {
  root['_'] = _;
}
于 2012-09-24T19:42:44.543 回答
13

这个答案依赖于从右到左评估分配的事实。MyModule首先分配给exports,然后exports分配给module.exports

如果module未声明,则抛出异常。

简短、干净且易于记忆:

try {
   module.exports = exports = MyModule;
} catch (e) {}

该文件可以包含在浏览器和 node.js 中。

于 2017-08-15T11:12:27.380 回答
4

这对我有用(CoffeeScript)。假设“命名空间”是您想要window在客户端范围内声明的内容

(module ? {}).exports = @Namespace =
  my: 'cool'
  module: '!'

然后您可以require('namespace').my === 'cool'在 Node.js 或Namespace.my === 'cool'浏览器中使用。这转化为 JS 为

(typeof module !== "undefined" && module !== null ? module : {}).exports = this.Namespace = {
  my: 'cool',
  module: '!'
};
于 2012-09-24T19:55:23.770 回答