什么是 Node.js?

news2024/11/28 13:49:43

在 Node.js 出现之前,最常见的 JavaScript 运行时环境是浏览器,也叫做 JavaScript 的宿主环境。浏览器为 JavaScript 提供了 DOM API,能够让 JavaScript 操作浏览器环境(JS 环境)。

2009 年初 Node.js 出现了,它是由 Ryan Dahl 基于 Chrome V8 引擎开发的 JavaScript 运行时环境,所以 Node.js 也是 JavaScript 的一种宿主环境。而它的底层就是我们所熟悉的 Chrome 浏览器的 JavaScript 引擎,因此本质上和在 Chrome 浏览器中运行的 JavaScript 并没有什么区别。

但是,Node.js 的运行环境和浏览器的运行环境还是不一样的
在这里插入图片描述

Node.js、V8与Chrome浏览器的关系

因为 Node.js 不是浏览器,所以它不具有浏览器提供的 DOM API,比如 Window 对象、Location 对象、Document 对象、HTMLElement 对象、Cookie 对象等等。但是,Node.js 提供了自己特有的 API,比如全局的 global 对象,也提供了当前进程信息的 Process 对象,操作文件的 fs 模块,以及创建 Web 服务的 http 模块等等。这些 API 能够让我们使用 JavaScript 操作计算机,所以我们可以用 Node.js 平台开发 web 服务器。

也有一些对象是 Node.js 和浏览器共有的,如 JavaScript 引擎的内置对象,它们由 V8 引擎提供。常见的还有:

  • 基本的常量 undefined、null、NaN、Infinity;
  • 内置对象 Boolean、Number、String、Object、Symbol、Function、Array、Regexp、Set、Map、Promise、Proxy;
  • 全局函数 eval、encodeURIComponent、decodeURIComponent等等。

此外,还有一些方法不属于引擎内置 API,但是两者都能实现,比如 setTimeout、setInterval 方法,Console 对象等等。

Node.js 的基本架构

在这里插入图片描述

上图是 Node.js 的基本架构,我们可以看到,Node.js 是运行在操作系统之上的,它底层由 V8 JavaScript 引擎,以及一些 C/C++ 写的库构成,包括 libUV 库、c-ares、llhttp/http-parser、open-ssl、zlib 等等。

其中,libUV 负责处理事件循环,c-ares、llhttp/http-parser、open-ssl、zlib 等库提供 DNS 解析、HTTP 协议、HTTPS 和文件压缩等功能。

在这些模块的上一层是中间层,中间层包括Node.js BindingsNode.js Standard Library以及C/C++ AddOnsNode.js Bindings层的作用是将底层那些用 C/C++ 写的库接口暴露给 JS 环境,而Node.js Standard Library是 Node.js 本身的核心模块。至于C/C++ AddOns,它可以让用户自己的 C/C++ 模块通过桥接的方式提供给Node.js

中间层之上就是 Node.js 的 API 层了,我们使用 Node.js 开发应用,主要是使用 Node.js 的 API 层,所以 Node.js 的应用最终就运行在 Node.js 的 API 层之上。

Node.js 可以做什么?

Node.js 是运行在操作系统中的 JavaScript 运行时环境,提供了一系列操作系统的 API,通过它们我们可以执行操作系统指令、读写文件、建立网络连接、调用操作系统中的其他服务等等。

Node.js 内置的模块比较丰富,常用的主要是以下几个。

  • File System 模块:这是操作系统的目录和文件的模块,提供文件和目录的读、写、创建、删除、权限设置等等。
  • Net 模块:提供网络套接字 socket,用来创建 TCP 连接,TCP 连接可以用来访问后台数据库和其他持久化服务。
  • HTTP 模块:提供创建 HTTP 连接的能力,可以用来创建 Web 服务,也是 Node.js 在前端最常用的核心模块。
  • URL 模块:用来处理客户端请求的 URL 信息的辅助模块,可以解析 URL 字符串。
  • Path 模块:用来处理文件路径信息的辅助模块,可以解析文件路径的字符串。
  • Process 模块:用来获取进程信息。
  • Buffer 模块:用来处理二进制数据。
  • Console 模块:控制台模块,同浏览器的Console模块,用来输出信息到控制台。
  • Crypto 加密解密模块:用来处理需要用户授权的服务。
  • Events 模块:用来监听和派发用户事件。

以上这些模块在后续课程中我们都会用到,这里咱们有个大概印象就行了。除此之外,Node.js 还有其他的模块,有兴趣的同学可以访问Node.js官方文档查看这些模块的介绍。

除了上述核心模块外,Node.js 的社区生态也非常活跃,有大量的第三方模块可以使用,它们都可以用 NPM 包管理工具来安装,我们也会在后面的课程介绍一些。

话不多说,现在我们一起安装 Node.js 到我们的系统中,然后写一个小例子来体验一下 Node.js 的使用吧!

安装 Node.js

我们可以在 Node.js 官网 https://nodejs.org 上下载适合我们操作系统的 Node.js。不论是 MacOS、Linux 系统还是 X86 或 64 位 windows 系统,都有对应的版本可以安装。

有两个可以选择的版本,一个是 LTS 版本,叫做 Long Term Support 版,也就是官方推荐的比较成熟稳定的版本,目前是 16.16.0。另一个是 Current 版本,也就是当前发布的最新版,没有那么成熟,但是包含最多的新特性。

一般来说,如果要开发一个在线 Web 应用,为了稳定性通常优先选择 LTS 版本,我们的课程就选择这个版本。下载对应版本后,解压安装即可。安装完成后,打开命令行终端,执行命令 node -v,可以查看当前安装的 Node.js 的版本号。

$ node -v
v16.16.0

接下来,我们可以在命令行终端的任意目录下,创建我们 js 文件。我们先来尝试创建一个文件ziyue.js。编辑这个文件的内容如下:

const template = (text) => `
                 __._                                   
                / ___)_                                 
               (_/Y ===\\                            __ 
               |||.==. =).                            | 
               |((| o |p|      |  ${text}
            _./| \\(  /=\\ )     |__                    
          /  |@\\ ||||||||.                             
         /    \\@\\ ||||||||\\                          
        /   \\  \\@\\ ||||||//\\                        
       (     Y  \\@\\|||| // _\\                        
       |    -\\   \\@\\ \\\\//    \\                    
       |     -\\__.-./ //\\.---.^__                        
       | \\    /  |@|__/\\_|@|  |  |                         
       \\__\\      |@||| |||@|     |                    
       <@@@|     |@||| |||@|    /                       
      / ---|     /@||| |||@|   /                                 
     |    /|    /@/ || |||@|  /|                        
     |   //|   /@/  ||_|||@| / |                        
     |  // \\ ||@|   /|=|||@| | |                       
     \\ //   \\||@|  / |/|||@| \\ |                     
     |//     ||@| /  ,/|||@|   |                        
     //      ||@|/  /|/||/@/   |                        
    //|   ,  ||//  /\\|/\\/@/  / /                      
   //\\   /   \\|/  /H\\|/H\\/  /_/                     
  // |\\_/     |__/|H\\|/H|\\_/                         
 |/  |\\        /  |H===H| |                            
     ||\\      /|  |H|||H| |                            
     ||______/ |  |H|||H| |                             
      \\_/ _/  _/  |L|||J| \\_                          
      _/  ___/   ___\\__/___ '-._                       
     /__________/===\\__/===\\---'                      
                                                        
`;

const argv = process.argv;
console.log(template(argv[2] || '有朋自远方来,不亦乐乎!'));

然后我们在控制台上,进入这个项目目录,运行 node 命令:

node ziyue.js

然后,我们就可以看到控制台上的输出内容了。

在这里插入图片描述

接下来,我们看一下上面这段代码做了什么。这个代码和浏览器的 JS 没有什么区别,我们定义了一个输出模板字符串的函数template,它接受一个text参数,然后用它解析模板字符串,最终通过console.log得到输出结果。

注意,我们的 console.log 中给 text 一个默认值,但是实际上还有一个process.argv[2]的变量,这个是做什么用的呢?

实际上,process.argv 可以获得命令行调用的信息,以空格分隔。所以,按照我们执行node ziyue.js的命令,这时候process.argv的值是数组['node', 'ziyue.js'],所以process.argv[2]的值是 undefined,结果就输出了默认值。

现在我们换一种方式调用:

node ziyue.js 三人行必有我师焉

得到如下输出。

在这里插入图片描述

总结

Node.js 不是一种新语言而是一个平台,为 JavaScript 提供了浏览器之外的运行时环境。它提供了丰富的内置模块,包括 File System 模块、Net 模块、HTTP 模块、URL 模块、Process 模块等等。这些模块能够让 JavaScript 操作我们的计算机,建立 Web 服务器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1254290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

USB简介系列-02

系列文章目录 USB简介之二 文章目录 系列文章目录USB数据流一、USB总线二、USB收发器三、USB速率识别三、USB总线状态总结USB数据流 本部分讨论USB低速和全速模式下的数据流。 一、USB总线 想象一下USB主机根集器下级联了集线器和设备的设置,如下图示。我们需要记住的是,在…

FFmpeg零基础学习(二)——视频文件信息获取

目录 前言正文一、获取宽高信息1、核心代码2、AVFormatContext3、avformat_alloc_context4、avformat_open_input5、avformat_find_stream_info6、av_dump_format7、av_find_best_stream End、遇到的问题1、Qt Debug模式avformat_alloc_context 无法分配对象&#xff0c;而Rele…

go对rabbitmq基本操作

一、安装rabbitmq 1、直接使用docker拉取镜像 docker pull rabbitmq:3.82、启动容器 docker run \-e RABBITMQ_DEFAULT_USERadmin \-e RABBITMQ_DEFAULT_PASS123456 \-v mq-plugins:/plugins \--name rabbit01 \--hostname rabbit01 --restartalways \-p 15672:15672 \-p 5672:…

为什么高斯核是实现尺度空间变换的唯一变换核,并且是唯一的线性核?再研究

请先看&#xff0c;我们前面一篇&#xff0c;尺度为什么是sigma。 下面要说的是&#xff0c;我们研究的是:g&#xff08;x,y,sigma&#xff09;和g&#xff08;x,y,k*sigma&#xff09;的关系 而不是&#xff1a;I(x,y)和g&#xff08;x,y,sigma&#xff09;之间的关系 也不…

十分钟让你搞懂JVM中的GC垃圾回收机制(分代回收)

文章目录 0. 为什么要有垃圾回收?1. 垃圾回收哪个内存区域?2. 如何找到垃圾(死亡对象的判断)2.1 引用计数法2.2 可达性分析法2.3 两种算法的差别 3. 如何清理垃圾(死亡对象的回收)3.1 标记-清楚法3.2 复制法3.3 标记-整理法 4. JVM使用的回收方法4.1 什么是分代回收4.2 哪些对…

数据结构 / day04 作业

1. 单链表任意位置删除, 单链表任意位置修改, 单链表任意位置查找, 单链表任意元素查找, 单链表任意元素修改, 单链表任意元素删除, 单链表逆置 // main.c#include "head.h"int main(int argc, const char *argv[]) {Linklist headNULL; //head 是头指针// printf(&q…

基于opencv+ImageAI+tensorflow的智能动漫人物识别系统——深度学习算法应用(含python、JS、模型源码)+数据集(四)

目录 前言总体设计系统整体结构图系统流程图 运行环境爬虫模型训练实际应用 模块实现1. 数据准备1&#xff09;爬虫下载原始图片2&#xff09;手动筛选图片 2. 数据处理3. 模型训练及保存4. 模型测试1&#xff09;前端2&#xff09;后端 系统测试1. 测试效果2. 模型应用1&#…

极兔快递查询,极兔快递单号查询,对需要的单号记录进行备注

批量查询极兔快递单号的物流信息&#xff0c;对需要的快递单号记录进行备注。 所需工具&#xff1a; 一个【快递批量查询高手】软件 极兔快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;并登录 步骤2&#xff1a;点击主界面左…

redis(Remote Dictionary Service) 底层数据结构

redis 底层数据结构 动态字符串SDS 优点 获取字符串长度的时间复杂度O(1) 支持动态扩容&#xff0c;减少内存分配次数 新字符串小于1M – 新空间为扩展后字符串长度的两倍 1 新字符串大于1M – 新空间为扩展后字符串长度 1M 1. 内存预分配 二进制安全&#xff08;记录了…

java springboot中使用 AOP监听方法执行周期

首先 我们在 pom.xml 中 dependencies标签中加入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>然后 我们随便创建一个类 编写代码如下 package com.ex…

pytorch导出rot90算子至onnx

如何导出rot90算子至onnx 1 背景描述2 等价替换2.1 rot90替换(NCHW)2.2 rot180替换(NCHW)2.3 rot270替换(NCHW) 3 rot导出ONNX 1 背景描述 在部署模型时&#xff0c;如果某些模型中或者前后处理中含有rot90算子&#xff0c;但又希望一起和模型导出onnx时&#xff0c;可能会遇到…

YOLOv5轻量化改进之mobilenetv3,更换mobilenetv3中的注意力机制。

目录 一、原理 二、代码 三、YOLOv5改进 一、原理 我们提出了基于互补搜索技术和新颖架构设计相结合的下一代mobilenet。MobileNetV3通过硬件网络架构搜索(NAS)和NetAdapt算法的结合来调整到移动电话cpu,然后通过新的架构进步进行改进。本文开始探索自动搜索算法和网络设计如…

Java新建项目如何整理项目结构,没有src文件夹

现在IDEA2023中新建项目时, 不会有src文件夹。这时需要自己创建一个src的包&#xff0c;然后将这个包设置为source root。 可能出现没有这个选项的情况&#xff0c;这是需要把设置的当前项目首先Unmark了&#xff0c;然后再对src文件夹mark一下。 src: 这是源代码的根目录。 …

Self Distillation 自蒸馏论文解读

paper&#xff1a;Be Your Own Teacher: Improve the Performance of Convolutional Neural Networks via Self Distillation official implementation&#xff1a; https://github.com/luanyunteng/pytorch-be-your-own-teacher 前言 知识蒸馏作为一种流行的压缩方法&#…

与Windows 10更新大同小异!一步一步教你如何更新Windows 11

如果你想让你的Windows 11设备获得最佳性能&#xff0c;那么定期更新是至关重要的。即使是最好的电脑如果不更新也会受到影响&#xff0c;因为更新会应用软件调整&#xff0c;帮助你的设备更快、更平稳地运行。它还提高了安全性&#xff0c;意味着你可以从Microsoft的最新功能中…

自动驾驶学习笔记(十一)——高精地图

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo Beta宣讲和线下沙龙》免费报名—>传送门 文章目录 前言 高精地图 地图采集 底图制作 地图…

OpenFeign入门

OpenFeign是Spring Cloud OpenFeign&#xff0c;是Spring Cloud团队开发的基于Feign的框架 1、OpenFeign功能升级 OpenFeign在Feign的基础上提供了以下增强和扩展功能 &#xff08;1&#xff09;便于集成Spring Cloud组件&#xff1a;OpenFeign与Spring Cloud其他组件&#…

TCP/IP协议、三次握手、四次挥手

TCP/IP TCP/IP协议分层TCP头部三次握手TCP四次挥手常见问题1、什么是TCP网络分层2、TCP为什么是三次握手&#xff0c;不是两次或者四次&#xff1f;3、TCP为什么是四次挥手&#xff0c;为什么不能是三次挥手将第二次挥手和第三次挥手合并&#xff1f;4、四次挥手时为什么TIME_W…

汽车电子 - UDS

汽车电子 - UDS 概念基本概念分类请求与响应寻址信息物理寻址功能寻址 协议格式&#xff1f;&#xff1f;&#xff1f;750/758厂家自定义的吗&#xff1f;&#xff1f;&#xff1f;&#xff0c; 所有的UDS服务都在这里边吗&#xff1f;&#xff1f;&#xff1f;&#xff0c;代码…