Node.js的模块中exports的理解
天蓬老师
天蓬老师 2017-04-17 13:03:45
[Node.js讨论组]

定义一个counter.js

var i = 0;

function count() {
    return ++i;
}

exports.count = count;

然后通过main.js加载这个模块

var counter1 = require('./util/count');

console.log(counter1.count());

但是不理解counter.js最后一句的意思。

exports.count = count;

这句话的意思不是把count这个函数赋值给exports.count吗?之前看《javascript高级程序设计》有提过,只写函数名但不加括号是代表这个函数,但是不执行。

既然导出的是个函数,为什么能通过count这个函数来实现count.count()的调用?这里的count是指整个js的全局对象还是只是一个函数?

疑惑了很久,谢谢各位~

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(5)
巴扎黑

我来做个简单的解释吧,这个解释可能你更容易理解。

var i = 0;
function count() {
    return ++i;
}
exports.count = count;//这句话其实就是对外说我counter.js中有个count方法可以给你们使用
var counter1 = require('./util/count');//main中拿到一个叫做counter1的实例,njs中通过require引入

console.log(counter1.count());//访问这个实例中的count方法。

虽然这样解释不是很专业,但是应该容易理解,希望能够帮到你。

巴扎黑

刚翻阅google,看到一些回答仿佛有点头绪了。不知道正确与否。
定义一个test.js

var i=0;

function setName(n){
    name=n;
} 

function printName(){
    console.log(name);
}

exports.setName=setName;
exports.printName=printName;
exports.i=i;

再定义一个main.js

var test=require('./test');

test.setName('Byron');//输出Byron
test.printName();
console.log(test.i);//输出1

exports的意思,相当于把这个对象/函数/变量等添加到require得到的那个对象中,这个对象就可以访问这些属性。
既避免了作用域内变量冲突,也保护了私有变量。同时把工程切割成小块,降低了耦合性。

http://www.cnblogs.com/dolphinX/p/3485260.html
代码引用了此博客的,开启了思路。

天蓬老师

你也可以从require的角度去理解

var counter1 = require('./util/count');

等价理解为

var counter1 = (function(){

    var exports={};
    
    (function(_exports_){
    
        var i = 0;    
        function count() {
            return ++i;
        }
        _exports_.count=count;
        
    }(exports));
   
    return exports;
}());
黄舟

我觉得有一个点大家都没说,node定义了每一个js文件就是一个模块,要暴露出方法,只能用export

阿神

这个属于js模块化相关的知识,nodejs貌似是遵循的commonjs规范,通过export和require来实现模块之间的引用和导出,而且js模块化有很多方法,可以了解下。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号