当前位置: 首页 > news >正文

第五部分:第一节 - Node.js 简介与环境:让 JavaScript 走进厨房

我们之前学习的 JavaScript 主要运行在浏览器中,由浏览器内置的 JavaScript 引擎(如 Chrome 的 V8 引擎)来解释执行。Node.js 则是一个JavaScript 运行时环境,它也使用了 Chrome 的 V8 引擎,但它不是在浏览器里,而是在服务器端或者你的本地计算机上运行。这意味着,你可以使用你熟悉的 JavaScript 语言来编写服务器端的代码了!

为什么选择 Node.js 做后端?

Node.js 的设计哲学是事件驱动 (Event-driven)非阻塞 I/O (Non-blocking I/O)

想象一下餐厅厨房:

  • 阻塞 I/O (Blocking I/O) 就像一个厨师在准备一道需要炖 2 小时的菜。在炖的过程中,这个厨师就不能去做其他任何事情,只能干等着。
  • 非阻塞 I/O (Non-blocking I/O) 就像厨师把菜放进炖锅,然后立即转身去切菜、炒别的菜,当炖锅里的菜好了,计时器会发出事件通知,厨师再去处理。

Node.js 的非阻塞 I/O 使得它在处理大量并发请求时表现出色。它不会因为等待某个耗时操作(比如读取文件、查询数据库、网络请求)而阻塞整个进程,而是通过事件循环 (Event Loop) 在后台处理这些操作,并在完成后触发回调函数(事件),这样就可以同时处理更多的“订单”。这使得 Node.js 非常适合构建高并发的网络应用。

此外,Node.js 和前端使用同一种语言,可以方便地共享代码和开发者资源,这是全栈 JavaScript 的一大优势。

安装 Node.js:

请访问 Node.js 官方网站 (https://nodejs.org/) 下载并安装适合你操作系统的版本。安装 Node.js 会同时安装 npm (Node Package Manager) 包管理器。如果你倾向使用 yarn,可以单独安装 yarn (npm install -g yarn)。

npm/yarn 包管理器与 package.json:

我们之前在前端已经接触过 npm/yarn,用来安装和管理前端库。在 Node.js 项目中,它们同样是管理第三方依赖(比如 Express 框架、数据库驱动等)的核心工具。

package.json 文件是 Node.js 项目的“身份证”和“项目配置清单”。它记录了:

  • 项目的名称 (name)、版本 (version)。
  • 项目的描述 (description)。
  • 项目的入口文件 (main)。
  • 项目使用的脚本命令 (scripts),比如启动服务器、运行测试等。
  • 项目依赖的第三方包 (dependencies) 和开发依赖 (devDependencies)。

初始化一个 Node.js 项目:

mkdir my-node-app
cd my-node-app
npm init -y   # 使用 -y 参数跳过交互式提问,快速生成默认的 package.json
# 或者使用 yarn
# yarn init -y

现在你的项目目录下就有了 package.json 文件。
在这里插入图片描述

安装第三方包:

npm install express   # 安装 express 包到 dependencies (生产环境和开发环境都需要)
npm install typescript --save-dev # 安装 typescript 包到 devDependencies (只在开发环境需要,编译用)
# 或者使用 yarn
# yarn add express
# yarn add typescript --dev

安装后,package.json 文件会更新,记录下这些依赖包及其版本。项目目录下会生成一个 node_modules 目录,所有安装的包都在这里。同时会生成 package-lock.json (npm) 或 yarn.lock (yarn),用于锁定依赖版本,确保团队成员安装到完全一致的环境。
在这里插入图片描述

模块系统:CommonJS vs ES Modules:

在 Node.js 发展初期,JavaScript 本身没有模块系统。Node.js 采用了 CommonJS 模块系统,使用 require() 导入模块,使用 module.exportsexports 导出模块。

// CommonJS 导出
// utils.js
const add = (a, b) => a + b;
module.exports = { add };// CommonJS 导入
// main.js
const utils = require('./utils');
console.log(utils.add(1, 2)); // 3

随着 ES6 标准的发布,JavaScript 有了自己的模块系统 ES Modules (import/export)。较新版本的 Node.js (12+) 已经原生支持 ES Modules,可以通过在 package.json 中设置 "type": "module" 或者使用 .mjs 文件后缀来启用。

// ES Modules 导出
// utils.mjs 或者 utils.js (如果 package.json 中设置了 "type": "module")
export const add = (a, b) => a + b;// ES Modules 导入
// main.mjs 或者 main.js (如果 package.json 中设置了 "type": "module")
import { add } from './utils.js'; // 注意:在 Node.js 中使用 ES Modules 导入本地文件需要带上文件扩展名 .js 或 .mjs
console.log(add(1, 2)); // 3

在实际项目中,特别是新项目,推荐使用 ES Modules。如果使用 TypeScript,通常也会配置 TypeScript 编译器生成 ES Modules 代码。

小例子:Hello World Node.js 脚本

创建一个文件 hello.js:

// hello.js
console.log("Hello, Node.js!");

在终端运行:

node hello.js

你会在终端看到输出 “Hello, Node.js!”。恭喜你,你已经成功在服务器端(本地计算机上)运行了第一段 JavaScript 代码。

在这里插入图片描述

小例子:使用 npm 安装和使用第三方包

在你的 my-node-app 项目目录中(确保已经 npm init -y):

npm install lodash

创建一个文件 use-lodash.js:

// use-lodash.js
const _ = require('lodash'); // CommonJS 方式导入 lodashconst numbers = [1, 2, 3, 4, 5];
const sum = _.sum(numbers);console.log("使用 lodash 计算总和:", sum);

运行脚本:

node use-lodash.js

输出应为 “使用 lodash 计算总和: 15”。这展示了如何在 Node.js 中使用 npm 安装和导入第三方库。
在这里插入图片描述

小结: Node.js 使得 JavaScript 可以运行在服务器端,其事件驱动和非阻塞 I/O 的特性使其适合高并发场景。npm/yarn 是 Node.js 项目的包管理器,package.json 是项目配置清单。Node.js 支持 CommonJS 和 ES Modules 两种模块系统,现代项目推荐使用 ES Modules。

练习:

  1. 在一个新的目录中初始化一个 Node.js 项目。
  2. 安装 fs 模块(fs 是 Node.js 的核心模块,无需安装,直接 require 即可)。
  3. 编写一个 Node.js 脚本,使用 fs.readFile() 方法(异步读取文件)读取一个本地文本文件(例如 package.json),并在文件读取完成后,将文件内容打印到控制台。注意处理读取文件可能出现的错误。
  4. 修改上一个脚本,使用 fs.readFileSync() 方法(同步读取文件),比较两种方法的不同(异步是非阻塞的,同步是阻塞的)。

相关文章:

  • 如何优化MCU中断响应时间
  • 【AI面试秘籍】| 第7期:多轮对话如何实现长期记忆?高频考点解析+代码实战
  • 使用腾讯会议远程控制电脑进行操作电脑
  • C语言中的assert
  • 一种基于光源评估并加权平均的自动白平衡方法(二)
  • OpenCV中的光流估计方法详解
  • Kaamel隐私合规洞察:Facebook美容定向广告事件分析
  • 不用联网不用编程,PLC通过智能网关快速实现HTTP协议JSON格式与MES等系统平台双向数据通讯
  • 使用WebStorm打断点调试Vue项目
  • 2025-05-13 学习记录--Python-数据类型转换 + 运算符
  • 乙酰基六肽-39/Silusyne 新型减肥活性肽,减少脂肪堆积
  • 开源免费无广告专注PDF编辑、修复和管理工具 办公学术 救星工具
  • 【完全平方数包含相同数】2021-11-30
  • INFINI Console 纳管 Elasticsearch 9(一):指标监控、数据管理、DSL 语句执行
  • css iconfont图标样式修改,js 点击后更改样式
  • servlet-api
  • C++中的各式类型转换
  • vr视频制作攻略(VR视频制作基础知识)
  • PNG图片转icon图标Python脚本(简易版) - 随笔
  • 43、Server.UrlEncode、HttpUtility.UrlDecode的区别?
  • 今年前4个月上海对拉美国家进出口总值增长2%
  • 加拿大总理宣布新内阁名单
  • 地下5300米开辟“人造气路”,我国页岩气井垂深纪录再刷新
  • 新华时评:中美经贸会谈为全球经济纾压增信
  • 西藏日喀则市拉孜县发生5.5级地震,震感明显部分人被晃醒
  • 中美经贸中方牵头人、国务院副总理何立峰出席新闻发布会表示:中美达成重要共识,会谈取得实质性进展