node的模块实现很大程度的参考了CommonJS规范,例如使用 require(...)
引入模块,使用module.exports、exports
抛出模块
这里的exports
其实就是module.exports
node采用优先缓存加载模块的优化策略:即对于相同的模块的二次加载,一律先从缓存内加载
node中的模块主要分为三类:核心模块(fs、path、http...
),文件模块,自定义模块(第三方依赖)
核心模块:核心模块在node源代码编译过程中就被编译为二进制代码了,查找核心模块不需要路径分析
文件模块:以 . .. /
开始的标识符,都会被当做文件模块解析,其实就是我们自己书写的模块代码,标识符就是相对路径
自定义模块(第三方依赖):这是一种特殊的文件模块,可能是一个文件或者一个包
模块路径:对于核心模块,没有模块路径一说;对于文件模块,标识符就是相对路径;对于自定义模块,会依次在本目录下的node_modules、上级目录下的node_modules 、直到最顶级目录下的node_modules下查找
模块编译:每一个使用require(...)
引入的模块,其实都对模块内容进行了包装
(functon (exports, require, module,__filename, __dirname){
//引入的模块原本的内容
return module.exports;
})
当我们引入某一个模块时,上面的包装函数其实会被隐式的调用,举个例子:
//开发代码
const module = require("./module");
//编译代码
const module = (functon (exports, require, module,__filename, __dirname){
//引入的module模块的原本内容
return module.exports;
})()