【深入浅出node.js】二刷划重点

Node 的特点

1.异步IO

前端:Ajax请求为最典型,前端请求发送请求后,执行其他后续代码,后续执行完成后,通过‘Don’t call me,I will call you’的原则,返回前端结果。

后端:以文件读取为例,可以发起读取文件后,执行其他操作,等文件读取完成后,在处理文件内容。如果读取多个文件,读取时间==用时最长的文件读取时间,≠每个文件读取时间之和

2.事件和回调函数

事件是指可以被 JavaScript 侦测到的行为,例如onFocus,onMouseOver,upload,onClick类 —— W3CSchool

回调函数:是最好的接受异步调用返回数据的方式,但不利于编写同步代码的人,因为代码的编写顺序和执行顺序无关,造成阅读障碍

3.单线程

  • 优势 1.不用出处在意状态的同步问题;2.没有死锁;3.没有上下文交换带来的性能开销
  • 劣势 1无法利用多核CPU;2.错误会引起整个应用退出,健壮性差;3大量计算占用CPU导致无法继续调用异步IO
    -解决方式:参考前端Web Worker的解决方案,创建工作线程来计算,命名为:child_process,将计算分发到哥哥紫禁城,可以将大量的计算分解掉,通过进程之前的时间消息来传递结果。

4.跨平台

通过libuv中间层,实现对linux和win的兼容


应用场景

1.IO密集型

在单线程脚本语言中,Node的IO处理能力是第一的,Node面向网络且擅长并行IO,有效的组织更多的硬件资源

2.CPU密集型业务也不逊色

1.可以再底层通过C/C++模块更高效利用CPU
2.可以通过子进程的方式,将一部分的Node进程常驻服务进行计算

3.可以和其他语言,系统和平共处

4.可以利用分布式技术


什么是脚本语言(通俗)

最初的脚本语言主要做表单校验,网页特效,后来他经历了如下的变化
工具–>组件(require)–>框架–>应用
以下答案为个人理解,可能有错,仅供参考:
JavaScript诞生之初只是一个DOM的操作语言,就是他不是用来做产品的东西,只是通过<srcipt>标签进行快速的定义和使用,当然设计之初也有很多不足的漏洞,还缺失包管理,非常的糟糕,后来ConmmonJS制定了标准,给了JavaScript一个统一前后端的美好愿景,给了他健壮的框架和各种规范,后来他也可以像其他编译语言一样去实现功能,去做业务。


Node模块实现

路径分析----->文件定位–>编译执行

  • 组成: 模块=Node提供的核心模块+用户自定义的文件模块

  • 核心模块:Node源代码编译过程中,编译进了二进制文件,Node启动时,直接载入内存,路径分析优先考虑,后两步省略

  • 缓存机制: 优先从缓存加载,避免二次开销(区分浏览器缓存文件,Node缓存的是编译和执行后的对象),即加载缓存–>加载核心模块–>加载文件模块(用户定义的模块)

  • 路径分析

    (1)分为核心模块:http,fs,pah等
    (2).或…的相对路径
    (3)非路径形式的文件模块

    其中(3)为一个文件或者一个包的形式,是三个中查询最费时的,他会逐个尝试模块路径中的路径,直到找到文件为止,先查当前目录所有,然后父目录,一直往上直到根目录

  • 文件定位 如果没有文件尾缀,依次可能为.js,.json,.node(由于根据fs要判断文件是否存在,所以会同步阻塞,所以还是建议加上文件尾缀或者配合缓存使用

    如果文件定义为自定义模块,则查找到的是一个包,Node会先找到包下的package.json通过JSON.prase()解析出包的描述对象,从众去除main属性指定的文件进行定位,如果无法查找到package.json,则默认index作为文件名,依次遍历.js .json .node进行。 如果还没有则进入下一个模块进行查找,如果依旧还没有找到,一直到根目录,则throw 异常

  • 模块编译:

.js:通过fs模块同步读取文件后编译
.json:通过fs模块同步读取文件后,用JSON.parse()返回结果
.node:这是通过C/C++编写的拓展文件,通过dlopen()方法加载 ->最后编译生成的文件
注意其余拓展名文件当做js处理

每个成功编译的Module将会将其文件路径作为索引缓存在Module._cache对象上,提高二次引用性能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值