这是我参与「第四届青训营」笔记创作活动的第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应用场景
- 前端工程化
- Web服务端应用
- Electron跨端桌面应用
Node.js运行时结构
编写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中缓存着加载过的模块,缓存的原因:同步加载
- 文件模块查找耗时,如果每次require都需要重新遍历查找,性能会比较差;
- 在实际开发中,模块可能包含副作用代码
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/')
})
延伸话题
代码实战
目的:赌气package.json中main字段对应的文件内容
question:如何解决回调地狱?
Promise
Promise是具有四个状态的有限状态机,其中三个核心为Pending(挂起),Fulfilled(完成)、Rejected(拒绝),以及还有一个未开始状态 使用primise,实现目的。
event发布订阅模式
Node.js内置events模块,比如HTTP server on('request')事件监听