1.为什么需要模块化?
当一个文件下代码写多了之后,会越来越难以掌控,会出现以下的问题
1. 全局变量污染(假如a.js里提供一个getRandom这个工具函数给其他js使用,这个很正常没问题,但是如果其他同事也写了一个名字叫做getRandom函数在其他的b.js里面,刚好有一个c.js需要引用a.js和b.js,这样子势必会造成变量污染)
2. 依赖混乱(一个项目js多的时候,当a.js需要b.js、b.js又需要c.js、c.js又需要a.js,这样子引用的顺序就无法确定,很混乱 )
2.CommonJS如何实现模块化
node天生支持CommonJS模块化标准(CMJ社区标准),并且只有nodejs环境支持CommonJS规范
CMJ规范:
1. node中的每个js文件都是一个CMJ模块,通过node命令运行的模块,叫做入口模块
2. 模块中的所有全局定义的变量、函数,都不会污染到其他模块
3. 模块可以暴露(导出)一些内容给其他模块使用,需要暴露什么内容,就在模块中给module.exports赋值
4. 一个模块可以导入其他模块,使用函数require(“要导入的模块路径”)即可完成,该函数返回目标模块的导出结果
1. 导入模块时,可以省略.js
2. 导入模块时,必须以./或../开头
5.一个模块在被导入时会运行一次,然后它的导出结果会被node缓存起来,后续对该模块导入时,不会重新运行,直接使用缓存结果
☆ 3.使用代码示例 ☆
1.直接导出及导入使用
文件路径:COMMONJS/information.js(导出)
module.exports = {
name: "小灿同学",
age: 22,
};
文件路径:COMMONJS/index.js(导入)
const info = require("./information");
console.log(info.name);
console.log(info.age);
// 上述三行代码或者下述三行代码(直接解构)
const { name, age } = require("./information");
console.log(name);
console.log(age);
2.单个导出及导入使用
文件路径:COMMONJS/util.js(导出)
function getRandom() {
return Math.random();
}
module.exports = getRandom;
文件路径:COMMONJS/index.js(导入)
const getRandom = require("./util");
console.log(getRandom());
3.多个导出及导入使用
文件路径:COMMONJS/util.js(导出)
function getRandom() {
return Math.random();
}
function sum(a, b) {
return a + b;
}
module.exports = { getRandom, sum };
文件路径:COMMONJS/index.js(导入)
const util = require("./util");
console.log(util.getRandom());
console.log(util.sum(1, 2));
// 上述三行代码或者下述三行代码(直接解构)
const { getRandom, sum } = require("./util");
console.log(getRandom());
console.log(sum(1, 2));