003nodejs的模块化
[A] 模块化简介
1. 在node中,一个js文件就是一个模块
2. 在node中,每一个js文件中的js代码都是独立运行在一个函数中,而不是在全局作用域,
所以一个模块中的变量和函数在其他模块中是不能访问的
3. 一个模块中的变量和函数若想被其他模块所访问,那就需要将其变量和函数向外部进行暴露,
即函数和方法需要进行导出
4. 一个模块想要访问其他模块中的变量和函数,需要先将这个模块进行导入
[B] CommonJS标准模块导出与导入
CommonJS标准导出:exports
示例:
// 002.js var name = "Jack"; var age = 20; var job = "我是一个web前端工程师"; console.log("我是一个模块1,等待被调用"); // 模块导出 exports.name = name; exports.age = age exports.job = job; // 变量 导出简写方法 module.exports = {name, age, job}
CommonJS标准导入:require(path)
参数:引入模块的路径,如果路径使用相对路径,必须以.或者..开头
返回值:返回值为引入的模块实例
示例:
// 003.js // 模块导入 var md = require("./002.js"); // 返回值md为模块对象 console.log(md.name);
[C] ES6标准模块导出与导入
ES6标准导出:
示例:
// 002.js var name = "Jack"; var age = 20; var job = "我是一个web前端工程师"; console.log("我是一个模块1,等待被调用"); // 模块导出 export {name, age, job};
ES6标准导入:
示例:
// 003.js import {name, age, job} from "./002.js"; // 这里导入的变量名必须和导入文件中导出的文件名相同 console.log(name); console.log(age);
[D] 导入的模块分为两大类
1. 核心模块
由node引擎提供的模块
模块的标识符就是模块的名字
如:require("fs")等
2. 文件模块
包括第三方模块和用户自定义模块
[E] 在js文件中定义的变量,函数,类不是全局变量
【验证】
任何一个全局变量,函数,类都是global的属性或者方法
我们可以通过打印全局变量的这个属性或方法查看是否存在
代码:
console.log(global.xxx) 若xxx是全局变量则会打印出它的值,否则会显示undefined
在js中定义一个全局变量:
不指定var, let或者const:
如:
a = 10; 等价于:window.a = 10;
// 即定义了一个全局变量a。
[F] js代码的执行
当node函数在执行模块化代码时,他会首先将我们写的js代码放在函数:
function(exports, require, module, __filename, __dirname) {
}
的内部,然后在执行,因此,我们写的.js文件变量和函数都是局部的模块中的代码会被放在上述的这个函数中运行,同时传入5个参数:
exports:
对象,该对象用来将变量和函数暴露到外部
require:
函数,用来引入外部的模块
module:
模块,代表我们当前的模块
exports就是module的一个属性,因此module.exports等价于exports,即module.exports==exports 为true
__filename:
路径,当前模块的完整路径(绝对路径),如:d:\VSCode\Files\Nodejs\模块化\002.js
__dirname:
文件夹路径:当前文件所在的文件夹的路径,如:d:\VSCode\Files\Nodejs\模块化
[G] exports和module.exports
通过exports只能用.的方式向外暴露自身变量和函数
module.exports既可以通过.的方式,也可以通过直接赋值的方式
module.exports.xxx = xxx
module.exports = {}