lessfish / underscore-analysis

【NO LONGER UPDATE】underscore-1.8.3.js 源码解读 & 系列文章(完)
MIT License
3.96k stars 642 forks source link

疑问:模块导出中,向后兼容老的require() API #29

Closed WuHuaJi0 closed 7 years ago

WuHuaJi0 commented 7 years ago

在导出模块中有这样的代码:

if (typeof exports !== 'undefined') {
    if (typeof module !== 'undefined' && module.exports) {
      exports = module.exports = _;
    }
   //无论上面这段if代码是否执行,最后都会执行下面这一步,那请问上面的if存在的意义是什么?
    exports._ = _;
  }

这里的注释是,兼容老的require API,搜索了相关的内容找不到合适的解释,还请指点一下!

lessfish commented 7 years ago

@WuHuaJi0
说实话我对 Commonjs 的规范也不是很了解,我 "猜测" 可能是这样的。

老项目中可能是这样用的:

let _ = require('./underscore.js')._;
let a = [1, 2, 3];
_.each(a, (item) => {
  console.log(item);
});

而现在的项目推荐这样用:

let _ = require('./underscore.js');
let a = [1, 2, 3];
_.each(a, (item) => {
  console.log(item);
});

源码这样写保证了兼容性。

有时间的话麻烦唐大大 review 下 @alsotang