关于underscore源码的一点疑问, 涉及node.js模块化

发布于 2022-09-06 03:57:48 字数 993 浏览 22 评论 0

以下是源码信息


  // Export the Underscore object for **Node.js**, with
  // backwards-compatibility for their old module API. If we're in
  // the browser, add `_` as a global object.
  // (`nodeType` is checked to ensure that `module`
  // and `exports` are not HTML elements.)
  if (typeof exports != 'undefined' && !exports.nodeType) {
    if (typeof module != 'undefined' && !module.nodeType && module.exports) {
      exports = module.exports = _;
    }
    exports._ = _;
  } else {
    root._ = _;
  }

这段代码应该是针对在nodejs环境中将_的方法挂载到exports._上,但不太懂这段代码具体逻辑:

  1. typeof exports != 'undefined' && !exports.nodeType 为什么不使用严格不等于!==或直接用隐式转换exports && !exports.nodeType;

  2. exports.nodeTypemodule.nodeType 是什么?;

  3. exports = module.exports = _; 这行代码如何理解?。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

ゞ记忆︶ㄣ 2022-09-13 03:57:48

其实上面的英文注释已经解释了许多
这段代码是用于在nodejs环境中暴露_方法

//这里这个if else是为了确定当前环境是node环境还是浏览器环境
//typeof exports的结果必然是String类型,因此不使用严格不等于也可以
//至于为什么不使用隐式转换,应该是为了代码语义更明确,就是想判断不是undefined类型(存疑)
if (typeof exports != 'undefined' && !exports.nodeType) { 
  //nodeType是为了确定该值不是html dom元素
  if (typeof module != 'undefined' && !module.nodeType && module.exports) {
    //node环境下exports = module.exports = {},exports是对module.exports的引用
    //module.exports = _ ,注意到_其实是个函数(这段代码上面定义了)
    //这切断了exports和module.exports的联系,只能被module.exports输出,不能被exports输出
    //所以需要exports = module.exports,重新建立起 exports 对 module.exports 的引用
    exports = module.exports = _;
  } 
  //兼容对module.exports支持不好的旧的commonJS规范
  //引用的时候可以 var _ = require("underscore")._
  exports._ = _;
} else { 
  //浏览器环境,_方法挂载到window上
  root._ = _;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文