这节课讨论 模块(module)
与 引入模块(require)
在写 Node.js 应用的时候我们不会将所有的程序代码都放在一个文件里。如果这样做,管理代码还有与其他开发者加入共同重构和扩展等处理将会变成噩梦,即使是你己跟手也同样。
所以我们将代码按逻辑模块划分,不同模块有某种功能,当需要的时候进行调用。
假如我们有一个计数的工具类模块(模块的本质也是一个 js 文件):
'counter.js'
var count = function (array) {
return '该数组有 ' + array.length + ' 个元素';
}
console.log(count([1, 2, 3, 4, 5])); // 该数组有 5 个元素
命令行执行
node counter
命令行上会输出该数组有 5 个元素
OK,如果我们需要在其他地方使用这个功能模块呢?这就需要使用到 require
(隶属 global 对象)
require 接收一个字符串参数,值为模块的路径
或者模块的名字
。此处使用自己的模块,因此填入的是相对路径。
'app.js'
require('./counter); // 当前目录下的 counter.js 可以忽略后缀
console.log(count([1, 2, 3, 4, 5])); // 剪切 counter.js 这行代码到 app.js
到了这步,你是不是以为我们已经可以使用 counter.js
里的函数?
那么运行 app.js
,控制台报错 count is not defined
。
node app
为什么会这样,因为 counter.js
模块的方法在外部是不可访问
,这是故意设计成这样。我们要做的是明确指出模块内部哪部分是可供外部访问。
通过 module.exports
可以将需要的部分导出到外部以供访问,然后在外部可以通过 require
接收该模块并保存到变量使用。
'counter.js'
var count = function (array) {
return '该数组有 ' + array.length + ' 个元素';
};
module.exports = count; // 导出 count 方法到外部
'app.js'
var count = require('./counter'); // 外部获取该模块所导出的函数
console.log(count([1, 2, 3, 4, 5])); // 执行该函数
当程序使用到 require
,会寻找引入的模块中所导出(exports)
的部分并返回,这就是在程序里使用模块的方式。