(译)Node.js, Require 与 Exports

原文链接
另:阮大大的文章, require源码解读

回想起我一开始使用node.js的时候,有一样东西经常让我感到不舒服。说来惭愧,我所说的是module.exports。我之所以说‘惭愧’是因为这是nodejs基本组成部分之一而且十分地简单。事实上,回想起来,我对于到底是哪一方面困扰我毫无头绪,只是记得我对它了解的不是很清楚。我估计不止我一个人要经过很长时间才能对它完全理解,所以我想我可以写一点东西。

在Node中,只有在同一个文件中那些东西才能相互可见。我所说的‘东西’是指变量,函数,类与类成员。所以,假设有一个叫misc.js的文件,有如下内容

//file misc.js
    var x = 5;
    var addX = function(value){
        return value + x;
    };

别的文件无法使用变量x和函数addX。这和关键词var的使用无关。当然啦,Node基础构建模块被称作单元(module),它可以直接指出一个文件的路径。所以我们可以说上述的文件相当于一个叫misc的模块,这个单元(或者所有的单元)中所有的东西都是私有(private)的。

现在,这我们关注于如何将单元内的东西展现出来之前,让我们学习一下如何载入一个单元。这就是requires出现的原因。requires使用来载入一个模块的,这就是为什么我们将它的返回值赋给一个特定的变量。

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

当然啦,只要我们的单元没有显示任何它内部的东西,上述的语句是起不到什么作用的。我们可以使用module.exports来输出一个模块中我们希望输出的任何内容:

//file misc.js
    var x = 5;
    var addX = function(value){
        return value + x;
    };
    module.exports.x = x;
    module.exports.addX = addX;

现在,我们可是使用我们的载入单元了

    var misc = require('./misc');//(译者注:两个文件在同一级目录中)
    console.log("Adding %d to 10 gives us %d", misc.x,misc.addX(10));
    //output: Adding 5 to 10 gives us 15

还有另一种方式输出一个模块中的内容:

//file user.js
    var User = function(name, email){
        this.name = name;
        this.email = email;
    };
    module.exports = User;

这个区别是细小但是重要的不是吗。看到了吧?我们直接将user输出了, 没有任何的间接手段。对于以下两个用法的区别

//file user.js
    module.exports.User = User;
    //vs
    module.exports = User;

全都在于在引用时的使用方法

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

    var u = new user.User();
    //vs
    var u = new user();

重点在于你的单元是否是需要输出数据的容器(container)。你完全可以在同一个单元中同时使用这两种输出方式,但我相信这会导致一个十分丑陋的用户接口(API)。

最后一件需要关注的东西是如果你以如下方式输出一个函数

//file powerLevel.js
    var powerLevel = function(level){
        return level > 9000 ? "it's over 9000!!!" : level;
    };
    module.exports = powerLevel;

当你引入上述文件,那么返回值就是这个文件中的函数。这就意味着你可以这么做

    require('./powerLevel')(9050);//output:9050

这就是以下版本的压缩版

    var powerLevel = require('./powerLevel');
    powerLevel(9050); //output: 9050

希望对你有所帮助!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值