初识Node.js开发

news2024/12/23 22:29:30

一、Node.js是什么

1.node.js是什么

官方对Node.js的定义:

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

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

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

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

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

2.浏览器和Node.js架构的区别

我们可以简单理解规划出Node.js和浏览器的差异:

在这里插入图片描述

3.Node.js架构

我们来看一个单独的Node.js的架构图:

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

  • libuv(Unicorn Velociraptor—独角伶盗龙)是使用C语言编写的库;
  • libuv提供了事件循环文件系统读写网络IO线程池等等内容;

在这里插入图片描述

4.Node.js的应用场景

Node.js的快速发展也让企业对Node.js技术越来越重视,在前端招聘中通常会对Node.js有一定的要求,特别对于高级前端开发工程师,Node.js更是必不可少的技能:

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

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

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

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

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

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

二、Node的安装

1.Node的安装

Node.js是在2009年诞生的,目前最新的版本是分别是LTS 16.15.1以及Current 18.4.0:

  • LTS版本:(Long-term support, 长期支持)相对稳定一些,推荐线上环境使用该版本;
  • Current版本:最新的Node版本,包含很多新特性;

这些我们选择什么版本呢?

  • 如果你是学习使用,可以选择current版本;
  • 如果你是公司开发,建议选择LTS版本(面向工作,选择LTS版本);

Node的安装方式有很多:

  • 可以借助于一些操作系统上的软件管理工具,比如Mac上的homebrew,Linux上的yum、dnf等;
  • 也可以直接下载对应的安装包下载安装;

我们选择下载安装,下载自己操作系统的安装包直接安装就可以了:

  • window选择.msi安装包,Mac选择.pkg安装包,Linux会在后续部署中讲解;
  • 安装过程中会配置环境变量(让我们可以在命令行使用);
  • 并且会安装npm(Node Package Manager)工具;

2.Node版本管理工具

在实际开发学习中,我们只需要使用一个Node版本来开发或者学习即可。

但是,如果你希望通过可以快速更新或切换多个版本时,可以借助于一些工具:

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

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

Window的用户怎么办?

针对nvm,在GitHub上有提供对应的window版本:https://github.com/coreybutler/nvm-windows

  • 通过 nvm install latest 安装最新的node版本

  • 通过 nvm list 展示目前安装的所有版本

  • 通过 nvm use 切换版本

3.版本管理工具:n

安装n:直接使用npm安装即可

# 安装工具n
npm install -g n
# 查看n的版本
n --version

安装最新的lts版本:

  • 前面添加的sudo是权限问题;
  • 可以两个版本都安装,之后我们可以通过n快速在两个版本间切换;
# 安装lts版本
n lts
# 安装最新版本
n latest

三、JavaScript代码运行

1.JavaScript代码运行

如果我们编写一个js文件,里面存放JavaScript代码,如何来执行它呢?

目前我们知道有两种方式可以执行:

  • 将代码交给浏览器执行;
  • 将代码载入到node环境中执行;

如果我们希望把代码交给浏览器执行:

需要通过让浏览器加载、解析html代码,所以我们需要创建一个html文件;

  • 在html中通过script标签,引入js文件;
  • 当浏览器遇到script标签时,就会根据src加载、执行JavaScript代码;

如果我们希望把js文件交给node执行:

  • 首先电脑上需要安装Node.js环境,安装过程中会自动配置环境变量
  • 可以通过终端命令node js文件的方式来载入和执行对应的js文件;

2.Node的REPL

什么是REPL呢?感觉挺高大上

  • REPL是Read-Eval-Print Loop的简称,翻译为“读取-求值-输出”循环;
  • REPL是一个简单的、交互式的编程环境

事实上,我们浏览器的console就可以看成一个REPL。

Node也给我们提供了一个REPL环境,我们可以在其中演练简单的代码。

在这里插入图片描述

四、Node的输入和输出

1.Node程序传递参数

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

node index.js

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

node index.js env=dev abc

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

  • 获取参数其实是在process的内置对象中的;
  • 如果我们直接打印这个内置对象,它里面包含特别多的信息:
    • 其他的一些信息,比如版本、操作系统等大家可以自行查看,后面用到一些其他的我们还会提到;

现在,我们先找到其中的argv属性:

  • 我们发现它是一个数组,里面包含了我们需要的参数;
// 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);

2.为什么叫argv呢?

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

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

  • argc:argument counter的缩写,传递参数的个数;
  • argv:argument vector(向量、矢量)的缩写,传入的具体参数。

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

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

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

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

const args = process.argv
for (const arg of args) {
  console.log(arg)
}

3.Node的输出

console.log

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

console.clear

  • 清空控制台:console.clear

console.trace

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

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

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

五、常见的全局对象

1.常见的全局对象

Node中给我们提供了一些全局对象,方便我们进行一些操作:

  • 这些全局对象,我们并不需要从一开始全部一个个学习;
  • 某些全局对象并不常用
  • 某些全局对象我们会在后续学习中讲到;
    • 比如module、exports、require()会在模块化中讲到;
    • 比如Buffer后续会专门讲到;

在这里插入图片描述

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]):callback I / O事件后的回调的“立即”执行;
    • 这里先不展开讨论它和setTimeout(callback, 0)之间的区别;
    • 因为它涉及到事件循环的阶段问题,我会在后续详细讲解事件循环相关的知识;

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

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

2.global对象

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

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

类似于浏览器中的window

console.log(global === globalThis)// true

3.global和window的区别

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

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

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

var foo = 111
console.log(window.foo)// 111

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

var foo = 111
console.log(window.foo)// undefined

3.特殊的全局对象

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

  • 这些全局对象实际上是模块中的变量,只是每个模块都有,看来像是全局变量;
  • 在命令行交互中是不可以使用的;
  • 包括:__dirname、__filename、exports、module、require()

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

  • 注意:不包括后面的文件名

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

  • 注意:包括后面的文件名称
console.log("全局对象__dirname:" + __dirname)
// 全局对象__dirname:D:\disk\frontend\code\06JS_MODULE\01Nodejs
console.log("全局对象__filename:" + __filename)
// 全局对象__filename:D:\disk\frontend\code\06JS_MODULE\01Nodejs\03_全局对象.js

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

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

相关文章

保证跨境商城源码稳定性的重要性

稳定性保证源码的可靠性 在跨境电商领域,跨境商城源码的稳定性对于商城运营至关重要。一个稳定、可靠的源码能够确保商城的正常运行,提升用户体验,增加交易成功率,并为商城的可持续发展打下基础。 稳定性保证系统顺利运行 跨境商城…

第四个 1024,属于我们!

第四个 1024,只属于我们,愿人世间没有 BUG! if (today1024) {printf("拒绝加班!")} else {printf("没有Bug!")}2023 - 1024 加油! 我是故屿 一个在互联网苟且偷生的工具人 若非生…

内衣洗衣机便宜好用的牌子有哪些?四款公认好用洗内裤机推荐

在机器解放了双手的时代中,洗衣机走进了千家万户,虽然在某种程度上缓解了人们手洗衣服的压力,但还是有不少人选择了人工手洗自己的内衣内裤,甚至连袜子都是手工洗的,这让人很是郁闷,倒不是说洗衣机不方便&a…

Jenkins CLI二次开发工具类

使用Jenkins CLI进行二次开发 使用背景 公司自研CI/DI平台,借助JenkinsSonarQube进行代码质量管理。对接版本 Jenkins版本为:Version 2.428 SonarQube版本为:Community EditionVersion 10.2.1 (build 78527)技术选型 Java对接Jenkins有第…

研发效能(DevOps)职业技术认证-第六期开班啦丨IDCF

本证书是由国家工业和信息化部教育与考试中心颁发的职业技术证书,也是国内首个《研发效能(DevOps)工程师职业技术认证》。该《认证》对研发效能(DevOps)工程师的职业技术分为初级、中级、高级三个专业等级。 IDCF社区…

nrf52832 PWM配置

PWM使用时sdk_config.h文件中配置如下:#define PWM_ENABLED 1 #define PWM0_ENABLED 1 #define NRFX_PWM_ENABLED 1 #define NRFX_PWM0_ENABLED 0sdk_config.h 文件中添加下列配置 // <e> NRFX_PWM_ENABLED - nrfx_pwm - PWM peripheral driver // #ifndef NRFX_PWM_ENA…

uniapp实现webview页面关闭功能

实现思路&#xff1a; 1.关闭按钮是使用原生button添加的close属性。&#xff08;见page.json页面&#xff09; 2.监听关闭按钮的方法。&#xff08;onNavigationBarButtonTap&#xff09; 3.写实现关闭webview所有页面的逻辑。 废话不多说&#xff0c;直接上代码 1.page.…

Java的泛型高级篇

以前在看源码的时候&#xff0c;老是能够看见大写的字母&#xff1a;T D...... 他就是用来标志泛型的。就拿ArrarList E就是 &#xff1a;element的简写 T就是Type。 另外一种就很高级&#xff0c;父级和自己约束性泛型&#xff1a; 定义一个顶级父类&#xff1a;TimeTest publ…

SNCP,子网连接保护简介

文章目录 SNCP特点SNCP的保护原理及类型ODUk SNCP工作原理SNCP分类SNC/N&#xff0c;子网连接保护/非介入监测ODUk SNC/ N 保护示意图ODUk SNC/N 的倒换条件 SNCP&#xff08;SubNetwork Connection Protection&#xff09;是一种跨子网的保护机理&#xff0c;可以保护不同基本…

Dynamics 365 使用ILMerge 合并CRM开发后的DLL

很久以前写过一篇博文&#xff0c;关于用ILMerge 命令合并DLL,当时时纯敲命令行的&#xff0c;现在有了更简单的方式&#xff0c;只需要在NuGet下载如下两个包 另外插件引用第三方dll的新方案Preview来了&#xff0c;不久的将来就不需要使用ILMerge了

《GB/T 8566-2022/ISO/IEC/IEEE:系统与软件工程生存周期过程》国家标准解读,附下载地址

关于企业架构、软件工程等相关内容&#xff0c;基本在行业内工作一段时间都能解释出各自的理解&#xff0c;网络资料更是知识爆炸&#xff0c;看似哪一种都对&#xff0c;其实相对都是个人理解&#xff0c;算不上严谨。 上周工作中涉及架构的企业标准编制审查&#xff0c;对严…

C# U2Net 抠图

效果(u2net.onnx) 效果(u2net_human_seg.onnx) 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using Syst…

C# 开发的程序怎么默认以管理员身份运行

C# 在读写注册表或其他的敏感操作时&#xff0c;如果程序未获得管理员权限&#xff0c;操作会报错&#xff0c;可以在exe文件的属性页面里勾选【以管理员身份运行此程序】 那么怎么默认以管理员身份运行呢 方法一 在项目上右键&#xff0c;点击【属性】&#xff0c;点击【安…

ROS系列(三):rosbag 中提取图像数据与帧率对齐

首先说明一下&#xff0c;rosbag的解压方式取决于之前的压缩方式&#xff0c;数据的格式和工具使用的方法有很大关系。当前数据类型是 sensor_msgs/CompressedImage 。 处理数据的topic为 /cam_front_center/csi_cam/image_raw/compressed 当前提取是前置摄像头图像数据。 可…

【23真题】碰瓷重邮成电,题目Mini版本!

今天分享的是23年广西师范大学846的信号与系统部分试题及解析。 本套试难度分析&#xff1a;23年平均分只有90-100分&#xff0c;最高分129分&#xff01;但是我觉得不难。22年广西师范846我也发布过&#xff0c;如有需要戳这里自取&#xff01;该院校考察的是模拟电路和信号系…

工具及方法 - 查电子器件和查说明书

查询电子器件 手里一个产品&#xff0c;上面使用的蓝牙模组是BL871E2&#xff0c;然后想查一下相关信息&#xff0c;发现了下面的查询网站&#xff1a; 查询某颗物料的网站&#xff1a; device.report Search for Electronic Components Price & Stock | DigiPart 查询UG…

【实战】Kubernetes安装持久化工具NFS-StorageClass

文章目录 前言技术积累存储类&#xff08;storage class&#xff09;什么是NFS什么是PV\PVC为什么要用NFS-StorageClass 安装NFS-StorageClass保证N8S集群正常投用安装NFS工具与客户端NFS安装常见错误安装NFS-StorageClass存储器 前言 前面的博文我们介绍了如何用kuberadmin的…

RosettaNet PIPs 简介

RosettaNet背景知识 RosettaNet由主要计算机&#xff0c;消费电子产品&#xff0c;半导体制造商&#xff0c;电信和物流公司组成的联盟组成&#xff0c;共同创建和实施行业范围的开放式电子商务流程标准。这些标准形成了一种通用的电子商务语言&#xff0c;在全球范围内协调供…

【SpringCloud微服务项目实战-mall4cloud项目(5)】——mall4cloud-leaf

mall4cloud-leaf 基于美团leaf的生成id服务 分布式id介绍具体代码及使用项目中的生成id模式具体代码分布式id生成使用 分布式id介绍 分布式ID&#xff08;Distributed ID&#xff09;是在分布式计算环境中生成的唯一标识符或标识号。在分布式系统中&#xff0c;通常需要唯一标…

Vcenter实战利用方式总结

目录 0x01 指纹特征 0x02 查看Vcenter版本 0x03 CVE-2021-21972 0x04 CVE-2021-22005 0x05 CVE-2021-44228 0x06 获取vcenter-web控制台权限 重置密码 cookie登录 不重置获取密码&#xff08;ESXI&#xff09; 1、获取解密key 2、获取数据库账号密码 3、使用脚本解…