美文网首页
一个熟悉的陌生函数exports

一个熟悉的陌生函数exports

作者: 忧郁的河蟹 | 来源:发表于2015-04-06 17:27 被阅读491次

    epxorts作为node.js的导出函数,充斥在项目的代码里面,你对exports细节又有多少了解呢?

    相信很多同学都搞不清楚以下exports的调用之间的区别

    exports.a = function () {}
    module.exports = {}
    exports = module.exports = {}

    让我们来看看node.js底层是怎么定义moudle和exports的

      NativeModule.wrapper = [
        '(function (exports, require, module, __filename, __dirname) { ',
        '\n});'
      ];
    
      NativeModule.prototype.compile = function() {
        var source = NativeModule.getSource(this.id);
        source = NativeModule.wrap(source);
    
        var fn = runInThisContext(source, { filename: this.filename });
        fn(this.exports, NativeModule.require, this, this.filename);
    
        this.loaded = true;
      };
    

    对于每一个node.js模块,都会以下函数被包裹

    '(function (exports, require, module, __filename, __dirname) { ',
        '\n});' 
    

    所以,平时我们在没做出任何require,module和exports等声明的时候直接就可以调用,那是因为node在初始化的时候进行引入,抛开其他变量不看,重点是exports和module,实际上exports是 module底下的一个属性,exports不过只是作为个快速导出函数的方法存进去,实际上产生作用的是module模块,所以当我们重写了 module.exports 方法的时候,exports就会失效 。有时候我们既想module.exports定义函数,又想利用exports的特性的时候,我们可以这样写exports = module.exports = {},相信我说到这里,哪怕我不用去详细说明前面那3个例子,大家都能弄明白那三个调用的区别。

    相关文章

      网友评论

          本文标题:一个熟悉的陌生函数exports

          本文链接:https://www.haomeiwen.com/subject/yhqzxttx.html