Node.js | 青训营笔记

101 阅读2分钟

这是我参与「第四届青训营」笔记创作活动的第8天

课程概要

一些介绍

Node.js是一个基于Chrome V8引擎的JavaScript运行时环境
特点:异步I/O,单线程,跨平台

异步I/O

当Node.js执行I/O操作时,会在响应返回并恢复操作,而不是阻塞线程并浪费CPU循环等待。

const { readFile } = require('fs'); 
readFile('./package.json', { encoding: 'utf-8' }, (err, data) => { 
    if (err) { throw err; } 
    console.log(data); 
}); 
console.log(123456);

单线程

保持了JavaScript在浏览器中单线程的特点
优点:

  • 不用处处在意状态同步问题,不会发生死锁
  • 没有线程上下文切换带来的性能开销

缺点:

  • 无法利用多核CPU
  • 错误会引起整个应用退出,健壮性不足
  • 大量计算占用导致CPU,无法继续执行

跨平台

兼容Windows和Linux平台

Node.js应用场景

  1. 前端工程化
  2. Web服务端应用
  3. Electron跨端桌面应用

Node.js运行时结构

image.png

编写Http Server

Common.JS规范:node.js支持commonjs模块规范,采用同步机制加载模块

//greeting.js
const prefix = 'hello';
const sayHi = function(){
    console.log(`${prefix}world`);
}
exports.sayHi = sayHi;

//index.js
const{ sayHi } = require('./greeting');
sayHi();

加载方式:

  • 加载内置模块
  • 加载相对require('./file.js') 或绝对路径require('/user/.../file.js')的文件模块
  • 加载npm包require('loadsh')

require.cache中缓存着加载过的模块,缓存的原因:同步加载

  1. 文件模块查找耗时,如果每次require都需要重新遍历查找,性能会比较差;
  2. 在实际开发中,模块可能包含副作用代码 node.js内置http模块
const http = require('http');
http.createServer((req,res)=>{
    res.end('Hello World\n');
}).listen(3000,()=>{
    console.log('App running at http://127.0.0.1:3000/')
})

延伸话题

image.png

代码实战

目的:赌气package.json中main字段对应的文件内容
question:如何解决回调地狱?

image.png Promise

Promise是具有四个状态的有限状态机,其中三个核心为Pending(挂起),Fulfilled(完成)、Rejected(拒绝),以及还有一个未开始状态 使用primise,实现目的。

image.png event发布订阅模式

Node.js内置events模块,比如HTTP server on('request')事件监听

image.png