在上一章中,我们已经成功安装了 Node.js 和 npm。现在,让我们编写第一个 Node.js 程序,从最简单的控制台输出开始,然后创建一个简单的 HTTP 服务器,体验 Node.js 的非阻塞 I/O 和事件驱动特性。
打开你喜欢的编辑器(例如 VS Code、Sublime Text 或记事本),新建一个文件 hello.js,输入以下代码:
// hello.js
console.log("Hello, Node.js!");
保存文件后,打开终端(命令提示符),切换到文件所在目录,然后执行以下命令:
node hello.js
你将看到终端输出:
Hello, Node.js!
console.log 是 Node.js 中的全局函数,用于在控制台打印信息。Node.js 会读取并执行 JavaScript 文件,这与浏览器中的 JavaScript 类似,但这里没有 DOM 环境。
Node.js 也提供了一个交互式编程环境(REPL,Read-Eval-Print Loop),你可以在终端中直接输入 node 命令(不带文件名)进入 REPL 模式,逐行执行 JavaScript 代码:
$ node
> console.log("Hello REPL");
Hello REPL
undefined
> 1 + 2
3
> .exit
在 REPL 中,你可以快速测试简单的代码片段,非常适合学习语法或调试。
Node.js 的强大之处在于构建网络应用。下面我们创建一个最简单的 HTTP 服务器,当用户访问 http://localhost:3000 时返回 "Hello World" 页面。
新建文件 server.js,写入以下代码:
// server.js
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/html' });
res.end('<h1>Hello World</h1>');
});
server.listen(3000, () => {
console.log('服务器已启动,访问地址:http://localhost:3000');
});
运行该服务器:
node server.js
你会看到输出:服务器已启动,访问地址:http://localhost:3000。打开浏览器访问该地址,页面将显示一个大号的 "Hello World"。
require('http'):引入 Node.js 内置的 HTTP 模块,该模块提供了创建服务器和客户端的功能。http.createServer():创建一个服务器实例,参数是一个回调函数,每当有请求到达时就会被调用。回调函数接收两个参数:req(请求对象)和 res(响应对象)。res.writeHead():设置 HTTP 响应头,这里指定状态码 200 和内容类型为 HTML。res.end():发送响应内容并结束响应过程。server.listen(3000, callback):让服务器监听 3000 端口,启动成功后执行回调函数。注意,server.listen() 是异步操作,它不会阻塞后续代码的执行。你可以在它后面添加其他代码,它们会立即执行,而服务器仍在后台运行。为了演示,修改 server.js:
const http = require('http');
const server = http.createServer((req, res) => {
res.end('Hello World');
});
server.listen(3000, () => {
console.log('服务器启动完成');
});
console.log('这行代码会在服务器启动完成前输出');
再次运行,你会先看到 "这行代码会在服务器启动完成前输出",然后才是 "服务器启动完成"。这体现了 Node.js 的非阻塞特性——异步操作的回调会在后续事件循环中执行,不会阻塞主线程。
在第一个 HTTP 服务器例子中,我们使用了 Node.js 内置的 http 模块。你也可以创建自己的模块。例如,创建一个 greet.js 文件:
// greet.js
function sayHello(name) {
return `Hello, ${name}!`;
}
module.exports = sayHello;
然后在 app.js 中引入并使用它:
// app.js
const greet = require('./greet');
console.log(greet('Node.js'));
运行 node app.js 将输出 Hello, Node.js!。
Node.js 内置了调试器,你可以在代码中插入 debugger 语句,然后使用 node inspect 命令启动调试。更简单的方法是使用 Chrome DevTools 进行调试(Node.js 16+ 支持 --inspect 标志)。例如:
node --inspect server.js
然后在 Chrome 浏览器中打开 chrome://inspect,即可连接调试器,像调试前端代码一样设置断点、查看变量。
通过本章,你已经学会了编写并运行第一个 Node.js 程序,包括简单的控制台脚本和 HTTP 服务器。你也初步了解了 Node.js 的异步编程模型和模块系统。在下一章,我们将深入探讨 Node.js 的模块机制和 npm 的使用,为构建更复杂的应用打下基础。