我跟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的一个简单邂逅吧!

相关推荐
东东51623 分钟前
智能社区管理系统的设计与实现ssm+vue
前端·javascript·vue.js·毕业设计·毕设
catino27 分钟前
图片、文件的预览
前端·javascript
2501_920931702 小时前
React Native鸿蒙跨平台实现推箱子游戏,完成玩家移动与箱子推动,当所有箱子都被推到目标位置时,玩家获胜
javascript·react native·react.js·游戏·ecmascript·harmonyos
layman05282 小时前
webpack5 css-loader:从基础到原理
前端·css·webpack
半桔2 小时前
【前端小站】CSS 样式美学:从基础语法到界面精筑的实战宝典
前端·css·html
AI老李2 小时前
PostCSS完全指南:功能/配置/插件/SourceMap/AST/插件开发/自定义语法
前端·javascript·postcss
_OP_CHEN2 小时前
【前端开发之CSS】(一)初识 CSS:网页化妆术的终极指南,新手也能轻松拿捏页面美化!
前端·css·html·网页开发·样式表·界面美化
啊哈一半醒3 小时前
CSS 主流布局
前端·css·css布局·标准流 浮动 定位·flex grid 响应式布局
PHP武器库3 小时前
ULUI:不止于按钮和菜单,一个专注于“业务组件”的纯 CSS 框架
前端·css
方也_arkling3 小时前
Element Plus主题色定制
javascript·sass