Node源码解析——ReadableStream
上篇文章了解了可写流,这篇继续看另一半可读流,可读比可写复杂很多,长文预警。
上篇文章了解了可写流,这篇继续看另一半可读流,可读比可写复杂很多,长文预警。
终于到这个核心模块了。包括之前写过的网络模块,在Node中大量模块的底层都用到了stream处理数据。这篇文章就来看stream的可写流内部实现。
网络模块的最后一系列文章,就看看基于tcp之上的一些网络模块实现,因为已经有了阅读net模块的基础,看这个部分应该会好理解很多。
上一篇文章中介绍了Server的准备,这一篇继续看剩下的问题。
关于http的最后一篇文章,看数据容器outgoing和incoming的内部实现,以及之前遗留的问题。
源码阅读最好遵循一个从架构到细节的流程。现在我们已经了解了node的整体架构以及模块间的职责划分。接下来可以再深入一步,看看node内部模块间又有怎样的区别和联系。这篇文章就从之前写过的代表tcp的net的平行模块入手——udp相关模块。
上篇文章涉及到了net这个在node中构建异步网络的模块,也是node里很重要的基础模块,这篇文章就来把net搞清楚。
继续看Bootstrap第二步。如果第一步概括为内部模块初始化,这一步就是node环境初始化。包括process对象上的属性,一些全局对象或方法等,以及正式执行我们的JS代码并解析三方模块依赖。
之前谈到了node在启动时会调用run方法,在其中有一个env准备的过程,这个过程中做了大量的bootstrap工作。但从总的层面可以分为两步,其一就是这篇文章谈到的内容——BootstrapInternalLoaders,在这一步主要完成了built-in模块和native模块的准备工作。下面就进入源码看细节吧。
因为接下来分析的stream模块和dns等网络模块等都涉及到很多libuv的知识,这部分不是node内部的JS代码,前端同学不一定熟悉。想了想有必要先谈谈Node的整体架构,毕竟Node内部的构成还是比较复杂且有序的,把这些理清才能更有层次的阅读源码。
Node自诞生起就以其非阻塞式IO和事件驱动的特性闻名,基于此的实现下,常规node应用的代码执行都是单线程的。虽然单线程的好处不少,但在目前普遍都是多核CPU的环境下,单线程无法充分利用其性能。同时,单线程模式下的容错率过低,一旦异常未捕获应用就会崩溃。以此为背景,就诞生了今天要谈到的node内置模块——cluster。
最近Serverless这个概念异常火热,感觉是哪家公司都在搞,但具体怎么搞怎么落地的,大多也属于探索阶段。概念很美好,但其中可见的坑也不少。跟风不可取,场景合适的才是最好的,所以要想用好Serverless,必须先了解下相关生态和现状,这篇文章就记录下我粗浅的理解。
node本身虽然是一门后端语言,但和前端的联系还是相当紧密的,基本上渗透到了日常使用中,玩法也是多种多样。工程化,中台服务,命令行工具等等。这篇文章就从vue-cli入手,学习一下node在命令行工具开发中的应用以及相关生态。虽然vue-cli3已经发布很久了,但考虑到其插件服务的架构是重点,相对来说vue-cli2的node命令行开发更纯粹一些,也比较全面的涵盖日常cli开发的工具和思路,所以就从版本2开始吧。
平时前端虽然没什么机会用Node写后端业务,但在前端工程化中,一定离不开Node的模块管理。最近计划从Node开始学后端相关的一些思想,第一篇文章就从距离前端最近的点开始。
之前已经谈到过浏览器中的事件循环机制,可以简单概括为执行栈和任务队列共同实现异步队列的机制,但根据运行环境不同,这套机制也会存在差别。那么Node环境和浏览器环境的区别又是什么呢?
Koa是继Express之后的又一大方异彩的后端框架。相比于Express其最大的变化在于支持async/await的异步流程控制以及中间件的变化。本文将按照流程对其原理进行讨论。
之前我们说到,当通过回调函数执行多步异步操作时,会创造难以理解和调试的代码,而且也缺乏控制异步操作时机的手段。比如想让两个异步操作同时运行,或者同时启动多个异步操作只采用某个结果,都很难做到。在这些情况下,通过使用ES6的新特性——Promise将能大幅度改善这种情况。
JS最有特点的一方面就在于它能轻易地处理异步编程。作为因互联网而生的语言,必须要求JS能响应用户的点击,按键,鼠标滚动之类的交互行为。但是JS引擎是单线程运行的,就是说浏览器无论在什么时候都只有一个线程在运行JS,那么如何配合浏览器内核处理这些异步事件呢?事实上除了处理JS的线程外,浏览器内核中还存在其他线程共同配合完成工作。我们就从头来说说JS的异步编程。
前端开发最初只需要使用JS实现一些基本的交互效果,所以早期一般在script标签中嵌入一些代码既可以达到要求。但随着各种WEB应用的兴起,JS的地位越来越重要,文件越来越复杂,一个项目里的文件势必要有良好的管理。模块化思想也就应运而生。