这是我参与8月更文挑战的第12天,活动详情查看:8月更文挑战
Node中的模块化
什么是模块化
- js设计之初只是为了实现表单验证这样的简单功能,没设计模块化方案,所以js天生不支持模块化
- 不支持模块化简单来说就是在一个js文件内不能引入其他js文件
- 为了让js支持模块化,一些大神自己编写底层库文件,让js开始支持模块化
- js模块化规范有四种标准: AMD CMD CommonJS ES6
- Node属于CommonJS标准
- 使用模块化可以很好的解决变量、函数名冲突问题,也能灵活的解决文件依赖问题
全局作用域和局部作用域
局部作用域(模块的作用域):
- 一个js文件就是一个模块
- 在一个js文件中定义的属性(变量、常量)和方法默认都只能在当前js文件中使用
案例: 创建index.js、user.js两个模块。 user.js 模块中定义属性和方法,index.js导入user.js模块
- 创建 users.js 文件
//在一个js文件中定义的变量、常量、方法等都只能在该文件中使用
//这就叫局部作用域
//一个js文件就是一个模块
const name = 'zs';
const person = {
name: '王重阳',
age: 50,
skill: '九阴真经'
}
function show () {
console.log('我叫王大锤,万万没想到我参加了声临其境');
}
- 创建index.js文件,加载 users.js
// 局部作用域测试:
// 加载 users.js --- 加载自定义模块时,必须使用路径形式
const user = require('./users.js');
console.log(user); // 结果为 {}
show(); // 结果是 未定义的show
console.log(person.skill);
执行结果:
全局作用域:
- 在js文件中声明的属性和方法如果都挂载到global对象下;当其他js文件导入该模块后,就能使用该模块下的属性和方法了。
案例: 创建index.js、game.js两个模块。 game.js 模块中定义属性和方法并挂载到global对象下,index.js导入game.js模块
- 创建 game.js 文件,并将数据挂载到 global对象下
//将变量、对象、方法直接挂载到global对象上,
//就变成了全局作用域
global.name = '王者荣耀';
global.obj = {
name: 'lol',
company: 'tencent',
type: 'moba'
}
global.sayHi = function () {
console.log('LOL 挺好玩的...');
}
- 在 index.js 文件中加载 game.js 文件
//全局作用域测试:
require('./game.js');
console.log(global.name);
console.log(global.obj.name);
global.sayHi();
执行结果:
module.exports导出属性和方法
- 将变量、对象、函数等挂载到global对象上并不推荐,因为容易造成变量污染。
- 推荐使用 module.exports 导出模块中定义好的变量、对象、方法
- 使用require加载(导入)模块后,就能使用模块中定义好的变量、对象、方法了
案例: users.js中定义变量、对象、方法,最后使用 module.exports 导出
const name = 'zs';
const person = {
name: '王重阳',
age: 50,
skill: '九阴真经'
}
function show () {
console.log('我叫王大锤,万万没想到我参加了声临其境');
}
//使用 module.exports 导出定义好的变量、对象、方法
module.exports = {
name,
person,
show
}
index.js中加载users.js模块
//使用路径方式加载第三方模块
//通过module.exports导出的变量、对象、方法以整体的对象
//像是保存到了 user 变量中
const user = require('./users.js');
console.log(user.name);
console.log(user.person.name);
user.show();
执行结果:
下文讲 node 和数据库链接操作数据库
点赞支持、手留余香、与有荣焉,动动你发财的小手哟,感谢各位大佬能留下您的足迹。