Node.js入门

文章目录

Node.js基础概念

Node.js 是一个基于 Chrome V8 JavaScript 引擎构建的 JavaScript 运行时环境。简单来说,Node.js 让JavaScript可以在服务器端运行,而不仅仅局限于浏览器中。

工作机制

Node.js 通过 V8 引擎执行 JavaScript 代码,使用 Node.js API 与操作系统交互,并通过 Libuv 处理异步 I/O 操作。事件循环和工作线程确保了 Node.js 的高效和非阻塞特性。

核心特点

  • 单线程:Node.js 使用单线程处理请求
  • 事件循环:通过事件驱动机制处理并发
  • 非阻塞 I/O:I/O 操作不会阻塞主线程
  • 跨平台:可以在 Windows、Linux、macOS 等系统上运行

事件循环是 Node.js 处理非阻塞 I/O 操作的核心机制,使得单线程能够高效处理多个并发请求。

Node.js 是基于单线程的 JavaScript 运行时,利用事件循环来处理异步操作,如文件读取、网络请求和数据库查询。

事件循环使得 Node.js 能够非阻塞地运行代码、处理多个连接、以及执行异步 I/O 操作。

事件循环使得 Node.js 能够处理大量并发的 I/O 操作而不会导致线程阻塞,这是 Node.js 高效处理并发请求的关键。

NVM

nvm(Node Version Manager)是一个非常有用的工具,可以让您在同一台机器上安装和管理多个 Node.js 版本。

下载地址:https://nvm.uihtm.com

常用命令

shell 复制代码
# 查看 nvm 版本
nvm --version

# 列出所有可安装的 Node.js 版本
nvm list-remote
# Windows 上使用
nvm list available

# 安装最新的 LTS 版本
nvm install --lts

# 安装特定版本
nvm install 18.17.0
nvm install 16.20.1

# 列出已安装的版本
nvm list
# 或
nvm ls

# 切换到特定版本
nvm use 18.17.0

# 设置默认版本
nvm alias default 18.17.0

# 查看当前使用的版本
nvm current

# 卸载特定版本
nvm uninstall 16.20.1

Node.js可以做什么

Node.js 作为一个 JavaScript 的运行环境,提供了基础的模块功能,但基于 Node.js 提供的基础能,产生了很多强大的工具和框架,例如:

模块化

CommonJS标准

CommonJS 是 Node.js 最早也是最广泛使用的模块系统,它采用同步加载的方式,这意味着模块在加载时会阻塞程序的执行,直到加载完成。一般应用在 Node.js 项目环境中。

在 CommonJS 中,你使用 require() 函数来导入模块,使用 module.exports 或 exports 对象来导出模块。

导出方式:module.exports = {}

javascript 复制代码
// math.js
function add(a, b) {
  return a + b;
}

module.exports = { add };
// 或者:exports.add = add;

导入方式:require('模块名或路径')

javascript 复制代码
// app.js
const math = require('./math.js');
console.log(math.add(2, 3)); // 5

ECMAScript标准

ESM是 JavaScript 官方的模块标准,它采用异步加载,并且是浏览器和现代 Node.js 应用的首选。一般应用在前端工程化项目中。

启用 ESM:要在 Node.js 中使用 ESM,你需要在 package.json 文件中添加 "type": "module",或者将文件扩展名更改为 .mjs。

在 ESM 中,你使用 import 语句来导入模块,使用 export 语句来导出模块。

导出方式:默认export default {},或export 修饰定义语句

javascript 复制代码
// math.mjs
export function add(a, b) {
  return a + b;
}

export default function multiply(a, b) {
  return a * b;
}

导入方式:默认import 变量名 from '模块名或路径',或 import { 同名变量} from '模块名或路径'

javascript 复制代码
// app.mjs
import multiply, { add } from './math.mjs';

console.log(add(2, 3));      // 5
console.log(multiply(2, 3)); // 6

包与npm

包是将模块,代码,其他资料聚合成一个文件夹

要求根目录中,必须有package.json 文件,导入软件包时,引入的默认是index.js 模块文件,或者 main 属性指定的模块文件

npm是Node.js的标准软件包管理器

shell 复制代码
# 初始化清单文件(得到package.json 文件,有则略过此命令)
npm init -y

# 下载软件包,下载的包会存放当前项目下的node_modules中,并记录在package.json 中
npm i 软件包名称

# 全局软件包
# 本地软件包:作用在当前项目,一般封装的属性/方法,供项目调用编写业务需求
# 全局软件包:作用在所有项目,一般封装的命令/工具,支撑项目运行
npm i 软件包名称 -g

# 删除软件包
npm uni 软件包名

内置模块

内置模块详细参考官方API文档:https://nodejs.cn/api/documentation.html

fs (文件系统模块)

fs 模块提供了与文件系统交互的 API,支持同步和异步两种操作方式。

javascript 复制代码
const fs = require('fs');

// 异步读取文件
fs.readFile('example.txt', 'utf8', (err, data) => {
  if (err) throw err;
  console.log(data);
});

// 同步写入文件
try {
  fs.writeFileSync('output.txt', 'Hello Node.js');
  console.log('文件写入成功');
} catch (err) {
  console.error(err);
}

path (路径模块)

path 模块提供处理文件和目录路径的工具函数,可以跨平台使用。

javascript 复制代码
const path = require('path');

const fullPath = path.join(__dirname, 'files', 'example.txt');
console.log(fullPath); // 输出类似: /home/user/project/files/example.txt

const ext = path.extname('index.html');
console.log(ext); // 输出: .html

http (HTTP 模块)

http 模块允许 Node.js 作为 HTTP 服务器或客户端运行。

javasript 复制代码
const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello Node.js Server');
});

server.listen(3000, () => {
  console.log('Server running at http://localhost:3000/');
});

events (事件模块)

events 模块提供了事件驱动的编程接口,是 Node.js 异步编程的基础。

javascript 复制代码
const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

// 监听事件
myEmitter.on('event', () => {
  console.log('事件被触发!');
});

// 触发事件
myEmitter.emit('event');

os (操作系统模块)

os 模块提供与操作系统相关的实用方法和属性。

javascript 复制代码
const os = require('os');

console.log(os.platform()); // 操作系统平台
console.log(os.totalmem()); // 系统总内存
console.log(os.freemem()); // 系统可用内存
console.log(os.cpus()); // CPU 信息
相关推荐
嫂子的姐夫3 小时前
23-MD5+DES+Webpack:考试宝
java·爬虫·python·webpack·node.js·逆向
y***54883 小时前
前端构建工具扩展,Webpack插件开发
前端·webpack·node.js
4***14903 小时前
前端构建工具多页面配置,Webpack与Vite
前端·webpack·node.js
zhousenshan6 小时前
node语法特性详解
node.js
是Yu欸7 小时前
仓颉迁移实战:将 Node.js 微服务移植到 Cangjie 的工程化评测
微服务·云原生·开源·node.js·vim·gitcode·cangjie
菩提树下的凡夫8 小时前
Node.js+Vue的学习笔记
笔记·学习·node.js
好奇的菜鸟10 小时前
解决 npm 依赖版本冲突:从 “unable to resolve dependency tree“ 到依赖管理高手
前端·npm·node.js
百***353311 小时前
node.js内置模块之---crypto 模块
node.js
xiaoxue..13 小时前
深入理解 JavaScript 异步编程:从单线程到 Promise 的完整指南
前端·javascript·面试·node.js