1. 内置模块
NodeJS中内置了很多模块,可以直接用require来进行引用。
名字最好和模块的名字一样。
var http = require("http");
var qs = require("requrystring");
内置模块的引用使用require函数,require表示引用的意思。
2. 自定义模块
每一个js文件就是一个模块。
2.1 require谁就会运行谁
同级目录中有两个文件 test.js 2.js
test.js:
require('./2.js');
console.log('我是test.js文件里的语句')
2.js
console.log('我是2.js里的文件')
运行text.js
![](https://images2018.cnblogs.com/blog/1387444/201808/1387444-20180816235433875-1527010044.png)
结论:require()谁,就会运行谁。
注意点:
require的文件中如果有异步语句,此时nodejs不会死等它结束,会返回执行主文件中的程序,如果文件读取完毕,执行回调函数。
可以连续require
如果循环引用
如果A引用B,B引用A会发生什么?
nodejs很智能,如果B重新引用了A,此时如同没有引用一样,会帮你自动抑制。
test.js:
require('./2.js');
console.log('我是test.js文件里的语句')
2.js
require('./test.js')
console.log('我是2.js里的文件')
![](https://images2018.cnblogs.com/blog/1387444/201808/1387444-20180816235951919-1220923727.png)
js文件天生是隔离作用域的
test.js:
require('./2.js');
console.log('我是test.js文件里的语句.a的值是'+a)
2.js
var a=100
console.log('我是2.js里的文件.a的值是'+a)
![](https://images2018.cnblogs.com/blog/1387444/201808/1387444-20180817000423574-1482507533.png)
程序报错
在2.js中定义的a,不能再test.js中使用
在Node.js中,每个js文件是单独的作用域
如果我们想在test..js中使用2.js定义的a
可以使用exports.xx = xx的语法暴露
test.js
2.js
运行test.js
我们如果想要把变量或者函数向外暴露,此时可以使用exports.** = **向外暴露。
此时引用这个模块的文件将用等号来接收,等号左边的变量将自动成为exports对象。
使用module.exports暴露
如果js文件中,仅仅向外暴露一个东西,
使用exports.xx = xx很不方便
此时可以使用 module.exports =xx的写法
如果一个js文件要向外暴露多个变量、函数,此时exports.xx = xx;如果仅仅暴露一个东西,通常是构造函数,此时语法为module.exports = xx;