我跟Node的初邂逅

前言

目前Node在前端开发中占据重要的地位,不管在我们的weback vite等打包构建工具中作为基础运行环境,还是koa express egg.js Nest.js等服务端框架中充当中间层或者后端服务器,总之,现在Node.js能做的事情越来越多了,所以学习Node肯定是必要的。

Node简介

简单来说,Node就是一个运行时环境,底层是Google Chrome的V8 JavaScript引擎

这时候你可能会有疑问了,为什么使用javascript去实现node,而不用其他Java PHP C等后端语言呢?

为什么选择JavaScript成为Node的实现语言?

这时候就要提到Node的作者Ryan Dahl了,其实他是一名资深的C/C++程序员,他的工作重点就是如何设计高性能服务器。而设计高性能服务器有两个要点:一个是事件驱动 ,另一个是非阻塞I/O

Ryan Dahl当时对一些语言进行了评估:

  • C:C的开发门槛高,不会有太多的开发者能将它用于日常的业务开发
  • Haskell: Ryan Dahl觉得自己还不足够玩转它
  • Lua:Lua自身已经有很多的阻塞I/O库,在这基础上构建非阻塞I/O库很难有市场
  • Ruby: Ruby的虚拟机性能不好

而选择JavaScript的原因是:

  1. 高性能:Chrome的V8在第二次浏览器大战中性能第一,并且是基于BSD许可证发布的。
  2. 符合时间驱动:JavaScript在浏览器中有许多的事件驱动。
  3. 没有历史包袱:虽然服务端JavaScript存在了很多年,但后端部分一直没有市场。

Node的特点

Node主要有四大特点:

1. 异步I/O

Node的IO操作都是异步的,我们需要等待异步回调的结果,比如我们使用Node内置模块fs去读取文件内容,我们需要在异步会调用才能拿到读取的结果:

js 复制代码
const fs = require("fs");
fs.readFile("./1.txt", "utf8", function(err, data) {
  console.log(err, data);
});

2. 事件和回调函数

我们使用Node的api会发现,我们会使用到大量的事件监听和回调函数,比如我们利用可读流去读取input.txt文件,我们需要监听可读流data事件,在时间会调用拿到读取结果:

js 复制代码
const fs = require('fs');
const readableStream = fs.createReadStream('input.txt');
readableStream.on('data', (data) => {
 console.log(data.toString())
});

3. 单线程

这里只是说Node的主线程是单线程的,Node其实是可以通过child_process模块创建多线程去执行任务的。

3.1 单线程的好处:

  • 不用在意状态的同步问题,没有死锁。
  • 没有线程上下文切换的开销。

3.2 单线程的缺点:

  • 无法利用多核CPU
  • 一旦出现错误会引起整个应用退出,对应用的健壮性要求高
  • 大量计算占用CPU导致无法继续调用异步I/O

而对于大量计算的场景,浏览器端可以使用Web Workers。Web Workers能够创建工作线程来进行计算,以解决JavaScript大计算阻塞UI渲染的问题,而在Node端,可以利用我们上面提高的Node内置模块child_process创建多线程。

4. 跨平台

在Node架构层面,在操作系统与Node上层模块系统之间构建了一层平台层架构libuv,实现Windows和linux平台的兼容。

Node的应用场景

  • I/O密集型
  • 分布式应用

不适用的场景:CPU密集型,比如大量计算

小结

今天简单了解下Node,知道了为啥选择javascript来实现node,然后了解了node的四大特点异步I/O事件和回调函数单线程跨平台,最后简单了解了node的应用场景,算是对node的一个简单邂逅吧!

相关推荐
Never_Satisfied2 小时前
在JavaScript / Node.js / 抖音小游戏中,使用tt.request通信
开发语言·javascript·node.js
一只小透明啊啊啊啊2 小时前
Java Web 开发的核心组件:Servlet, JSP,Filter,Listener
java·前端·servlet
你的人类朋友3 小时前
设计模式有哪几类?
前端·后端·设计模式
Yeats_Liao3 小时前
Go Web 编程快速入门 10 - 数据库集成与ORM:连接池、查询优化与事务管理
前端·数据库·后端·golang
啃火龙果的兔子4 小时前
前端八股文react篇
前端·react.js·前端框架
打小就很皮...4 小时前
React 实现 i18next 中英文切换集成
前端·react.js·i18next
拉不动的猪4 小时前
函数组件和异步组件
前端·javascript·面试
淮北4944 小时前
html + css +js
开发语言·前端·javascript·css·html
你的人类朋友4 小时前
适配器模式:适配就完事了bro!
前端·后端·设计模式
Setsuna_F_Seiei4 小时前
CocosCreator 游戏开发 - 利用 AssetsBundle 技术对小游戏包体积进行优化
前端·cocos creator·游戏开发