Node.JS - 基础

news2024/9/21 0:36:50

目录

A. 简介

B. 安装和配置

C. npm



A. 简介

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

一、运行原理

  1. 事件驱动和非阻塞 I/O 模型

    • Node.js 采用事件驱动、异步编程的方式。这意味着它不会在等待一个操作(如读取文件或网络请求)完成时阻塞后续代码的执行。相反,当一个操作开始后,Node.js 会在操作完成时触发相应的事件,然后执行与该事件关联的回调函数。
    • 例如,当 Node.js 执行一个文件读取操作时,它不会一直等待文件读取完成,而是继续执行后续代码。当文件读取完成后,会触发一个“文件读取完成”的事件,然后执行相应的回调函数来处理读取到的数据。这种非阻塞 I/O 模型使得 Node.js 能够高效地处理大量并发连接,在高并发场景下表现出色。
    • 以一个简单的 Web 服务器为例,当有多个客户端同时向服务器发送请求时,Node.js 可以同时接收这些请求,而不会因为一个请求的处理时间较长而阻塞其他请求的处理。它会快速地将请求排队,然后逐个处理,一旦某个请求的操作(如从数据库获取数据)完成,就会触发相应的事件来继续处理该请求并返回结果给客户端。
  2. 单线程与异步 I/O

    • Node.js 是单线程运行的,这与传统的多线程服务器模型不同。单线程的优势在于避免了多线程编程中的复杂的线程同步和资源竞争问题。所有的操作都在一个线程中按顺序执行,但通过异步 I/O 和事件循环机制,仍然能够高效地处理并发任务。
    • 例如,在一个多用户的聊天应用程序中,单线程的 Node.js 可以同时处理多个用户的连接和消息传递,而不会因为线程切换和同步带来额外的开销。当一个用户发送消息时,Node.js 会将消息的发送操作异步地放入事件队列中,然后立即处理下一个用户的操作,当消息发送操作完成后,会触发相应的事件来通知用户消息已成功发送。

二、主要特点

  1. 基于 JavaScript

    • 对于熟悉前端 JavaScript 开发的人员来说,学习和使用 Node.js 非常方便,因为可以使用相同的语言进行服务器端编程。这使得前端和后端开发可以使用统一的语言,有利于全栈开发。
    • 例如,一个前端开发人员可以使用 JavaScript 编写网页界面,同时也可以使用 Node.js 编写服务器端代码来处理用户请求、与数据库交互等。代码的复用性提高,开发效率也得到提升。例如,在一个电商网站项目中,前端的购物车功能可以使用 JavaScript 实现,而服务器端的订单处理和库存管理等功能可以使用 Node.js 编写,两者可以共享一些业务逻辑代码。
    • 同时,Node.js 拥有庞大的 JavaScript 生态系统,有大量的开源模块和库可供使用。例如,npm(Node Package Manager)是 Node.js 的包管理工具,类似于 Python 的 pip,通过 npm 可以方便地安装和管理各种第三方模块,如 Express(一个流行的 Web 应用框架)、Socket.IO(用于实时 Web 应用的库)等。开发人员可以快速地利用这些模块来构建功能丰富的应用程序。
  2. 轻量级和高效

    • Node.js 具有轻量级的特点,占用资源少,启动速度快。这使得它非常适合部署在各种环境中,包括小型服务器、云服务器甚至是嵌入式设备等。
    • 例如,在一些物联网项目中,Node.js 可以作为边缘计算的服务器端运行环境,接收和处理来自传感器设备的数据。它可以快速启动并高效地处理大量的小数据量的设备连接和数据传输,而不需要占用过多的系统资源。
    • 并且 Node.js 的高效性能使得它能够快速响应请求,处理大量的并发连接。在一些实时应用场景中,如在线游戏的服务器端、实时聊天应用等,Node.js 能够及时处理玩家或用户的操作和数据传输,保证低延迟的交互体验。例如,在一款多人在线实时对战游戏中,Node.js 服务器可以快速接收玩家的操作指令,并实时将游戏状态同步给其他玩家,确保游戏的流畅性和实时性。

三、应用场景

  1. Web 应用开发

    • Node.js 非常适合构建 Web 应用的服务器端。许多流行的 Web 框架如 Express、Koa 等都是基于 Node.js 构建的。这些框架提供了丰富的功能,如路由管理、中间件支持等,使得开发 Web 应用变得更加简单高效。
    • 例如,使用 Express 框架可以快速搭建一个 RESTful API 服务,为前端应用提供数据接口。在一个博客系统项目中,服务器端可以使用 Node.js 和 Express 框架来处理用户的注册、登录、文章发布等请求,同时与数据库进行交互,将数据存储和读取。前端应用通过 API 与服务器进行通信,实现前后端分离的开发模式。
    • 对于实时性要求较高的 Web 应用,如在线协作工具、实时投票系统等,Node.js 的实时通信能力也非常有用。通过 Socket.IO 等库,可以实现服务器与客户端之间的实时双向通信,当有新的数据或事件发生时,服务器可以立即将信息推送给客户端,客户端也可以实时将操作反馈给服务器。
  2. 命令行工具开发

    • 由于 Node.js 可以在不同的操作系统上运行,并且具有良好的文件操作和系统交互能力,因此非常适合开发命令行工具。例如,可以使用 Node.js 编写一个自动化构建工具,用于编译、压缩和部署前端项目。
    • 比如一个前端项目的构建工具,它可以使用 Node.js 来执行一系列任务,如将 Sass 或 Less 文件编译为 CSS 文件、压缩 JavaScript 和 CSS 文件以提高网页加载速度、将项目部署到服务器等。通过命令行界面,开发人员可以方便地使用这些工具来提高开发效率。
    • 另外,还可以开发一些系统管理工具,如监控服务器资源使用情况、自动化备份数据等。这些工具可以在服务器上运行,通过 Node.js 的文件系统和网络操作功能,实现对服务器的各种管理任务。
  3. 微服务架构

    • 在微服务架构中,Node.js 可以作为一种轻量级的服务构建技术。每个微服务可以用 Node.js 实现,独立部署和运行,通过网络进行通信。
    • 例如,在一个大型电商平台中,可以将商品管理、订单处理、用户认证等功能拆分成不同的微服务,每个微服务都可以用 Node.js 编写。这样可以提高系统的可扩展性和灵活性,当某个微服务需要升级或扩展时,不会影响到其他微服务的正常运行。而且 Node.js 的快速开发和部署特点也适合微服务架构的快速迭代需求。

B. 安装和配置

下载地址

Node.js — Run JavaScript Everywhere (nodejs.org)

直接下一步,下一步即可,不想安装到C盘的,可以自定义安装路径.

打开命令行输入

node

如上显示及安装成功,并且已经自动加好环境变量.

使用这种安装方法还自动安装好了npm

在命令行输入

npm

C. npm

npm(Node Package Manager)是随同 Node.js 一起安装的包管理工具。

一、功能与作用

  1. 包的安装

    • 它允许开发者方便地安装各种 JavaScript 模块(包)。这些模块可以是用于构建 Web 应用程序、命令行工具、服务器端应用等各种场景的功能代码。
    • 例如,如果你想在 Node.js 项目中使用 Express 框架(一个流行的用于构建 Web 应用和 API 的框架),只需要在项目目录下运行npm install express命令,npm 就会自动从其官方仓库(npmjs.com)下载 Express 框架的代码及相关依赖,并将它们安装到项目的node_modules目录中。
    • 对于一些复杂的项目,可能需要安装多个包及其依赖。比如在一个使用 React 和 Redux 的前端项目中,通过npm install命令可以安装 React、Redux 以及它们所需要的众多其他依赖包,npm 会自动处理这些包之间的依赖关系,确保所有的包都能正确安装和运行。
  2. 包的版本管理

    • npm 可以有效地管理包的不同版本。每个包在 npm 仓库中都有版本号标识。开发者可以指定安装特定版本的包,或者使用语义化版本控制的规则来安装符合要求的最新版本。
    • 例如,一个包的版本号可能是1.2.3,其中“1”是主版本号,“2”是次版本号,“3”是补丁版本号。按照语义化版本控制的约定,主版本号的变化通常表示有不兼容的 API 更改,次版本号的增加表示有新功能添加且保持向后兼容,补丁版本号的更新主要是修复一些小错误。
    • 开发者可以通过在package.json文件中指定包的版本范围来控制安装的版本。比如"express": "^4.17.1"表示安装 Express 框架的 4.17.1 版本或者更高的 4.x 版本(只要符合语义化版本控制的兼容性规则)。这样可以在保证项目稳定性的同时,享受到包的更新和改进带来的好处。
  3. 项目依赖管理

    • 在一个 Node.js 项目中,package.json文件是项目的核心配置文件之一,npm 通过它来管理项目的依赖关系。
    • 开发者在package.json文件中列出项目所需要的直接依赖包及其版本范围等信息。当其他开发者或在不同环境中安装这个项目时,只需要运行npm install命令,npm 就会根据package.json中的配置自动安装所有需要的包及其正确的版本。
    • 此外,npm 还可以管理项目的开发依赖。例如,在开发过程中可能需要使用一些测试框架(如 Mocha)或代码格式化工具(如 ESLint)等,这些只在开发阶段使用的包可以作为开发依赖列在package.json文件中。通过npm install --save-dev命令安装开发依赖包,这样可以区分项目的生产环境和开发环境所需的不同依赖,使项目的依赖管理更加清晰和高效。

二、工作流程与原理

  1. 包的搜索与获取

    • 当开发者运行npm install命令并指定要安装的包名时,npm 首先会连接到官方的 npm 仓库(这是一个庞大的在线代码库,包含了数以百万计的 JavaScript 包)。
    • npm 在仓库中搜索指定的包。一旦找到,它会获取该包的元数据,包括版本信息、依赖关系等。
    • 然后,npm 根据包的依赖关系树,确定需要下载和安装的所有相关包。例如,如果要安装的包 A 依赖于包 B 和 C,那么 npm 会同时下载包 A、B 和 C。
  2. 本地安装与存储

    • npm 将下载的包及其依赖存储在项目目录下的node_modules文件夹中。这个文件夹按照包的依赖关系结构进行组织。
    • 每个包都有自己独立的目录,包含了该包的代码文件、配置文件等。例如,如果安装了 Express 框架,在node_modules/express目录下会有 Express 框架的所有相关文件。
    • npm 还会在项目目录下更新或创建package-lock.json文件(如果使用 npm 5 及以上版本)。这个文件记录了精确的依赖树信息,包括每个安装的包的版本、依赖关系以及安装路径等。它的存在确保了在不同环境中安装项目时能够得到一致的依赖版本,避免因为包的更新等原因导致项目出现不一致的情况。
  3. 包的更新与卸载

    • 当有包的新版本发布时,开发者可以通过npm update命令来更新项目中已安装的包。npm 会检查每个已安装包的最新版本,并根据package.json中指定的版本范围(如果有)来更新相应的包。
    • 例如,如果package.json中指定了某个包的版本范围为^1.0.0(表示安装 1.x.x 的最新版本,只要符合语义化版本控制的兼容性规则),当该包的 1.1.0 版本发布时,运行npm update命令会将项目中的该包更新到 1.1.0 版本(如果没有兼容性问题)。
    • 如果要卸载某个不再需要的包,可以使用npm uninstall命令,npm 会从node_modules文件夹中删除该包及其相关依赖(如果该依赖没有被其他包所使用),同时也会更新package.json文件,将该包从项目的依赖列表中移除。

三、在开发中的重要性

  1. 提高开发效率

    • npm 提供了一个庞大的包资源库,开发者无需从头编写所有的功能代码。例如,在开发一个 Web 应用时,通过安装和使用各种已有的包,可以快速实现诸如用户认证、数据库连接、表单验证等常见功能,而不需要自己重新开发这些功能模块,大大节省了开发时间。
    • 以开发一个博客系统为例,通过使用诸如mongoose(用于与 MongoDB 数据库交互的 Node.js 库)等包,可以快速实现博客文章的存储和读取功能,而不需要自己编写底层的数据库操作代码。这样开发者可以更专注于项目的独特业务逻辑和用户体验的设计。
  2. 促进代码复用和社区合作

    • 开发者可以将自己开发的功能模块打包并发布到 npm 仓库,供其他开发者使用。这促进了代码的复用和共享,提高了整个 JavaScript 社区的开发效率。
    • 例如,一个开发者开发了一个用于处理日期格式的自定义库,并将其发布到 npm 仓库。其他开发者在自己的项目中如果需要处理日期格式相关的功能,就可以直接通过 npm 安装这个库并使用,而不需要重新开发类似的功能。同时,其他开发者也可以对这个库提出改进建议或贡献代码,促进了社区的合作和知识共享。
  3. 便于项目维护和更新

    • 通过 npm 管理项目的依赖关系,使得项目的维护更加容易。当某个包存在安全漏洞或需要更新功能时,开发者可以通过 npm 及时了解并更新相关包。
    • 例如,某个常用的第三方库被发现存在安全漏洞,开发者会收到 npm 的安全通知。通过运行npm update命令,开发者可以快速更新该库到修复了漏洞的版本,确保项目的安全性。同时,由于package-lock.json文件的存在,在团队协作开发中,不同开发者安装的项目依赖版本能够保持一致,减少了因为依赖版本不一致导致的开发和部署问题。

总之,npm 作为 Node.js 的包管理工具,在 JavaScript 开发中扮演着至关重要的角色,它极大地提高了开发效率,促进了代码复用和社区合作,同时也方便了项目的维护和更新。

下一篇开始编写第一个node代码.

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

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

相关文章

spfa算法判断是否存在负权回路

spfa算法判断是否存在负权回路 题目 当一个图中存在一个负权回路时,是无法利用spfa 算法去求最短路问题的,但是可以利用spfa 算法判断有没有负权回路 题目 给定一个 n n n 个点 m m m 条边的有向图,图中可能存在重边和自环, 边…

VisionPro二次开发学习笔记11-使用 Caliper和Fixture定位Blob工具检测方块

该示例演示了如何使用卡尺工具和夹具工具来固定 Blob 工具。示例代码将检测图像上部区域中小方块的存在。当点击“运行”按钮时,将读取一张新图像。卡尺工具将被运行,卡尺工具的输出 Y 信息将传递给夹具工具。夹具工具使用来自卡尺工具的 Y 信息和新图像…

新手养猫怎么选智能猫砂盆?不踩雷平价实用攻略测评分享!

众所周知,猫咪是非常爱干净的动物,一旦猫砂盆满了,它们就可能会选择其他角落“解决”,这不仅会让家里充满异味,还可能影响猫咪的健康。而长期堆积的猫砂,也容易滋生细菌,对猫咪的爪子也是一种伤…

[CISCN2019 华东南赛区]Web111

打开题目,看到题目 注意最下面的Build With Smarty! , 猜测是smarty模板注入。smart是php的模板引擎,模板引擎的作用就是分离前端页面和数据的,题目中显示API的URL由于环境的原因无法使用,但我们的IP依旧显示在了页面的右上角&…

python-约瑟夫环(赛氪OJ)

[题目描述] n 个人( 0,1,2,3,4...n−1 ),围成一圈,从编号为 k 的人开始报数,报数报到 m 的人出队。 下次从出队的人之后开始重新报数,循环往复,当队伍中只剩最后一个人的时候,那个人…

【Material-UI】Checkbox 组件中的 Label Placement 设置详解

文章目录 一、Checkbox 组件简介1. 组件概述2. labelPlacement 属性 二、labelPlacement 属性的使用方法三、各标签位置的效果与应用场景1. Top(顶部)2. Start(左侧)3. Bottom(底部)4. End(右侧…

【文献精读】LOCA 图4

(1)数据流动 QKV的选取

Compass Arena 上新啦!新增双多模态模型匿名对战

2024 年 5 月,上海人工智能实验室司南 OpenCompass 团队 与魔搭 ModelScope 联合推出了大模型评测平台——Compass Arena(大模型竞技场),为国内的大语言模型领域引入了一种全新的竞技模式。 今天,Compass Arena 迎来重…

JVM知识总结(G1收集器)

文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ G1收集器 G1**(Garbage First)是一款面向服…

Mocaverse「Enter MOCALAND」上线!

我们很高兴宣布 Mocaverse 和 The Sandbox 将开展一项新合作——「Enter MOCALAND!」 继 “Into the Unknow” Game Jam 成功举办之后,我们的创作者们在此基础上创作出了近 50 款未来派多人游戏,我们很高兴能继续与社区一起庆祝共同创作&…

Redis与DataBase保持数据一致性

文章目录 1. 读取数据2. 写数据2.1 先操作缓存2.2 先操作数据库 在我们系统中缓存最常用的策略是:服务端需要同时维系DB和Cache,并且是以DB的结果为准, Cache-Aside Pattern(缓存分离模式、旁路缓存)。 1. 读取数据 当…

高质量翻译对中国移动应用在国外市场推广的影响

在移动应用的竞争格局中,打入国外市场对中国开发商来说既是机遇也是挑战。决定中国移动应用程序在海外成功的最关键因素之一是其翻译质量。高质量的翻译在有效推广该应用程序、确保其与当地用户产生共鸣,并最终推动新市场的采用和增长方面发挥着关键作用…

嵌入式全栈开发学习笔记---数据结构(广度优先算法)

目录 过程分析 代码实现 queue_maze.c 上节我们讲完了队列,本节开始学习广度优先算法! 之前我们用深度优先算法找出从迷宫出来的所有路径,本次我们要用广度优先算法找出最短路径。 过程分析 广度优先算法也叫广度优先搜索。 这种算法就相当…

Qwen2-Math 开源 AI 模型发布;阿里云推出首个域名 AI 大模型应用丨 RTE 开发者日报

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思…

vscode用快捷键一键生成vue模板

项目中有些代码模块是固定的,如下面的代码所示,为了不重复写这些相同的代码,我们可以使用快键键一键生成模板。 流程: 中文:首选项-> 用户代码片段 -> 输入框中输入vue,找到vue.json文件(没有vue.j…

如意AI健康管理开放域自然对话算法分析报告

一、算法全周期行为分析 1. 算法安全 信息内容安全:通过意图识别和实体抽取技术,确保生成的内容不涉及违法或不当信息。 信息源安全:数据采集环节采用安全措施,保护数据不被非法访问。 2. 算法监测 信息安全监测:实施实…

国产芯上运行TinyMaxi轻量级的神经网络推理库-米尔基于芯驰D9国产商显板

本篇测评由优秀测评者“短笛君”提供。 本文将介绍基于米尔电子MYD-YD9360商显板(米尔基于芯驰D9360国产开发板)的TinyMaxi轻量级的神经网络推理库方案测试。 算力测试 TinyMaix 是面向单片机的超轻量级的神经网络推理库,即 TinyML 推理库&a…

重头开始嵌入式第十六天(结构体,共用体)

目录 结构体 结构体定义 结构体初始化 结构体赋值 结构体调用 结构体大小 在 C 语言中,结构体内存对齐规则主要遵循以下原则: 共用体 共用体定义 共同体赋值,初始化 共用体大小 结构体与共用体的区别 结构体 在 C 语言中,…

vuex properties of undefined (reading ‘getters‘)

前言: 最近打算用vue 写个音乐播放器,在搞 vuex 的时候遇到一个很神奇报错;vuex 姿势练了千百次了,刚开始的时候我一直以为是代码问题,反复检查了带了,依旧报错。 Error in mounted hook: "TypeError:…

PHP全方位多功能投票小程序系统源码

🌟【全民参与,决策更精彩】全方位多功能投票小程序大揭秘!🎉 🚀 开篇引入:投票新风尚,尽在指尖 Hey小伙伴们,你是否厌倦了传统的投票方式,觉得它们既繁琐又不够灵活&am…