node深入浅出笔记

67 阅读4分钟

1.node给js带来的意义,传统js通过中间层,比如chrome的v8引擎,且需要webkit布局引擎,h5来达到页面交互的效果,node应用v8中间曾libuv来达到服务的作用,通过libuv实现了跨平台

2.node特点:异步性,事件驱动

3.node单线程的问题

解决,类似h5的web worker标准,通过child_process来处理大数据量的问题

4.node适合io密集型因为他的异步性,同时由于v8的算法使得cpu密集型的也不是很差,如果可以用c加强就更好了。

5.node的commonjs模块规范,1模块引用require 2模块定义 exports.add = function(){} 3,模块标识const a = require()

引入模块分为3步,1路径分析 2文件定位 3编译执行

模块主要分为2类,核心模块 文件模块

其中核心模块再node编译中以二进制存入所以没有了2和3,只需要路径分析

其中文件模块是动态运行的所以需要123步

6.路径查找细节

7.编译细节

8.核心模块

9.c++扩展包

10.node定义了模块规范以及包的概念,装node自带npm

npm有钩子命令

script:

preinstall:preinstall.js

11.由于commonjs这种作为服务端引入是同步的,后面不适合前端引入,所以引入了AMD和CMD(不同在于amd推崇依赖前置,cmd依赖延迟),esmodule(前后端通用模版import),commonjs值拷贝运行时,esmodule是拷贝引用编译时,commonjs引入的变量不变,esmodule引入模块内部变化对应的的esmodule也会变

第三章:异步机制

单线程因为同步以及等待io阻塞性能不好,多线程因为锁,切换消耗以及状态同步问题

node在两者之间给出了方案,利用单线程远离死锁等问题同时用异步io解决单线程阻塞问题,同时为了弥补单线程无法利用多核cpu,node提供了类似前端的web worker

1.组装好请求对象,送入io线程池

2.回调

3.事件循环

idle观察者先于io观察者先于check观察者

总结:事件循环是异步的核心机制

异步编程难点及解决

1.通过while会造成cpu阻塞

2.异步解决方式主要分为3种

事件发布/订阅方式(另一方面是钩子,导出内部内容,通过once解决雪崩问题)

promise/defer模式(promisea)

流程控制库

主要的是如express的use next等

第五讲:内存

由于node基于v8的js引擎渲染,浏览器情况不需要很多内存,64位限制的1.4g,32位0.7g,应用到服务场景不够,就需要垃圾回收机制,垃圾回收机制中,主要是分代算法,分为新生代喝旧生代,其中从新生代到旧生代的一种算法以下截图说明

mark-sweep:老生代的优化,标记活着的对象,清楚为标记对象

闭包可以从外部调用内部变量,也要注意内存泄露问题

buffer不存在v8分配的内存中

内存泄露的原因主要三点,缓存(谨慎将内存党缓存),队列不及时,作用域没释放

缓存解决:注意进程无法共享内存,如果有这个需求考虑redis等

队列解决:关注队列状态,注意内存硬盘读写速度导致的不一致,如果过多写入操作,可能会有队列爆炸风险,比如一些文件处理node用stream进行了优化

第六章:buffur

以下截图解决utf-8转码的乱码问题

buffer性能描述

文件传输运用buffer效果如下截图

buffer读文件时候,会有一个pool池子大小

第七章:网络

使用tcp连接时会用到nagle算法,会将小量数据包放在缓冲区等攒够了再发

浏览器实则是http的代理

http在tcp层基础上封装了

一下所以平时下载最多五个

websocket建立连接握手时http,数据传输是基于tcp连接

ssl安全

为了防止中间人攻击引入数字证书

是否读缓存

401未认证

表单形式

文件过大的情况

csrf攻击

多进程

第10章 测试

单元测试:1。测试者如果不熟悉node是否可以来 2.第三方代吗是否可以来 3.产品迭代中如何保持后期质量

tdd测试驱动测试 bdd行为驱动测试,一个测试用例偏向于功能说明,一个关注整体行为接近自然语言

第十一章 工程化

代码提交:注意规范,审查

部署:注意自动化重启开始停止

性能:动静分离,启用缓存,多进程pm2等,读写分离

日志:api,异常日志,日志分割,短期写磁盘写入文件长期写入db

监控报警