【Node.js】前端页面仔的必修课,认识node

前言

部分知识点来源:极客时间相关node课程,然后自己总结了一下,会有错误和不全面的地方。

概念

官网定义:

  • node是个基于v8引擎的js运行环境;
  • node使用了一个事件驱动,非阻塞式I/O的模型;

刚开始接触会不太理解官方的定义,可以接着往下看。

node是个基于v8引擎的js运行环境

今天就来讲解,首先第一条意思就是node环境包含了三个部分:应用、V8、node内置模块。

V8引擎,主要是让js跑起来,然后V8通过node内置模块,与操作系统进行交互通信,之后node再把结果反馈给V8,最终体现在应用上。

应用
V8引擎
node内置模块

这里先不细讲V8,后续在【计算机原理交集】专栏讲。

node内置模块有非常多,建议到官网上看下。下篇文章简单介绍几个内置模块的使用方式。

例如:OS操作系统模块,怎么让js去获取cpu详细信息,在node中所有模块代码都放在源码lib文件夹里,这个文件夹里对应处理OS模块的js文件会调用,构建V8的src文件夹里的C++对应文件,然后C++再去调用底层的api获取cpu信息,返回给nodeOS模块的js文件,再进行二次处理组装后呈现在我们操作的js上。

有了node的内置模块,也让js有了使用操作系统的能力。

极客时间12课,里有通过events模块讲解观察者模式,这里就不先记录了。

node使用了一个事件驱动,非阻塞式I/O的模型

来看看官方定义的第二条意思中的非阻塞I/O:

  • I/O是input/output,一个系统的输入和输出;
  • 阻塞I/O和非阻塞I/O的区别就在于系统接收输入再到输出期间,能不能接收其他输入。

判断一个系统是不是非阻塞I/O,主要有两点:

  1. 一定要具体到某个I/O动作;
  2. 在这个I/O动作的过程中,能不能进行其他的I/O。

举个例子:

const glob = require('glob'); // 这个模块用来获取文件名

// 阻塞I/O
console.time('sync')
const result = glob.sync(__dirname + '/**/*') // 用递归的方式获取所有文件名
console.timeEnd('sync')
console.log(result.length)
// 执行花了12ms,而且还不能做其他事情

// 非阻塞I/O
console.time('async')
const result2 = glob(__dirname + '/**/*', function (err, result) { // 通过回调获取结果
    console.log(result.length)
    // console.timeEnd('async') 放在这里的话是看异步操作用了多少时间
})
console.timeEnd('async') // 到这里才用了2ms
// IO完成之前还可以做别的事
console.log('hello geekbang')

ps:非阻塞I/O底层其实是多线程实现的

node环境系统架构

现在我们来简单看下node环境架构图(其实有些表述有些问题,但能理解意思就行):

应用层
V8引擎层
node内置模块层
非阻塞I/O核心层
非阻塞I/O核心层
事件循环机制
C++多线程处理

从线程的角度去理解,应用层、V8引擎层、node内置模块层和非阻塞I/O核心层的事件循环机制为一个node线程,非阻塞I/O核心层的C++多线程处理为其他C++线程

node线程的很多计算能力都会分配到其他C++线程去,计算出结果后再通过回调到事件循环机制中也就回到了node线程中。

异步和非阻塞:异步一般指的是编程方式,非阻塞I/O是底层机制的名字。一般也不会刻意的去区分这两个词

阻塞和非阻塞:个人认为两者没有孰优孰劣,各有各的应用场景。

node环境与浏览器环境的其他区别

  • 语法上:在node.js里写js和在chrome里写js,几乎一样,不一样的地方在于node和浏览器拥有自己专属的api,例如浏览器有windowdocument等。
  • 控制对象上:node就是让开发者在浏览器里写js,控制浏览器。node让开发者用类似的方式,控制整个计算机。

应用场景

  • 网页优化:例如腾讯视频网站,直接在node服务端渲染好页面,再通过网络获取展示到浏览器,提升了首屏的渲染速度(实现首屏100ms的渲染时间,可怕)。然后返回的页面源码写满了内容,利于seo的优化。
  • 构建工作流:例如gulp,做一些工程的文件预编译,文件合并;还有webpack等。很久之前的前端构建工具听说使用java等其他语言写的。当构建工具出问题时,不熟悉其他语言的前端开发者就难以去做问题排查。然后随着前端的发展,之前的构建工具难以满足需求,所以有了node。
  • 开发工具:例如微软亲儿子vscode,从底层的node到elecron框架,结合TS完成的桌面应用开发。
  • 游戏:例如wayworld。听说虚幻引擎也集成了JS。
  • 客户端应用:例如twich.tv一个直播平台。

优点

可拓展性

  • 大型应用需要给使用者自定义模块的能力;
  • 使用node做复杂的本地应用,可以利用js的灵活性提供外部扩展,js庞大的开发者基数让他们的灵活性得到利用。

可复用性
如果网站做的非常好,需要开发客户端的话,可以直接用node技术下的elecron框架实现,最大限度复用现有工程。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值