1.笔记
common.js是js的一套规范,弥补js中的一些缺陷
1.没有模块系统 2.没有标准接口 3.没有标准库
每一个js文件都是一个独立的模块.
node.js的顶层对象: global
创建两个js文件为01.js和02.js
2.模块的导入导出
- 模块的导入关键词 require
//在01.js中导入02.js
const obj = require("./02.js"); //0依赖于02
/*
1. 当前文件下的文件之前要加"./",表示寻找自定义的模块,不加则表示去node内置中找模块.
2. 自定义的模块一定要加"./",核心模块和第三方依赖模块不需要加.
3. 去上一层找 "../";
4. js文件的后缀.js可以省略
*/
在终端运行
const obj = require("./02.js");
console.log(obj);
node -./01 输入{} 空对象
- 模块的导出
第一种 : glabal
global.liang = {
name : liang,
age : 18
}
//此方法是唯一定义全局变量的做法,但是几乎不用,因为很少会去认为定义全局变量
第二种: module.exports
module.exprots默认值是{},所有模块都能用,也是全局变量
let liang = "123";
module.exports.liang = liang;
在终端运行
node ./01.js 输出{liang : "123"}
简写:
global.exports 相当于exports
因为有一步操作: global.exports = module.exports
因为module.exports 是引用类型,所以传的是地址,因此不能直接
exports = 123; //错误
正确的为:
exports.a = 100 //正确
2.事件的循环机制
事件队列:
macro-task(宏任务) : script(全部代码)、setTimeout/setInterval、setImmediate、..
micro-task(微任务) : process.nextTick、Promise中的then
例子
新建03.js文件
process.nextTick(() => {
console.log(1);
});
process.nextTick(() => {
console.log(2);
});
new Promise(res => {
res("12")
}).then(res => {
console.log(res);
});
setImmediate(() => {
console.log(3);
process.nextTick(() => {
console.log(4);
});
});
setImmediate(() => {
console.log(5);
process.nextTick(() => {
console.log(11);
});
});
setTimeout(() => {
console.log(7);
process.nextTick(() => {
console.log(10);
});
}, 0);
process.nextTick(() => {
console.log(8);
});
console.log(6);
在终端运行
node ./03
结果: 6 1 2 8 12 7 10 3 5 4 11
分析:
- 第一步先在macro-task队列中去script(全部代码)并分类
macro-task : setTimeout、setImmediate
micro-task : process.nextTick、Promise中的then - 第二步执行micro-task里的process.nextTick、Promise中的then,执行完毕后,清空micro-task队列;再从macro-task里往后一块setTimeout,若产生别的异步就放到micro-task中执行,没有就执行第三步
- 第三步再从macro-task往后setImmediate.