module.exports与exports的关系:
模块代码真正被执行时是被包装过的。
(function(exports, require, module, __filename, __dirname){
console.log(“hello, word”) //原始文件内容
})
module和exports都是模块执行时的参数,其中exports也是module的一个属性,默认情况下是一个空对象。当require一个模块的时候,实际上得到的是该模块的exports属性。
给一个模块添加属性时,使用exports.key = value即可。javascript在传递参数的时候,如果是对象,传递的是引用。export = {key:value};因为覆盖了原来的引用,所以是行不通的。
require(id)分为三种情况:
(1)引入内建模块(http,fs,path)。
(2)引入文件模块(以.或..开始的相对路径文件模块)。
(3)引入一个包(当id不是内建模块也不是一个文件模块时,则认为是一个包。这个包可能是通过npm安装的。包的加载方式是,在当前目录下寻找node _modules目录中是否存在该包,没有再向上一级目录查找,没有再向上一级目录查找,直到根目录下的node_modules目录。找到资源后,会找到包的描述文件:package.json,该文件的main字段表明了包的入口文件。如果main指定的文件错误,或者压根没有package.json文件,会依次查找index.js、index.json、index.node,如果都没有找到,则会抛出查找失败的异常。)
在任意模块输出module.paths,会看到路径的生成规则
console.log(module.paths)
当require()在分析标识符的过成功,如果扩展名不存在,会依次按照.js、.json、.node来进行查找文件。所以如果是json或者node文件,在require时可以加上文件名后缀,可以加快一点速度。