一、HTML的多文件引用。
pvg易塔云建站-模板下载,web开发资源,技术博客HTML的宿主环境中,多个js文件共用一个HTML宿主,此时他们的
作用域是公用的。
<!DOCTYPE html>pvg易塔云建站-模板下载,web开发资源,技术博客
<html lang="en">pvg易塔云建站-模板下载,web开发资源,技术博客
<head>pvg易塔云建站-模板下载,web开发资源,技术博客
<meta charset="UTF-8">pvg易塔云建站-模板下载,web开发资源,技术博客
<meta name="viewport" content="width=device-width, initial-scale=1.0">pvg易塔云建站-模板下载,web开发资源,技术博客
<title>Document</title>pvg易塔云建站-模板下载,web开发资源,技术博客
</head>pvg易塔云建站-模板下载,web开发资源,技术博客
<body>pvg易塔云建站-模板下载,web开发资源,技术博客
<script src="01.js"></script> →var a = 100pvg易塔云建站-模板下载,web开发资源,技术博客
<script src="02.js"></script> →alert(a)pvg易塔云建站-模板下载,web开发资源,技术博客
</body>pvg易塔云建站-模板下载,web开发资源,技术博客
</html>
此时页面是可以弹出100的,因为此时01.js文件中的a是全局变量也就是window的属性,所以02.js是可以使用window.a的,也就是100。
pvg易塔云建站-模板下载,web开发资源,技术博客pvg易塔云建站-模板下载,web开发资源,技术博客二、Node.js的多文件引用。
app.jspvg易塔云建站-模板下载,web开发资源,技术博客
01.js
app.js中:
require("./01.js")pvg易塔云建站-模板下载,web开发资源,技术博客
console.log("app.js文件")
01.js中:
console.log("01.js文件")
输入命令:node app.js
pvg易塔云建站-模板下载,web开发资源,技术博客
pvg易塔云建站-模板下载,web开发资源,技术博客在Node.js中require()引用文件在引用的同时也在执行,所以就能通过打印两个文件的内容。
pvg易塔云建站-模板下载,web开发资源,技术博客pvg易塔云建站-模板下载,web开发资源,技术博客三、Node.js中的js文件作用域天生隔离。
app.jspvg易塔云建站-模板下载,web开发资源,技术博客
01.js
01.js文件:
var a = 100;
app.js文件:
require("./01.js")pvg易塔云建站-模板下载,web开发资源,技术博客
console.log(a)
输入命令:node app.js
pvg易塔云建站-模板下载,web开发资源,技术博客
pvg易塔云建站-模板下载,web开发资源,技术博客错误信息内容是a没有被定义。
pvg易塔云建站-模板下载,web开发资源,技术博客js文件在Node.js中作用域隔离,因为Node.js没有window对象。pvg易塔云建站-模板下载,web开发资源,技术博客
此时我们想要文件之间能过互相通信,所以需要让文件自己暴露,或者保留一个进出口通道,用来传递信息。pvg易塔云建站-模板下载,web开发资源,技术博客pvg易塔云建站-模板下载,web开发资源,技术博客四、exports 命令。
app.jspvg易塔云建站-模板下载,web开发资源,技术博客
a.js
pvg易塔云建站-模板下载,web开发资源,技术博客
app.js文件内容:
var a = require("./a.js")pvg易塔云建站-模板下载,web开发资源,技术博客
// 输入a文件的num参数pvg易塔云建站-模板下载,web开发资源,技术博客
console.log(a.num)
a.js文件内容:
var num = 100;pvg易塔云建站-模板下载,web开发资源,技术博客
// 向外暴露num参数pvg易塔云建站-模板下载,web开发资源,技术博客
exports.num = num;
输入命令:node app.js
pvg易塔云建站-模板下载,web开发资源,技术博客
pvg易塔云建站-模板下载,web开发资源,技术博客两点建议:
pvg易塔云建站-模板下载,web开发资源,技术博客开辟通道出入口的时候必须是 exports.** = **,此时**必须是统一的,不能有差异化。
pvg易塔云建站-模板下载,web开发资源,技术博客正确方式:
pvg易塔云建站-模板下载,web开发资源,技术博客a.js文件:
var b = 100;pvg易塔云建站-模板下载,web开发资源,技术博客
exports.b = b;
在app.js引入:
var a = require("./a.js");pvg易塔云建站-模板下载,web开发资源,技术博客
console.log(a.b)
错误的方式:
pvg易塔云建站-模板下载,web开发资源,技术博客a.js文件:
var b = 100;pvg易塔云建站-模板下载,web开发资源,技术博客
exports.c = b;
第二个:建议在接收文件的时候,文件名是什么就用什么命名。
pvg易塔云建站-模板下载,web开发资源,技术博客正确的:
var a = require("./a.js");
错误的:
var b = require("./a.js");
上面两个建议虽然错误写法不会报错,但是我们要求同学们要统一规范。
pvg易塔云建站-模板下载,web开发资源,技术博客pvg易塔云建站-模板下载,web开发资源,技术博客五、exports的命名空间。
pvg易塔云建站-模板下载,web开发资源,技术博客看下面的目录结构:
a.jspvg易塔云建站-模板下载,web开发资源,技术博客
app.js
a.js文件:
var num = 100;pvg易塔云建站-模板下载,web开发资源,技术博客
// 向外暴露num参数pvg易塔云建站-模板下载,web开发资源,技术博客
exports.num = num;
app.js文件:
var a = require("./a.js")pvg易塔云建站-模板下载,web开发资源,技术博客
// 输入a文件的num参数pvg易塔云建站-模板下载,web开发资源,技术博客
console.log(a.num)
你会发现,我们在输出a.js文件的num值的时候使用的是a.num,这个a就是exports返回的一个对象,这样做有什么好处呢?这种写法天生有自己的命名空间。
app.jspvg易塔云建站-模板下载,web开发资源,技术博客
round.jspvg易塔云建站-模板下载,web开发资源,技术博客
rectangle.js
round.js和rectangle.js都定义了area函数,但是由于我们都有自己的命名空间,所以互不相干扰。
pvg易塔云建站-模板下载,web开发资源,技术博客round.js文件:
function area(r){pvg易塔云建站-模板下载,web开发资源,技术博客
return 3.14 * r * rpvg易塔云建站-模板下载,web开发资源,技术博客
}pvg易塔云建站-模板下载,web开发资源,技术博客
exports.area = area;
rectangle.js文件:
function area(a,b){pvg易塔云建站-模板下载,web开发资源,技术博客
return a * b;pvg易塔云建站-模板下载,web开发资源,技术博客
}pvg易塔云建站-模板下载,web开发资源,技术博客
exports.area = area;
app.js文件:
var round = require("./round");pvg易塔云建站-模板下载,web开发资源,技术博客
var rectangle = require("./rectangle");pvg易塔云建站-模板下载,web开发资源,技术博客
console.log(round.area(5));pvg易塔云建站-模板下载,web开发资源,技术博客
console.log(rectangle.area(5,6));
pvg易塔云建站-模板下载,web开发资源,技术博客我们的exports是可以开辟多个通道的。比如round.js文件:
function area(r){pvg易塔云建站-模板下载,web开发资源,技术博客
return 3.14 * r * rpvg易塔云建站-模板下载,web开发资源,技术博客
}pvg易塔云建站-模板下载,web开发资源,技术博客
function perimeter(r) {pvg易塔云建站-模板下载,web开发资源,技术博客
return 3.14 * 2 * r;pvg易塔云建站-模板下载,web开发资源,技术博客
}pvg易塔云建站-模板下载,web开发资源,技术博客
exports.area = area;pvg易塔云建站-模板下载,web开发资源,技术博客
exports.perimeter = perimeter;
pvg易塔云建站-模板下载,web开发资源,技术博客五、module.exports命名。
pvg易塔云建站-模板下载,web开发资源,技术博客当一个js文件仅仅希望开辟唯一通道展现一个参数时,通常是构造函数,此时我们可以使用module.exports命名进行暴露。
app.jspvg易塔云建站-模板下载,web开发资源,技术博客
People.js
People.js文件:
function People(name,age,sex){pvg易塔云建站-模板下载,web开发资源,技术博客
this.name = name;pvg易塔云建站-模板下载,web开发资源,技术博客
this.age = age;pvg易塔云建站-模板下载,web开发资源,技术博客
this.sex = sex;pvg易塔云建站-模板下载,web开发资源,技术博客
}pvg易塔云建站-模板下载,web开发资源,技术博客
People.prototype.sayHello = function(){pvg易塔云建站-模板下载,web开发资源,技术博客
console.log("你好我是"+this.name+",我是一个"+this.sex+"生,我今年"+this.age+"岁了!")pvg易塔云建站-模板下载,web开发资源,技术博客
}pvg易塔云建站-模板下载,web开发资源,技术博客
module.exports = People;
app.js文件:
var People = require("./People.js");pvg易塔云建站-模板下载,web开发资源,技术博客
var xiaoming = new People.People("小明",18,"男");pvg易塔云建站-模板下载,web开发资源,技术博客
xiaoming.sayHello()
此时我们发现小明在new的时候并没有使用和exports类似的命名空间对象,是因为modue.exports默认返回的不是对象,而是结果。可以在控制台打印输出查看。
pvg易塔云建站-模板下载,web开发资源,技术博客所以,总结:
pvg易塔云建站-模板下载,web开发资源,技术博客1,如果文件要暴露多个参数,此时需要命名空间使用exports.**=**;
pvg易塔云建站-模板下载,web开发资源,技术博客2,如果只有一个参数并且是构造函数时使用module.exports.**;
pvg易塔云建站-模板下载,web开发资源,技术博客pvg易塔云建站-模板下载,web开发资源,技术博客六、文件夹的使用。
app.jspvg易塔云建站-模板下载,web开发资源,技术博客
result.jspvg易塔云建站-模板下载,web开发资源,技术博客
round.jspvg易塔云建站-模板下载,web开发资源,技术博客
rectangle.jspvg易塔云建站-模板下载,web开发资源,技术博客
index.js
此时我们将round.js和rectangle.js放到了一个result文件夹内部,被index.js进行整合。我们index.js文件:
var rectangle = require("./rectangle");pvg易塔云建站-模板下载,web开发资源,技术博客
var round = require("./round");pvg易塔云建站-模板下载,web开发资源,技术博客
exports.round = round;pvg易塔云建站-模板下载,web开发资源,技术博客
exports.rectangle = rectangle;
app.js文件:
var result = require("./result");pvg易塔云建站-模板下载,web开发资源,技术博客
console.log(result.round.area(5));pvg易塔云建站-模板下载,web开发资源,技术博客
console.log(result.rectangle.perimeter(4,5));
如果我们require()没有.js后缀,此时Node.js会认为我们在引入一个文件夹,并且执行文件夹内部根目录的index.js文件。index.js:
var result = require("./result");pvg易塔云建站-模板下载,web开发资源,技术博客
等价于下面的pvg易塔云建站-模板下载,web开发资源,技术博客
var result = require("./result/index.js");
需要注意的是不能省略./
pvg易塔云建站-模板下载,web开发资源,技术博客pvg易塔云建站-模板下载,web开发资源,技术博客七、node_module文件夹。
pvg易塔云建站-模板下载,web开发资源,技术博客Node.js中,如果文件夹内部存放了node_module文件夹,此时内部的文件引入的时候就不用了写./了。
app.jspvg易塔云建站-模板下载,web开发资源,技术博客
node_modulepvg易塔云建站-模板下载,web开发资源,技术博客
resultpvg易塔云建站-模板下载,web开发资源,技术博客
round.jspvg易塔云建站-模板下载,web开发资源,技术博客
rectangle.jspvg易塔云建站-模板下载,web开发资源,技术博客
index.js
我们的result文件夹的内容和第六部分保持一致,就是被一个node_module文件夹包裹了,此时我们引入的时候也发生了变化。
var result = require("result");pvg易塔云建站-模板下载,web开发资源,技术博客
console.log(result.round.area(5));pvg易塔云建站-模板下载,web开发资源,技术博客
console.log(result.rectangle.perimeter(4,5));
总结,如果我们使用require去引入文件,不加./是引入node_module文件夹内部的文件,否则就是本地其他文件。
require内容 |
引用地址 |
require("./result.js") |
同目录下的result.js |
require("./result") |
同目录下的result文件夹内部的index.js |
require("result") |
node_module文件夹内部的result文件夹内部的index.js |
require("result.js") |
node_module文件夹内部的result.js |