阅读笔记:一章章阅读,记录个人比较有用的语句,包括js + node 的原理部分,并不总结。
node特点
异步I/O
js异步调用中对于结果值的捕获是符合Don't call me,I will call you的原则,
图为经典的ajax
在node中 异步I/O也很常见,与ajax调用的方式极其类似
在node中绝大多数的操作都是异步,包括从文件的读取和网络请求等。
事件与回调函数
随着web2.0时代的到来,js在前端担任了更多的职责,事件也得到了广泛的应用,node不像Rhino那样受java的影响很大,而是将前端浏览器中应用广泛且成熟的事件引入后端,配合异步I/O,将事件点暴露给业务逻辑。
单线程
Node保持了JS在浏览器中单线程的特点,在Node中,js与其余线程是无法共享任何状态的。单线程的最大好处是不用像多线程编程那样处处在意状态的同步问题,这里没有死锁的存在,也没有线程上下文交换所带来的性能上的开销。
缺点:1.无法利用多核CPU2.错误会引起整个应用退出,应用的健壮性值得考验3.大量计算占用CPU导致无法继续调用异步IO。
Node采用了与web workers相同的思路来解决单线程中大计算量的问题:child_process ,node通过将计算分发给各个子进程,将大量计算分解掉,再通过进程之间的事件消息来传递结果。
Node使用者所注重的特性
- 前后端编程语言环境统一
- Node带来的高性能IO用于实时应用
- 并行IO使得使用者可以更高效地利用分布式环境
- 并行IO 有效利用稳定接口提升web渲染能力
- 云计算平台提供Node支持
- 游戏开发领域
- 工具类应用
模块机制
在WEB2.0流行的过程中,各种前端库和框架被开发出来,它们最初用于兼容各个版本的浏览器,随后随着更多的用户需求被前端实现,javascript也从表单校验跃迁到应用开发的级别上。
经历了长长的后天努力过程,javascript不断被类聚和抽象,以更好地组织业务逻辑,从另一个角度而言,它也道出了javascript先天就缺乏的一项功能:模块,类似其它高级语言中,java有类文件,Python有import机制,Ruby有require,PHP有include和require。
CommonJS
CommonJS规范的出现---希望javascript能够在任何地方运行。CommonJS API写出的应用可以具备跨宿主环境执行的能力,这样不仅可以利用javascript开发服客户端应用,而且开可以编写以下应用
- 服务端javascript应用程序
- 命令行工具
- 桌面图形界面应用程序
- 混合应用
CommonJS为javascript开发大型应用程序指明了道路,这些规范涵盖了模块、二进制、Buffer、字符集编码、IO流、进程环境、文件系统、套接字、单元测试、web服务器网关接口、包管理等。
Node借鉴CommonJS的Modules规范实现了一套非常易用的模块系统,NPM对Packages规范的完好支持使得Node应用在开发过程中事半功倍。
CommonJS的模块规范:模块引入,模块定义,模块标识。
Node的模块实现
在Node中引入模块需要经历如下3个步骤
- 路径分析
- 文件定位
- 编译执行
优先从缓存加载
在Node中,模块分为两类:一类是Node提供的模块,称为核心模块;另一类是用户编写的模块,称为文件模块
核心模块部分在Node进程启动时,部分核心模块直接加载进内存,省去了文件定位和编译执行,而且路径分析中优先判断,所以它的加载速度是最快的
文件模块则是运行时动态加载需要完整的三个过程。
浏览器会缓存静态脚本文件以提高性能一样,Node对引入过的模块都会进行缓存减少二次引入的开销,不同的是,浏览器仅仅缓存文件,而Node缓存的是编译和执行后的对象。不管是核心模块还是文件模块,require()方法对相同模块的二次加载都一律采用缓存优先的,这是第一优先级。不同之处在于核心模块的缓存检查优先于文件模块的缓存检查。