<node.js学习笔记(1)>

304 阅读2分钟

1.笔记

common.js是js的一套规范,弥补js中的一些缺陷
1.没有模块系统 2.没有标准接口 3.没有标准库
每一个js文件都是一个独立的模块.
node.js的顶层对象: global

创建两个js文件为01.js和02.js

2.模块的导入导出

  1. 模块的导入关键词 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 输入{} 空对象

  1. 模块的导出

第一种 : 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
分析:

  1. 第一步先在macro-task队列中去script(全部代码)并分类 macro-task : setTimeout、setImmediate
    micro-task : process.nextTick、Promise中的then
  2. 第二步执行micro-task里的process.nextTick、Promise中的then,执行完毕后,清空micro-task队列;再从macro-task里往后一块setTimeout,若产生别的异步就放到micro-task中执行,没有就执行第三步
  3. 第三步再从macro-task往后setImmediate.