【Node.js】-下载、安装和简单使用

news/2024/5/30 1:18:34/文章来源:https://blog.csdn.net/baidu_25347287/article/details/136553346

概述

Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它使得JavaScript能够在服务器端运行。这意味着开发者可以使用JavaScript来编写服务器端的程序,从而处理来自客户端的请求和响应。Node.js的出现极大地丰富了Web开发的手段和方式,使得前后端可以使用同一种语言进行开发,提高了开发效率和代码的可维护性。

Node.js的优势在于其异步和非阻塞的I/O模型,这使得它非常适合处理高并发、I/O密集型的场景,如实时聊天、在线游戏等。此外,Node.js还拥有一个庞大的生态系统和丰富的第三方库,可以帮助开发者快速构建各种类型的应用。

发展

Node.js的发展历程可谓是充满了创新与突破。自2009年诞生以来,它便以其独特的优势在开发社区中引起了广泛关注。

在2009年,Ryan Dahl基于Chrome的V8引擎创建了Node.js,其初衷是创建一个轻量级的Web服务器并提供一套库。这一创新使得JavaScript能够突破浏览器的限制,在服务器端大放异彩。同年5月,Ryan Dahl在GitHub上发布了最初版本的部分Node包,随后几个月里,有人开始使用Node开发应用。

2010年,Node.js的发展进一步加速。这一年,Express.js和Socket.io等重要的框架和库相继诞生,为Node.js生态系统注入了新的活力。同时,Node.js也获得了云计算服务商Joyent的资助,创始人Ryan Dahl全职加入Joyent,负责Node.js的发展。

进入2011年,Node.js在微软的支持下发布了Windows版本,这一举措极大地拓宽了Node.js的应用范围。同年,npm也发布了1.0版本,为大公司的采用提供了更加稳定可靠的依赖管理工具。这一年,许多大公司如LinkedIn、Uber等开始采用Node.js进行项目开发。

此后几年,Node.js继续保持快速发展的势头。2012年,Node.js的普及非常迅速,成为开发社区中的热门话题。2013年,第一个使用Node.js的大型博客平台Ghost诞生,这标志着Node.js在大型项目中的应用已经日益成熟。

然而,Node.js的发展并非一帆风顺。在2014年,出现了一个重要的分支io.js,其目标是引入ES6的支持并加快推进速度。经过一段时间的并行发展,io.js最终在2015年被合并回Node.jsNode.js的安装是一个相对简单的过程,主要涉及下载、安装以及验证安装步骤。以下是详细的安装步骤:

安装

  • 下载安装包

  • 打开Node.js官网,根据自身系统下载对应的安装包。对于大多数用户,推荐选择长期稳定版(LTS)以确保稳定性和安全性。

  • 选择合适的安装包格式,比如Windows用户可以选择Windows Installer (.msi) 64位的安装包。

  • 点击下载并等待下载完成。

  • 安装

  • 下载完成后,双击安装包开始安装。

  • 同意许可协议,并根据需要选择安装位置。默认情况下,Node.js会安装在C盘,但也可以自定义修改为其他位置。

  • 根据个人需求,可以选择安装相应的功能。对于初学者或一般用户,通常可以直接点击“Next”进行下一步。

  • 无需安装额外的工具,继续点击“Next”。

  • 点击“安装”开始安装过程。

  • 等待安装完成。

  • 验证安装

  • 安装完成后,可以通过命令行验证Node.js是否正确安装。在Windows系统中,按下Win + R键,输入“cmd”打开命令提示符窗口。

  • 在命令提示符窗口中,输入“node -v”和“npm -v”命令,分别查看Node.js和npm(Node包管理器)的版本号。如果成功显示版本号,则表示Node.js已成功安装。

  • 配置环境变量(可选):

  • 为了方便使用Node.js和npm,可以将它们添加到系统的环境变量中。这样,在任何目录下都可以直接运行Node.js命令和npm命令。

  • 打开系统环境变量设置,新建一个变量名为“NODE_PATH”,值为Node.js的安装目录下的“node_modules”文件夹路径。

  • 同时,可能需要编辑用户变量中的Path,将npm的全局路径改为Node.js安装目录下的“node_global”文件夹路径。

  • 配置npm全局安装路径和缓存路径(可选):

  • 在Node.js安装目录下新建两个文件夹“node_global”和“node_cache”,用于存放npm全局安装的模块和缓存。

  • 在命令提示符窗口中执行相关命令,将npm的全局安装路径和缓存路径修改为自定义的“node_global”和“node_cache”文件夹。

  • 配置npm的全局安装路径和缓存路径,可以按照以下步骤进行:

1.查看当前配置:在命令面板(Windows系统可以通过按下Win + R键,输入cmd打开)中,运行命令npm config ls来查看当前的npm配置。
2. 设置全局安装目录:运行命令npm config set prefix "D:\nodejs\node_global"(请将路径替换为你实际希望设置的路径)。这样,npm的全局模块就会安装在你指定的这个目录下。
3. 设置缓存目录:运行命令npm config set cache "D:\nodejs\node_cache"(同样,将路径替换为你实际希望设置的路径)。这将设置npm的缓存目录。
4. 查看npm相关配置:再次运行npm config ls命令,确认prefixcache是否已修改为你设置的路径。
5. 配置环境变量:将步骤2中设置的全局安装目录路径添加到系统的环境变量中。在Windows系统中,可以通过“我的电脑”-右键-“属性”-“高级系统设置”-“高级”-“环境变量”进行编辑。在“系统变量”下找到Path变量,编辑并添加你的全局安装目录路径。

完成以上步骤后,npm的全局安装路径和缓存路径就已经配置好了。之后通过npm安装的全局模块将会存放在你设置的全局安装目录中,缓存数据则会存放在你设置的缓存目录中。

请注意,配置路径时需要根据你实际的安装位置和需求来设定,上述步骤中的路径仅为示例。同时,每次修改配置后,都建议通过npm config ls命令来检查配置是否已成功修改。

使用

创建一个最简单的服务器

使用Node.js主要涉及到编写JavaScript代码来执行各种任务,比如创建Web服务器、处理文件、访问数据库等。以下是一个简单的例子,展示了如何使用Node.js创建一个基本的HTTP服务器。

首先,确保你已经正确安装了Node.js。你可以通过在命令行中输入node -v来检查Node.js是否已经安装以及安装的版本。

接下来,创建一个新的JavaScript文件,比如命名为server.js。然后,在这个文件中输入以下代码:

// 导入http模块
const http = require('http');// 创建一个服务器
const server = http.createServer((req, res) => {// 当请求到来时,发送响应res.statusCode = 200; // 设置HTTP状态码为200res.setHeader('Content-Type', 'text/plain'); // 设置响应头,指定响应内容的类型为纯文本res.end('Hello, World!\n'); // 结束响应,并发送"Hello, World!"字符串作为响应体
});// 监听指定端口
const port = 3000;
server.listen(port, () => {console.log(`Server running at http://localhost:${port}/`);
});

在这个例子中,我们使用了Node.js的内置http模块来创建一个简单的HTTP服务器。当服务器收到请求时,它会发送一个包含"Hello, World!"字符串的响应。

保存文件后,打开命令行,导航到包含server.js文件的目录,并运行以下命令来启动服务器:

node server.js

如果一切正常,你应该会在命令行中看到一条消息,告诉你服务器正在运行,并给出了访问地址(通常是http://localhost:3000/)。

现在,打开你的网页浏览器,输入上述地址,你应该会看到浏览器显示"Hello, World!"。这就说明你的Node.js服务器已经成功运行,并能够处理HTTP请求了。

这只是一个非常基础的例子,但是用在实际生产环境中可能还远远不够,应对实际环境中的高并发、大流量等场景,我们需要自己做进一步的优化

一个简单的高效的服务器

要编写一个高效的HTTP服务器,你需要考虑一些关键因素,如并发处理、资源利用、错误处理以及性能优化。Node.js 的非阻塞 I/O 模型和事件驱动架构使其非常适合构建高效且可扩展的服务器。以下是一些建议和实践,帮助你编写高效的 Node.js HTTP 服务器:

1. 使用异步编程

Node.js 的核心优势之一是其非阻塞的 I/O 操作,因此你应该尽可能地利用这一点。避免使用同步函数,因为它们会阻塞事件循环,导致性能下降。相反,你应该使用异步函数和回调、Promises 或 async/await。

2. 优化并发处理

Node.js 使用单线程和事件循环来处理并发请求。这意味着你可以很容易地处理大量并发连接,而无需为每个连接创建新的线程或进程。然而,如果你的服务器执行 CPU 密集型任务,你可能需要考虑使用集群(clustering)或子进程(child processes)来分散负载。

3. 使用流(Streams)

对于大文件或数据流,使用 Node.js 的流 API 可以提高性能和资源利用率。流允许你以小块的形式处理数据,而不是一次性加载整个数据到内存中。

4. 缓存静态资源

如果你的服务器需要处理静态文件(如 HTML、CSS、JavaScript 或图片),考虑使用缓存来减少磁盘 I/O 和网络传输。你可以使用内存缓存(如 Redis)或 CDN(内容分发网络)来实现这一点。

5. 压缩响应数据

使用如 Gzip 或 Brotli 等压缩算法来压缩你的响应数据,可以减少网络传输的开销,从而加快页面加载速度。

6. 优化数据库访问

如果你的服务器需要与数据库交互,确保你的数据库查询是优化的,并考虑使用连接池来减少连接和断开连接的开销。

7. 错误处理和日志记录

实现健壮的错误处理机制,并记录所有重要的操作和错误。这有助于你监控服务器的运行状态,并在出现问题时快速定位和解决。

8. 使用性能分析工具

使用 Node.js 的性能分析工具(如 Node.js 内置的 perf_hooks 模块或第三方工具如 New Relic、Datadog 等)来监控和分析你的服务器性能。这可以帮助你发现瓶颈并进行优化。

示例代码

下面是一个简单的 Node.js HTTP 服务器示例,它使用了异步编程和流来处理请求和响应:

const http = require('http');
const fs = require('fs');
const zlib = require('zlib');const server = http.createServer(async (req, res) => {try {// 根据请求路径处理不同的逻辑if (req.url === '/large-file') {// 使用流来处理大文件const fileStream = fs.createReadStream('path/to/large-file');const gzip = zlib.createGzip();res.writeHead(200, {'Content-Type': 'application/octet-stream','Content-Encoding': 'gzip'});fileStream.pipe(gzip).pipe(res);} else {// 处理其他请求...res.end('Hello, World!');}} catch (error) {console.error('Error handling request:', error);res.statusCode = 500;res.end('Internal Server Error');}
});const port = 3000;
server.listen(port, () => {console.log(`Server running at http://localhost:${port}/`);
});

在这个示例中,我们使用了 Node.js 的 fszlib 模块来处理文件流和压缩。当请求 /large-file 时,服务器会读取一个大文件,并通过管道将其传递给 gzip 压缩流,然后再将压缩后的数据发送给客户端。这种方式可以有效地处理大文件,并减少网络传输的开销。

连接数据库

Node.js 可以通过各种数据库驱动程序或 ORM(对象关系映射)工具来操作数据库。以下是一些常见的数据库操作方式以及对应的 Node.js 库:

1. MongoDB

对于 MongoDB,你可以使用官方的 MongoDB Node.js 驱动程序。以下是一个简单的例子:

首先,安装 MongoDB 驱动程序:

npm install mongodb

然后,编写代码连接到 MongoDB 数据库并执行操作:

const { MongoClient } = require('mongodb');const uri = "mongodb+srv://<username>:<password>@cluster0.mongodb.net/test?retryWrites=true&w=majority";
const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });client.connect(err => {assert.equal(null, err);console.log("Connected successfully to server");const db = client.db("mydb");const collection = db.collection("customers");// 执行数据库操作...client.close();
});
2. MySQL

对于 MySQL,你可以使用 mysqlmysql2 库。以下是一个使用 mysql2 的例子:

首先,安装 mysql2

npm install mysql2

然后,编写代码连接到 MySQL 数据库并执行操作:

const mysql = require('mysql2');
const connection = mysql.createConnection({host: 'localhost',user: 'me',password: 'secret',database: 'my_db'
});connection.connect();connection.query('SELECT * FROM `users` WHERE `id` = ?', [1], function (error, results, fields) {if (error) throw error;// ...
});connection.end();
3. PostgreSQL

对于 PostgreSQL,你可以使用 pg(以前称为 node-postgres)库。以下是一个简单的例子:

首先,安装 pg

npm install pg

然后,编写代码连接到 PostgreSQL 数据库并执行操作:

const { Pool } = require('pg');const pool = new Pool({user: 'username',host: 'localhost',database: 'mydb',password: 'password',port: 5432,
});pool.query('SELECT * FROM users', (err, res) => {if (err) {console.error('Error executing query', err);return;}console.log(res.rows); // 输出查询结果pool.end();
});
4. 使用 ORM

除了直接使用数据库驱动程序之外,你还可以使用 ORM(对象关系映射)工具,如 Sequelize(支持多种数据库)、TypeORM(用于 TypeScript 和 JavaScript 的 ORM)、Mongoose(用于 MongoDB 的 ORM)等。这些工具提供了一种更高级、更面向对象的方式来操作数据库。

以下是一个使用 Sequelize 的简单例子:

首先,安装 Sequelize 和对应的数据库驱动:

npm install sequelize
npm install pg pg-hstore # PostgreSQL 需要这些包
# 或者对于其他数据库,安装相应的包

然后,定义模型并执行操作:

const { Sequelize } = require('sequelize');  const sequelize = new Sequelize('database', 'username', 'password', {  host: 'localhost',  dialect: 'postgres', // 根据你的数据库类型选择 'mysql' | 'mariadb' | 'postgres' | 'mssql' 等  pool: {  max: 10, // 连接池中的最大连接数  min: 0, // 连接池中的最小连接数  acquire: 30000, // 连接获取超时时间(毫秒)  idle: 10000 // 连接空闲超时时间(毫秒)  }  
});  // 定义模型...  
const User = sequelize.define('user', {  // 模型字段定义  
});  // 同步模型到数据库(注意:在生产环境中,通常不会使用 { force: true },因为它会删除现有表)  
User.sync()  .then(() => {  // 执行数据库操作...  return User.findAll(); // 举例:查询所有用户  })  .then(users => {  // 处理查询结果...  console.log(users);  })  .catch(error => {  // 处理错误...  console.error('Error occurred:', error);  });

ORM 工具提供了丰富的 API 来定义模型关系、执行查询、更新和删除操作等,使得数据库操作更加便捷和直观。

注意,我们上面使用了连接池,使用连接池(connection pooling)是非常重要的,因为它可以显著提高性能和稳定性。连接池通过复用和共享数据库连接,避免了频繁地创建和销毁连接的开销,从而提高了应用程序的响应速度。同时,连接池还可以管理连接的生命周期,确保连接的稳定性和安全性

还有很多的功能,受限于篇幅我们就不一一介绍了,后续可能会出相应的专栏,结合实际项目来给大家呈现更贴近与实际生产开发的结果。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小米公司研发岗的年终奖。。

小米 好的公司有年终且在年前发放&#xff0c;一般的公司有&#xff08;可能打折的&#xff09;年终且年后分批发放&#xff0c;不好的公司各有操作。 3 月已来&#xff0c;小米的年终也开始热议起来。 最近&#xff0c;一则「传小米年终打折&#xff0c;14薪能保住吗」冲上热搜…

修改dataV-vue3 中的组件 装饰5 decoration5 的动画重复次数

dataV-vue3 文档 装饰 5 是一个具有动画效果的 背景线框 但是开发者 没有给我们 提供 动画重复次数的 配置项&#xff0c;只提供了单次动画时长&#xff0c;如果把单词动画时长设置的很长&#xff0c;动画的延展速度也会跟着变得很慢&#xff0c;不符合预期。 使用开发者工具…

学习vue3第五节(reactive 及其相关)

1、定义 reactive() 创建一个响应式代理对象&#xff0c;不同于ref()可以创建任意类型的数据&#xff0c;而reactive()只能是对象&#xff0c;会响应式的深层次解包任何属性&#xff0c;将其标注为响应式 响应式是基于ES6的proxy实现的代理对象&#xff0c;该proxy对象与原对象…

rtthread stm32h743的使用(七)dac设备使用

我们要在rtthread studio 开发环境中建立stm32h743xih6芯片的工程。我们使用一块stm32h743及fpga的核心板完成相关实验&#xff0c;核心板如图&#xff1a; 1.我们还是先建立工程 2.生成工程后打开mx进行配置&#xff0c;时钟配置如前所讲&#xff0c;不在赘述 3.更改mx文件…

Vue3全家桶 - Vue3 - 【8】模板引用【ref】(访问模板引用 + v-for中的模板引用 + 组件上的ref)

模板引用【ref】 Vue3官网-模板引用&#xff1b;如果我们需要直接访问组件中的底层DOM元素&#xff0c;可使用vue提供特殊的ref属性来访问&#xff1b; 一、 访问模板引用 在视图元素上采用ref属性来设置需要访问的DOM元素&#xff1a; 该 ref 属性可采用 字符串 值的执行设…

浏览器的工作原理

从输入一个url到页面加载完成&#xff0c;中间都发生了什么&#xff1f; 参考原文地址 首先在浏览器地址栏输入一个地址并回车之后&#xff0c; 1. DNS查找 浏览器会进行DNS查找&#xff0c;把域名https://example.com转化为真实的IP地址10.29.33.xx&#xff0c;根据IP地址找…

Linux——权限的理解

Linux——权限的理解 文章目录 Linux——权限的理解一、shell命令以及运行原理二、Linux权限的概念切换用户对指令提权 三、Linux权限管理1. 文件访问者的分类&#xff08;人&#xff09;2. 文件类型和访问权限&#xff08;事物属性&#xff09;文件类型基本权限文件权限值的表…

Flutter第四弹:Flutter图形渲染性能

目标&#xff1a; 1&#xff09;Flutter图形渲染性能能够媲美原生&#xff1f; 2&#xff09;Flutter性能优于React Native? 一、Flutter图形渲染原理 1.1 Flutter图形渲染原理 Flutter直接调用Skia。 Flutter不使用WebView&#xff0c;也不使用操作系统的原生控件,而是…

【Web】浅聊XStream反序列化本源之恶意动态代理注入

目录 简介 原理 复现 具体分析之前 我们反序列化了个什么&#xff1f; XStream反序列化的朴素通识 具体分析 第一步&#xff1a;unmarshal解组 第二步&#xff1a;readClassType获取动态代理类的Class对象 第三步&#xff1a;调用convertAnother对动态代理类进行实例…

十六、接口隔离原则、反射、依赖注入

接口隔离原则、反射、特性、依赖注入 接口隔离原则 客户端不应该依赖它不需要的接口&#xff1b;一个类对另一个类的依赖应该建立在最小的接口上。 五种原则当中的i 上一章中的接口&#xff0c;即契约。 契约就是在说两件事&#xff0c;甲方说自己不会多要&#xff0c;乙方会在…

AWS 入门实践-远程访问AWS EC2 Linux虚拟机

远程访问AWS EC2 Linux虚拟机是AWS云计算服务中的一个基本且重要的技能。本指南旨在为初学者提供一系列步骤&#xff0c;以便成功地设置并远程访问他们的EC2 Linux实例。包括如何上传下载文件、如何ssh远程登录EC2虚拟机。 一、创建一个AWS EC2 Linux 虚拟机 创建一个Amazon…

HBuilder发行微信小程序

首先需要完善mainifest.json中的基本配置 这个需要组测dcloud才可以获取&#xff0c;注册后点击重新获取就可以。 然后发行前还需要完成dcloud的信息&#xff0c;这个他会给你网址 点击连接完成信息填写就可以了 然后就可以发行了。 发行成功后会自动跳转微信小程序&#xff…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的木材表面缺陷检测系统(深度学习+Python代码+UI界面+训练数据集)

摘要&#xff1a;开发高效的木材表面缺陷检测系统对于提升木材加工行业的质量控制和生产效率至关重要。本篇博客详细介绍了如何运用深度学习技术构建一个木材表面缺陷检测系统&#xff0c;并提供了完整的实现代码。该系统采用了强大的YOLOv8算法&#xff0c;并对YOLOv7、YOLOv6…

LeetCode101题:对称二叉树(python3)

对称二叉树定义&#xff1a; 对于树中 任意两个对称节点 L 和 R &#xff0c;一定有&#xff1a; L.val R.val &#xff1a;即此两对称节点值相等。 L.left.val R.right.val &#xff1a;即 L的 左子节点 和 R 的 右子节点 对称。 L.right.val R.left.val &#xff1a;即 L…

微服务之商城系统

文章目录 一、商城系统建立之前的一些配置1、nacos2、Mysql3、consul【暂时不使用consul注册服务】这个可以跳过4、redis 二、grpc环境搭建三、微服务架构使用的protobuf1、查看proto的版本号2、安装protoc-gen-go和protoc-gen-go-grpc3、生成protobuff以及grpc的文件 一、商城…

EMQX+InfluxDB+Grafana 构建物联网可视化平台

EMQXInfluxDBGrafana 构建物联网可视化平台 本文以常见物联网使用场景为例&#xff0c;介绍了如何利用 EMQ X MQTT 服务器 InfluxDB Grafana 构建物联网数据可视化平台&#xff0c;将物联网设备上传的时序数据便捷地展现出来。 在物联网项目中接入平台的设备数据和数据存储…

Hadoop生态选择(一)

一、项目框架 1.1技术选型 技术选型主要考虑因素:维护成本、总成本预算、数据量大小、业务需求、行业内经验、技术成熟度。 数据采集传输:Flume&#xff0c;Kafka&#xff0c;DataX&#xff0c;Maxwell&#xff0c;Sqoop&#xff0c;Logstash数据存储:MySQL&#xff0c;HDFS…

设计模式-行为型模式-迭代器模式

迭代器模式&#xff08;Iterator&#xff09;&#xff0c;提供一种方法顺序访问一个聚合对象中各个元素&#xff0c;而又不暴露该对象的内部表示。[DP] 首先&#xff0c;定义一个接口Iterator&#xff0c;它包含了遍历聚合对象所需的方法&#xff1a; public interface Iterato…

Linux Docker安装redis缓存数据库

文章目录 一、查找Redis镜像二、拉取redis镜像三、创建数据目录和配置文件四、创建redis容器 一、查找Redis镜像 首先到docker镜像仓库下载redis镜像。地址&#xff1a;https://hub.docker.com/搜索redis&#xff0c;如下&#xff1a;找到对应想要下载的版本&#xff1a; 二、…

openAI key 与ChatGPTPlus的关系,如何升级ChatGPTPLus

一、前言 先详细介绍一下Plus会员和Open API之间的区别&#xff1a; 实际上&#xff0c;这两者是相互独立的。举例来说&#xff0c;虽然您开通了Plus会员&#xff0c;并不意味着您就可以使用4.0版本的API。尽管这两个账户可以是同一个&#xff0c;但它们是完全独立的平台。 …