在D:\zhao\nodews目录写一个sum.js文件,内容如下:
function sum(start,end){
var sum=0;
for(var i=start;i<=end;i++){
sum+=i;
}
console.log(sum);
}
sum(1,100);
作用很简单,我们一看就明白:这个文件定义了一个函数sum(start,end),用来就算这个闭区间内所有整数的和,最后调用sum函数计算1-100的和,我们怎么运行呢?代开命令行:
D:\zhao\nodews>node sum.js
5050
可以看到运行成功了,在nodejs中我们使用“node js文件名”的方式来运行js文件。
这没什么好说的,有一个思想,就算nodejs里面的模块化,就比如上面的这个计算两数之间所有整数的和的功能,我们可以把它作为一个模块,不管在任何地方任何文件想要使用这个功能的话,只需要引入这个模块就可以了,这样就做到了代码的复用,也符合编程代码“不重复发明轮子”的思想。
那好,我们现在就把sum.js作为一个模块吧,新建mymodules文件夹,并把sum.js放进去,然后再新建个test.js,在test.js里引用我们的模块sum.js。在windows命令行使用tree命令查看整个目录结构如下:
怎么引入模块呢?模块我再强调一遍,模块其实就是能完成一定功能的js文件,比如我们上边的sum.js这个文件可以完成计算和的功能。nodejs里面可以使用require来引入模块,我们编写test.js的内容如下:
require("./mymodules/sum.js")
sum(1,100);
按照我们的猜想,如果此时执行"node test.js"不出错的话,应该会输出两个5050,一个是sum.js里面输出的,一个是test.js里面调用了sum函数输出的,那我们试试吧:
D:\zhao\nodews>node test.js
5050
D:\zhao\nodews\test.js:2
sum(1,100);
^
ReferenceError: sum is not defined
at Object.<anonymous> (D:\zhao\nodews\test.js:2:1)
at Module._compile (module.js:635:30)
at Object.Module._extensions..js (module.js:646:10)
at Module.load (module.js:554:32)
at tryModuleLoad (module.js:497:12)
at Function.Module._load (module.js:489:3)
at Function.Module.runMain (module.js:676:10)
at startup (bootstrap_node.js:187:16)
at bootstrap_node.js:608:3
D:\zhao\nodews>
几个意思啊,我们看到在输出了一个5050之后,后面就报错了,说是sum is not defined,这是为什么呢?因为在nodejs里面每一个模块(能完成一定功能的js文件)的作用域都是相互隔离的,比如你再sum.js里面定义了一个变量name,在其他js文件中是不能直接使用的,需要在sum.js文件里面把这个name导出(exports)才行,不仅仅是变量需要导出,只要是你在本模块里面想暴露给其他模块使用的变量、函数、对象都需要导出(exports)。那么我们就修改sum.js如下:
var name="sum.js";
function sum(start,end){
var sum=0;
for(var i=start;i<=end;i++){
sum+=i;
}
console.log(sum);
}
exports.func_sum=sum;
exports.var_name=name;
新增了一个变量name,并新增了exports导出语句。修改test.js如下:
var module_sum=require("./mymodules/sum.js")
module_sum.func_sum(1,100);
console.log(module_sum.var_name);
我们使用一个变量module_sum接收require进来的sum.js的导出,这里sum.js的导出其实就是exports这个对象,它被我们使用module_sum这个变量来接收,我们之后自然就可以使用对象的属性和函数了。module_sum这个名字是我们随便起的,只是为了更准确的表达这个意思,你可以叫你自己喜欢的名字。在这里module_sum就相当于sum.js里面的exports对象。我们运行结果如下: