模块
什么是模块?
当一个js文件可以独立完成一个功能的时候,这个js文件就是一个模块;
当一个多个.js文件共同完成一个功能的时候,这个些js文件就是一个模块。
模块就是module(模块的意思)
HTML的多文件引用
HTML的宿主环境中,多一个js文件公用一个html宿主,此时它们的作用域是公用的
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <script src="./1.js"></script> //var a=1 <script src="./2.js"></script> //console.log(a) </body> </html>
,
此时查看控制台输出1,因为此时01.js文件中的a是全局变量也就是window的属性,所以02.js是可以使用window.a的也就是1
Node.js的多文件引用
┣ app.js
┣ 01.js
//app.js文件 require("./1.js"); console.log("app.js文件") //1.js文件 console.log("我是1.js文件")
此时node app.js可以看到
在Node.js中require()引用文件在引用的同时也在执行,所以就能过输入两个文件的内容
Node.js中的js文件作用域天生隔离
//1.js var a = 1; //app.js require("./1.js") console.log(a)
此时node app.js文件会报错
js文件在NodeJS中作用域隔离,因为NodeJS没有window对象,所以此时会报错
此时我们想让文件之间能够相互通信,需要让文件自己暴露
exports命令
//1.js var a = 1; // 向外暴露a参数 exports.a = a; //app.js var a = require("./1.js") // 输入a文件的a参数 console.log(a.a)
此时在node app.js文件,
注意:
- 暴露的时候必须是exports.** = **,此时**必须是统一的,必要有差异化
- 接收文件的时候,文件名是什么就用什么命名
exports的命名空间
┣ app.js
┣ 01.js
//1.js var a = 1; // 向外暴露a参数 exports.a = a; //app.js var a = require("./1.js") // 输入a文件的a参数 console.log(a.a)
我们在输出1.js文件的a值的时候使用的是a.a,这个a就是exports返回的一个对象
这样做的好处是什么?这种写法天生有自己的命名空间
┣ app.js
┣ round.js
┣ rectangle.js
我们在新建两个文件
//round.js function area(r){ return 3.14 * r * r } exports.area = area; //rectangle.js function area(a,b){ return a * b; } exports.area = area;
//app.js
var round = require("./round");
var rectangle = require("./rectangle");
console.log(round.area(5));
console.log(rectangle.area(5,6));
exports是可以暴露多个参数的
比如round.js
function area(r){ return 3.14 * r * r } function perimeter(r) { return 3.14 * 2 * r; } exports.area = area; exports.perimeter = perimeter;
module.exports命令
当一个js文件仅仅希望暴露一个参数,通常是构造函数,此时我们可以使用module.exports命令进行暴露
┣ app.js
┣ People.js
//People.js function People(name,age,sex){ this.name = name; this.age = age; this.sex = sex; } People.prototype.sayHello = function(){ console.log("你好我是"+this.name+",我是一个"+this.sex+"生,我今年"+this.age+"岁了!") } module.exports = People; //app.js var People = require("./People.js"); var xiaoming = new People("小明",18,"男"); xiaoming.sayHello()
此时node app.js文件可以看到
我们发现小明在new的时候并没有使用和exports类似的命名空间对象,是因为module.exports默认返回的不是对象而是结果
注意:
- 如果文件中要暴露多个参数,此时需要命名空间使用exports.**
- 如果只有一个参数并且是构造函数使用module.exports.**