Node js介绍

news2024/9/19 17:09:37

目录

  • 概要
  • **对Node的认识**
    • **Node的概念理解**
    • **Node和浏览器区别**
    • **Node的架构图**
  • **Node的应用场景**
  • **Node的安装**
    • **安装Node的LTS版本**
    • **Node的版本管理工具nvm(了解)**
  • **Node的输入和输出**
    • Node程序传递参数
    • Node的输出
  • **Node的全局对象**
    • **特殊的全局对象**
    • **其他的全局对象**
    • global对象

Date: August 23, 2024

概要

240824

Sum:

本节主要谈了谈对于 Node 的认识,以及 Node 的应用场景。

然后从实践角度,谈了谈 Node 的安装过程,以及 Node 的输入输出 和 全局对象的理解。

需要记住的东西:

  • Node的概念:

Node.js是一个基于V8引擎的JS运行时环境。

  • Node的安装:

nvm与n来进行版本管理

  • 全局对象

浏览器环境的全局对象指window,而node环境指global。在新的标准中还有一个globalThis,也是指向全局对象的。在浏览器环境下globalThis是指window,在node环境下是global。




对Node的认识

Node的概念理解

官方对于Node.js的定义:Node.js是一个基于V8 JavaScript引擎的JavaScript运行时环境。

Node.js基于V8引擎来执行JavaScript的代码,但是不仅仅只有V8引擎:

前面我们知道V8可以嵌入到任何C ++应用程序中,无论是Chrome还是Node.js,事实上都是嵌入了V8引擎来执行JavaScript代码;

但是在Chrome浏览器中,还需要解析、渲染HTML、CSS等相关渲染引擎,另外还需要提供支持浏览器操作的API、浏览器自己的事件循环等;

另外,在Node.js中我们也需要进行一些额外的操作,比如文件系统读/写、网络IO、加密、压缩解压文件等操作;



Node和浏览器区别

image.png

注意:这个暂时看一眼即可



Node的架构图

我们编写的JavaScript代码会经过V8引擎,再通过Node.js的Bindings,将任务放到Libuv的事件循环中;

libuv(Unicorn Velociraptor—独角伶盗龙)是使用C语言编写的库;

libuv提供了事件循环、文件系统读写、网络IO、线程池等等内容;

image.png




Node的应用场景

前端常用:

应用一:目前前端开发的库都是以node包的形式进行管理;

应用二:npm、yarn、pnpm工具成为前端开发使用最多的工具;

后端常用:

应用三:越来越多的公司使用Node.js作为web服务器开发、中间件、代理服务器;

应用四:大量项目需要借助Node.js完成前后端渲染的同构应用;

更多维度:

应用五:资深前端工程师需要为项目编写脚本工具(前端工程师编写脚本通常会使用JavaScript,而不是Python或者shell);

应用六:很多企业在使用Electron来开发桌面应用程序;




Node的安装

安装Node的LTS版本

版本概念:

LTS版本:(Long-term support, 长期支持)相对稳定一些,推荐线上环境使用该版本;

Current版本:最新的Node版本,包含很多新特性;

版本选择:

如果你是学习使用,可以选择current版本;

如果你是公司开发,建议选择LTS版本(面向工作,选择LTS版本);

Node的安装方式:

借助于一些操作系统上的软件管理工具,比如Mac上的homebrew,Linux上的yum、dnf等;

直接下载对应的安装包下载安装;



Node的版本管理工具nvm(了解)

nvm:Node Version Manager

n:Interactively Manage Your Node.js Versions(交互式管理你的Node.js版本)

问题:这两个工具都不支持window

n:n is not supported natively on Windows.

nvm:nvm does not support Windows




Node的输入和输出

  • 输出: console.log
  • 输入: node aaa.js 参数process.argv


Node程序传递参数

正常情况下执行一个node程序,直接跟上我们对应的文件即可:

node index.js

但是,在某些情况下执行node程序的过程中,我们可能希望给node传递一些参数:

node index.js env=development coderwhy

如果我们这样来使用程序,就意味着我们需要在程序中获取到传递的参数:

获取参数其实是在process的内置对象中的;

如果我们直接打印这个内置对象,它里面包含特别的信息:

其他的一些信息,比如版本、操作系统等大家可以自行查看,后面用到一些其他的我们还会提到;

**现在,我们先找到其中的argv属性:**我们发现它是一个数组,里面包含了我们需要的参数;

image.png

你可能有个疑问,为什么叫argv呢?

在C/C++程序中的main函数中,实际上可以获取到两个参数:

pargc:argument counter的缩写,传递参数的个数;

pargv:argument vector(向量、矢量)的缩写,传入的具体参数。

vector翻译过来是矢量的意思,在程序中表示的是一种数据结构。

在C++、Java中都有这种数据结构,是一种数组结构;

在JavaScript中也是一个数组,里面存储一些参数信息;

我们可以在代码中,将这些参数信息遍历出来,使用

image.png



Node的输出

最常用的输入内容的方式:console.log

清空控制台:console.clear

打印函数的调用栈:console.trace

还有一些其他的方法,其他的一些console方法,可以自己在下面学习研究一下。

参考:https://nodejs.org/dist/latest-v16.x/docs/api/console.html

Case:

// 1.输出的内容
console.log("Hello World")

const num1 = 100
const num2 = 200

console.log(num1 + num2)

// 2.给程序输入内容
// node ./webpack.config.js env=development
const arg1 = process.argv[2]
const arg2 = process.argv[3]

console.log(arg1, arg2)

setTimeout(() => {
  // console.clear()
  console.trace()
}, 3000);

终端中输入内容

nathanchen@192 01_Node基础知识 % node 02_Node的输入和输出.js 100 200 300
Hello World
300
100 200



Node的全局对象

特殊的全局对象

为什么我称之为特殊的全局对象呢?

这些全局对象实际上是模块中的变量,只是每个模块都有,看来像是全局变量;

在命令行交互中是不可以使用的;

包括:__dirname、__filename、exports、module、require()

__dirname: 获取当前文件所在的路径

__filename: 获取当前文件所在的路径和文件名称

Case:

// __dirname当前的文件所在的目录结构(重要)
console.log(__dirname)
// __filename当前目录+文件名称
console.log(__filename)
nathanchen@192 01_Node基础知识 % node 03_Node中的全局对象.js
/Users/nathanchen/Downloads/CoderWhy/05_前端工程化/day48-前端工程化基础/Learn_Node_Webpack_Git/01_Node基础知识
/Users/nathanchen/Downloads/CoderWhy/05_前端工程化/day48-前端工程化基础/Learn_Node_Webpack_Git/01_Node基础知识/03_Node中的全局对象.js


其他的全局对象

  • process
  • console
  • 定时器setTimeoutsetIntervalsetImmediateprocess.next
  • global和window的区别globalThis

**process对象:**process提供了Node进程中相关的信息:

比如Node的运行环境、参数信息等;

后面在项目中,我也会讲解,如何将一些环境变量读取到 process 的 env 中;

**console对象:**提供了简单的调试控制台,在前面讲解输入内容时已经学习过了。

更加详细的查看官网文档:https://nodejs.org/api/console.html

**定时器函数:**在Node中使用定时器有好几种方式:

setTimeout(callback, delay[, …args]):callback在delay毫秒后执行一次;

setInterval(callback, delay[, …args]):callback每delay毫秒重复执行一次;

setImmediate(callback[, …args]):callbackI / O事件后的回调的“立即”执行;

这里先不展开讨论它和setTimeout(callback, 0)之间的区别;

因为它涉及到事件循环的阶段问题,我会在后续详细讲解事件循环相关的知识;

process.nextTick(callback[, …args]):添加到下一次tick队列中;

具体的讲解,也放到事件循环中说明;



global对象

global是一个全局对象,事实上前端我们提到的process、console、setTimeout等都有被放到global中:

我们之前讲过:在新的标准中还有一个globalThis,也是指向全局对象的;

理解:在浏览器环境下globalThis是指window,在node环境下是global

image.png

类似于浏览器中的window;

image.png

global和window的区别

在浏览器中,全局变量都是在window上的,比如有document、setInterval、setTimeout、alert、console等等

在Node中,我们也有一个global属性,并且看起来它里面有很多其他对象。

但是在浏览器中执行的JavaScript代码,如果我们在顶级范围内通过var定义的一个属性,默认会被添加到window对象上:

let name = 'nathan'
console.log(window.name)  // nathan

但是在node中,我们通过var定义一个变量,它只是在当前模块中有一个变量,不会放到全局中:

let name = 'nathan'
console.log(global.name)  // undefined

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

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

相关文章

C++类与对象深度解析(五):友元机制、内部类与匿名对象的高级应用

文章目录 C类和对象——全面指南前言4. 友元详解4.1 友元的基本概念 4.2 友元函数示例代码:友元函数访问两个类的私有成员输出: 4.3 友元类示例代码:友元类的使用输出: 4.4 友元的特性与限制4.5 友元函数与类的实际应用示例&#…

WAAP解决方案:守护数字时代的安全盾牌

在当今这个数字化、数据驱动的时代,网络安全已成为企业运营中不可或缺的一环。随着Web应用程序和API接口在业务中的广泛应用,其面临的安全威胁也日益复杂多变。为此,WAAP(Web Application and API Protection)解决方案…

JavaEE:网络编程(UDP)

文章目录 UDPUDP的特点UDP协议端格式校验和前置知识校验和具体是如何工作的? UDP UDP的特点 UDP传输的过程类似于寄信. 无连接: 知道对端的IP和端口号就直接进行传输,不需要建立连接.不可靠: 没有确认机制,没有重传机制,如果因为网络故障导致该段无法到达对方,UDP协议也不会…

字符函数 和 字符串函数 的使用与模拟

前言:在编程的过程中,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,C语⾔标准库中提供了 ⼀系列库函数,接下来我们就学习⼀下这些函数。 目录 1. 字符函数 1.1 字符分类判断函数 1.2 字符转换函数 1.3 练…

Sui主网升级至V1.33.2

其他升级要点如下所示: #19404: 启用对等节点的共识轮次探测。 #19119: 无符号整数现在支持.to_string()方法,例如10u8.to_string()等同于 b”10".to_string()。 GraphQL #18774: 为GraphQL引入.move名称解…

Vue3.0组合式API:依赖注入provide和inject实现跨层组件的通信

1、Prop 逐级透传问题 通常情况下,当我们需要从父组件向子组件传递数据时,会使用 props。想象一下这样的结构:有一些多层级嵌套的组件,形成了一棵巨大的组件树,而某个深层的子组件需要一个较远的祖先组件中的部分数据…

数字源表测试IC芯片电性能方案

芯片测试作为芯片设计、生产、封装、测试流程中的重要步骤,是使用特定仪器,通过对待测器件DUT(DeviceUnderTest)的检测,区别缺陷、验证器件是否符合设计目标、分离器件好坏的过程。其中直流参数测试是检验芯片电性能的重要手段之一&#xff0…

JAVA国际版同城货运新纪元货拉拉货运车系统小程序源码

🚚国际货运新风尚,同城搬家轻松享 —— 货拉拉货运车系统,全球互联新体验🌍 🌐【开篇:跨越国界的货运新篇章】🌐 在这个全球化的时代,无论是跨国企业还是个人需求,都渴…

Java通信协议——UDP通信协议,模拟聊天室(完整详解,附有代码)

UDP通信协议,模拟聊天室 需求说明 实现客户咨询问题,客服人员答复问题 分析 咨询时,客户是发送方,客服人员是接收方 答复时,客服人员是发送方,客户是接收方,实现思路和咨询时相同 当客户端输入 …

【5G QoS】详解5G QoS端到端工作机制

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G技术研究。 博客内容主要围绕…

大田上的路径跟踪论文汇总

文章目录 2022Path tracking control method and performance test based on agricultural machinery pose correction(Computers and Electronics in Agriculture)An optimal goal point determination algorithm for automatic navigation of agricult…

4款AI生成PPT工具推荐,提升工作效率

在如今的工作环境中,PPT制作是许多技术人员不可避免的任务,尤其是在汇报、展示技术方案、以及项目进展时。随着AI技术的快速发展,使用AI生成PPT成为了提高效率的一种新趋势。本文将介绍几款适合程序员、技术人员的AI生成PPT工具,帮…

如何用 HAproxy 实施高可用部署 | OceanBase 实践

背景介绍 最近,我们部署了Oceanbase数据库(以下简称OB),并将部分业务迁移至OB中运行。在部署过程中,我们虽然配置了3个OBProxy,但没有为它们设置高可用配置,应用被固定到某一个OBProxy 上&…

通信工程学习:什么是POS无源光分配器

POS:无源光分配器 POS(Passive Optical Splitter,无源光分配器)是无源光网络(Passive Optical Network, PON)中的一个重要组成部分,它位于光线路终端(OLT)和光网络单元&a…

基于Spring Boot的能源管理系统+建筑能耗+建筑能耗监测系统+节能监测系统+能耗监测+建筑能耗监测

介绍 建筑节能监测系统是基于计算机网络、物联网、大数据和数据可视化等多种技术融合形成的一套节能监测系统。 系统实现了对建筑电、水、热,气等能源、资源消耗情况的实时监测和预警、动态分析和评估,为用户建立了科学、系统的节能分析方法&#xff0c…

你天天用微服务还不知道心跳检测机制是什么?

目录标题 1. 心跳检测机制概述2. 心跳检测的具体实现2.1 服务注册与发现示例:Eureka 2.2 心跳包的格式2.3 超时机制 3. 实战中的心跳检测3.1 服务发现与注册中心3.2 定时任务与超时机制3.3 集群管理与协调3.4 故障隔离与恢复 4. 监控与告警5. 具体示例:Z…

制作一个rabbitmq-sdk

目录结构 pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">&l…

VR全景摄影制作中的常见问题及解决方案

随着VR全景摄影技术的普及&#xff0c;越来越多的摄影师和企业开始尝试使用这种方式来展示产品、场景或服务。虽然VR全景摄影有着强大的视觉表现力和沉浸式体验&#xff0c;但在制作过程中也会遇到各种挑战。为了帮助大家更好地掌握VR全景摄影的制作技巧&#xff0c;今天给分享…

STM32 单片机最小系统全解析

STM32 单片机最小系统全解析 本文详细介绍了 STM32 单片机最小系统&#xff0c;包括其各个组成部分及设计要点与注意事项。STM32 最小系统在嵌入式开发中至关重要&#xff0c;由电源、时钟、复位、调试接口和启动电路等组成。 在电源电路方面&#xff0c;采用 3.3V 直流电源供…

【Bug解决】Nacos启动成功,但却无法访问(提示:无法访问此网站,192.168.10.88的响应时间过长)

项目场景&#xff1a; 在虚拟机上通过Docker创建Nacos容器&#xff0c;已经创建成功&#xff0c;查看Nacos启动日志也是成功。但通过端口号加8848/nacos&#xff08;如&#xff1a;http://IP:8848/nacos&#xff09;无法访问到Nacos管理页面。 愿意分析一&#xff1a; 先检查好…