1、基本介绍
每个文件是一个模块,有自己的作用域。
在模块内部 module变量代表模块本身。
module.exports属性代表模块对外的接口。
2、 module
对当前模块的引用,其exports属性用于指定一个模块所导出的内容,即可以通过 require() 访问的内容。
3、 exports
这是一个对于 module.exports 的更简短的引用形式。
4、require()
require用于加载一个模块(用户自定义模块、第三方模块、系统模块)
前两者是在运行时动态加载的,需要通过路径分析,文件定位,编译等,因此加载速度慢于核心模块。(速度:系统模块>用户自定义模块>第三方模块)
注意事项:
module被加载的时候执行,加载后缓存(browserify也一样)。
避免模块间的相互依赖!(A依赖于B B依赖于A)
1、模块标识符
require方法接受一个标识符作为参数。在Node的实现中正是基于这样的一个标识符进行模块的查找。标识符在模块中主要分为以下几类:
1. 系统模块
2. ./ 或 ../开始的相对路径文件模块
3. /开始的绝对路径文件模块
4. 非路径形式的文件模块。
2、 模块路径
模块路径是node在定位文件模块的具体文件时制定的查找策略。具体表现为一个路径组成的数组。
Module.paths
: 返回一个数组,require加载模块便是基于该数组进行查找,这个数组是从当前文件下的node_module
s,一层一层往上到所在盘下的node_modules.
3、 文件定位
require(模块标识符),标识符可以不包含扩展名,Node会按照以下顺序
.js | .json | .node
的顺序进行补足扩展名.
在进行补足扩展名时候,如果发现并没有这个文件,我们得到的是一个文件夹(目录),Node会把目录当做包来处理.
Node对包进行以下处理:
1) 在当前目录下查找package.json
文件.通过JSON.parse()
解析出包描述对象,通过其中的main属性的文件名进行再次定位查找,如果该文件名没有扩展名,再次按照之前的文件扩展名补足方式进行补足.
2)main属性指定的文件名错误,或者当前目录不存在package.json
文件,Node会把index当做默认文件名,依次查找
index.js | index.json | index.node.
如果在目录分析的过程中没有成功定位到任何文件或目录,则按照module.paths
,遍历该路径数组,如果都不存在就报错.
4、 总结
分析模块标识符能否定位到一个确切的文件或目录
如果可以:
文件:直接定位文件
目录:包的规则
如果不可以
1、自定义模块user.js
console.log("user")
module.exports = function () {
console.log("用户自定义模块")
}
2、引入用户自定义模块
const snw = require("./snw/snw.js");
snw();
注意路径问题:../
返回上一级目录
3、引入系统模块
const fs = require("fs")
// console.log(fs)
const path = require("path")
// console.log(path)
const event = require("events")
console.log(event)
4、第三方模块
说明:引入的第三方模块是chalk。
引入指令:
npm init -y
npm install chalk --save-dev
console.log(module.paths)
const chalk = require("chalk")
console.log(chalk.blue('Hello world!'));
console.log(chalk.blue.bgRed.bold('Hello world!'));
5、缓存
说明:js引入多个相同模块时,只会执行一次引入模块。
require("./custom/user")
require("./custom/user")
require("./custom/user")
require("./custom/user")
require("./custom/user")
console.log(module.paths)
测试结果:
"D:\DevFiles\WebStorm 2018.1.4\bin\runnerw.exe" D:\DevFiles\nodejs\node.exe E:\atguiguCode\WebProject\web_code\work\Node\02_commonjs\04_缓存.js
user
[ 'E:\\atguiguCode\\WebProject\\web_code\\work\\Node\\02_commonjs\\node_modules',
'E:\\atguiguCode\\WebProject\\web_code\\work\\Node\\node_modules',
'E:\\atguiguCode\\WebProject\\web_code\\work\\node_modules',
'E:\\atguiguCode\\WebProject\\web_code\\node_modules',
'E:\\atguiguCode\\WebProject\\node_modules',
'E:\\atguiguCode\\node_modules',
'E:\\node_modules' ]
Process finished with exit code 0
1、相对路径&绝对路径
相对路径都是参照于当前模块文件的 与 node的执行目录没有关系
绝对路径参照于 node的根目录
2、node路径
process.cwd():node的执行目录
在node中除了require以外其他api中涉及到相对路径都是参照于 process.cwd()