Node.JS是什么

2023-10-26

1.Node.JS是什么

Node.js 不是一种独立的语言,Node.js 也不是JavaScript 框架,Node.js 是一个让 JavaScript 运行在服务端的开发平台

Node.js 是一个让 JavaScript 运行在浏览器之外的平台。它实现了诸如文件系统、模块、包、操作系统 API、网络通信等 Core JavaScript 没有或者不完善的功能。历史上将 JavaScript 移植到浏览器外的计划不止一个,但Node.js 是最出色的一个。随着 Node.js 的成功,各种浏览器外的JavaScript 实现逐步兴起,因此产生了 CommonJS 规范。CommonJS 试图拟定一套完整的 JavaScript 规范,以弥补普通应用程序所需的 API,譬如文件系统访问、命令行、模块管理、函数库集成等功能。CommonJS 制定者希望众多服务端 JavaScript 实现遵循CommonJS 规范,以便相互兼容和代码复用。Node.js 的部份实现遵循了CommonJS规范,但由于两者还都处于诞生之初的快速变化期,也会有不一致的地方。Node.js 的 JavaScript 引擎是 V8,来自 Google Chrome 项目。V8 号称是目前世界上最快
的 JavaScript 引擎,经历了数次引擎革命,它的 JI(Just-in-time Compilation,即时编译)执行速度已经快到了接近本地代码的执行速度。Node.js 不运行在浏览器中,所以也就不存在 JavaScript 的浏览器兼容性问题,你可以放心地使用 JavaScript 语言的所有特性。

2.Node.js 能做什么

正如 JavaScript 为客户端而生,Node.js 为网络而生。Node.js 能做的远不止开发一个网站那么简单,使用 Node.js,你可以轻松地开发:

 具有复杂逻辑的网站;
 基于社交网络的大规模 Web 应用;
 Web Socket 服务器;
 TCP/UDP 套接字应用程序;
 命令行工具;
 交互式终端程序;
 带有图形用户界面的本地应用程序;
 单元测试工具;
 客户端 JavaScript 编译器。

Node.js 内建了 HTTP 服务器支持,也就是说你可以轻而易举地实现一个网站和服务器的组合。这和 PHP、Perl 不一样,因为在使用 PHP 的时候,必须先搭建一个 Apache 之类的HTTP 服务器,然后通过 HTTP 服务器的模块加载或 CGI 调用,才能将 PHP 脚本的执行结果呈现给用户。而当你使用 Node.js 时,不用额外搭建一个 HTTP 服务器,因为 Node.js 本身就内建了一个。这个服务器不仅可以用来调试代码,而且它本身就可以部署到产品环境,它
的性能足以满足要求。Node.js 还可以部署到非网络应用的环境下,比如一个命令行工具。Node.js 还可以调用C/C++ 的代码,这样可以充分利用已有的诸多函数库,也可以将对性能要求非常高的部分用C/C++ 来实现。

3.Node.js的特点

Node.js 最大的特点就是采用异步式 I/O 与事件驱动的架构设计。对于高并发的解决方案,传统的架构是多线程模型,也就是为每个业务逻辑提供一个系统线程,通过系统线程切换来弥补同步式 I/O 调用时的时间开销。Node.js 使用的是单线程模型,对于所有 I/O 都采用异步式的请求方式,避免了频繁的上下文切换。Node.js 在执行的过程中会维护一个事件队列,程序在执行时进入事件循环等待下一个事件到来,每个异步式 I/O 请求完成后会被推送到事件队列,等待程序进程进行处理。例如,对于简单而常见的数据库查询操作,按照传统方式实现的代码如下:
res = db.query('SELECT * from some_table'); res.output();
以上代码在执行到第一行的时候,线程会阻塞,等待数据库返回查询结果,然后再继续处理。然而,由于数据库查询可能涉及磁盘读写和网络通信,其延时可能相当大(长达几个到几百毫秒,相比CPU的时钟差了好几个数量级),线程会在这里阻塞等待结果返回。对于高并发的访问,一方面线程长期阻塞等待,另一方面为了应付新请求而不断增加线程,因此会浪费大量系统资源,同时线程的增多也会占用大量的 CPU 时间来处理内存上下文切换,
而且还容易遭受低速连接攻击。看看Node.js是如何解决这个问题的:
db.query('SELECT * from some_table', function(res) { res.output(); });
这段代码中 db.query 的第二个参数是一个函数,我们称为回调函数。进程在执行到db.query 的时候,不会等待结果返回,而是直接继续执行后面的语句,直到进入事件循环。当数据库查询结果返回时,会将事件发送到事件队列,等到线程进入事件循环以后,才会调用之前的回调函数继续执行后面的逻辑。Node.js 的异步机制是基于事件的,所有的磁盘 I/O、网络通信、数据库查询都以非阻
的方式请求,返回的结果由事件循环来处理。图1-1 描述了这个机制。Node.js 进程在同一时刻只会处理一个事件,完成后立即进入事件循环检查并处理后面的事件。这样做的好处是,CPU 和内存在同一时间集中处理一件事,同时尽可能让耗时的 I/O 操作并行执行。对于低速连接攻击,Node.js 只是在事件队列中增加请求,等待操作系统的回应,因而不会有任何多线程开销,很大程度上可以提高 Web 应用的健壮性,防止恶意攻击

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.JS是什么 的相关文章

随机推荐

  • C++ cstdlib – 概览

    什么是 C cstdlib C 标准库头文件 cstdlib in C 是 C 程序员使用最广泛的库头文件 它定义了一系列函数和宏 以实现跨团队 跨平台的高效且具有卓越表现的标准化 C 代码 C 是一种广受欢迎的程序语言 它能崛起的最初原因
  • HIMA F3330 984333002 伺服驱动模块

    运动控制 HIMA F3330 984333002 伺服驱动模块通常用于精确的运动控制应用 可以控制电机以特定速度和位置进行运动 位置反馈 HIMA F3330 984333002 伺服驱动模块可能支持位置反馈功能 以确保电机运动的准确性和
  • 你不得不知的几个互联网ID生成器方案

    服务化 分布式已成为当下系统开发的首选 高并发操作在数据存储时 需要一套id生成器服务 来保证分布式情况下全局唯一性 以确保系统的订单创建 交易支付等场景下数据的唯一性 否则将造成不可估量的损失 基于时间戳 比如流水号规则如下 XX YYY
  • C语言编程获取PE文件File_Header内容

    include
  • Js逆向练习制造Token与Id

    前言 闲来无聊 把 Pyhton3网络爬虫开发实战 第二版 看完了Js逆向部分 最后的实战部分感觉挺有挑战性的 正好崔佬也有详细的教程 平时的逆向都是野路子 刚好快回学校了有时间 那为什么不自己动手下呢 下面记录下过程 只会更加详细 观察页
  • [从零开始学习FPGA编程-33]:进阶篇 - 基本时序电路-寄存器(Verilog语言)

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 目录 前言 第1章 寄存器介绍 1 1 时序电路的两大特征
  • Qt 常用设计模式-单例模式(Singleton)

    单例 顾名思义 为了保证一个类仅有一个实例 并提供一个可以访问它的全局访问点 避免一个全局使用的类频繁的创建和销毁 节省系统资源 提高程序效率 如何创建唯一的实例 如果是A a new A 但是这么做的话就会有多个实例 所以我们需要把构造函
  • 记一个好用的xshell替代工具-mobaxterm

    https zhuanlan zhihu com p 56341917 现今软件市场上有很多终端工具 比如 secureCRT Putty telnet 等等 secureCRT其实也是一款很强大的终端工具 良许也使用过它很长时间 但是 它
  • 合法三角形数量

    题目1 给定一个n个正整数的数组a 问在其中取三个数 同时满足以下两个条件的取法有多少个 1 这三个数能构成三角形 即任意两数之和大于第三数 2 这三个数构成的三角形既不是等边三角形 也不是直角三角形 数据范围 3 lt n lt 2000
  • 通过 kubectl 查看 K8s 内节点、Pod 资源使用情况

    一 kubectl describe node 可通过该命令查看 Pod 在节点上的资源分配情况 Request Limits 如下 product 表示生产环境 kubectl describe node l env product 执行
  • 024-从零搭建微服务-系统服务(六)

    写在最前 如果这个项目让你有所收获 记得 Star 关注哦 这对我是非常不错的鼓励与支持 源码地址 后端 https gitee com csps mingyue 源码地址 前端 https gitee com csps mingyue u
  • Hibernate自动建表(使用DDL语句)

    Gd上次和大家谈到使用DDL语句实现自动建表失败的问题 过了几天再回头看果然思路就变得清晰许多 原来是xxx hbm xml文件的配置上出了问题 因为上次没有用Junit进行测试 所以没有看明白问题的描述 这里不得不说一句 Junit真是个
  • vue cli3 打包后访问不到页面 Failed to load resource: the server responded with a status of 404 (Not Found)

    在根目录下新建文件vue config js 配置打包资源路径 默认是 如果没有特殊需求就不要修改 代码如下 const path require path function resolve dir return path join dir
  • 于g2o新版本编译出错的原因及解决办法

    在githubg2o的github地址上面down了最新的版本进行安装 编译十四讲第六讲的代码出错 报错信息 home hri SLAM slambook ch6 g2o curve fitting main cpp In function
  • Linux查看与设置CPU频率

    Gnome下查看 1 在Gnome菜单栏的底部面板上点右键 gt 添加到面板 gt CPU频率范围监视器 然后gnome面板上就会出现此小工具 并显示当前的频率 点左键可出现可调节的频率 命令行下查看 1 安装cpufrequtils 此软
  • AD数据采集卡的输入悬空电压

    现象 用AD数据采集卡进行模拟电压信号采集时 在输入端悬空时 其采集到的信号与有信号输入的端口采集到的信号是类似的 而不是随机噪声 如图1所示 首通道是接入信号的 某通道悬空 图1 实际信号采集结果 这里说一下我所了解到的一种原因 大多数A
  • 详解二:CentOS下编译安装PHP开发环境,配置LAMP

    下载以上软件后 如果用户用的是CentOS最简版 也就是minimal版 需要安装支持软件 yum y install libxml2 yum y install libxml2 devel yum y install zlib yum y
  • 以太坊通证标准包括(ERC20、ERC721、ERC223、ERC621、ERC827、RFC、EIP)

    最著名的两个以太坊通证标准是代币标准ERC20和数字资产标准ERC721 在本文中 除了介绍这两个流行的ERC以太坊标准 还将介绍其他一些针对特定应用场景的ERC20改进标准 ERC223 ERC621和ERC827 什么是ERC ERC代
  • Zotero入门教程

    文章目录 一 生成Bibliography 二 Zotero文献自动导入 1 为什么要使用SCI HUB 2 如何自定义PDF解析器 三 在Zotero中添加Extension 四 文件存储位置的修改 五 markdown笔记功能 一 生成
  • Node.JS是什么

    1 Node JS是什么 Node js 不是一种独立的语言 Node js 也不是JavaScript 框架 Node js 是一个让 JavaScript 运行在服务端的开发平台 Node js 是一个让 JavaScript 运行在浏