模块

什么是模块?

当一个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.**

 

posted @ 2021-10-18 17:09  keyeking  阅读(58)  评论(0编辑  收藏  举报