nodejs模块加载
使用nodejs也有很长一段的时间了,但却感觉自己并没有太多的积累。有时候会问自己,“你学了这么久了,比起初学者你强在哪呢?”
或许只是几个常用的API调用的更熟练一些吧。学习的路上还是要脚踏实地,稳步前进。
nodejs中,加载一个模块通过require()方法,例如require('fs')。这个方法接受模块的标识符,可以加载的模块分为3种:
- node提供的核心模块。
- 路径形式的文件模块
- 自定义模块
核心模块在node源代码的编译过程中已经编译为二进制代码,加载速度最快。加载文件模块时,标识符是一个可以省略文件后缀名的文件路径。node根据标识符中的路径查找文件,如果文件后缀名省略,node会依次尝试.js, .json, .node,每一种后缀名都对应一种不同的加载方式。通过require.extensions可以看到已有的文件加载方式,也可以自定义指定格式的加载方式。比如下面的代码定义了.txt文件的加载方式。
require.extensions['.txt'] = function (module, filename) {
var fs = require('fs')
var res = fs.readFileSync(filename)
module.exports = res.toString()
}
加载自定义模块的标识符与核心模块的类似,不过核心模块具有更高的优先级。所以自定义模块不能与核心模块重名。在加载自定义模块时,会依次查找当前目录下的node_modules,父目录下的node_modules,……,根目录下的node_modules。通过module.paths查看所有需要查找的路径。
require()不仅可以加载文件,还可以加载一个包,即通过标识符查找到的是一个目录。它会加载该目录下package.json中main指定的文件。如果加载失败,则继续查找目录下的index,即index.js, index.json, index.node
被加载后的文件会被缓存,再次加载时文件不会再次执行,而是从缓存中读取。已经缓存的文件可以通过require.cache查看。也可以在此处删除缓存。
在加载模块时,node会向模块提供几个变量,exports, module, require, __dirname, __filename。其中exports, module, require为模块提供加载模块,导出内容的功能,__dirname为当前文件所在目录的绝对路径,__filename为当前文件的绝对路径