Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,让 JavaScript 可以在服务器端运行。它采用事件驱动、非阻塞 I/O 模型,使其轻量又高效。Node.js 的包管理器 npm,是全球最大的开源库生态系统之一,为开发者提供了丰富的工具和库,极大地提高了开发效率。
Node.js 非常适合构建 Web 服务器,许多知名网站和应用都使用 Node.js 作为后端服务。例如,Netflix 使用 Node.js 处理视频流的元数据,LinkedIn 利用 Node.js 构建实时聊天系统。
以下是一个简单的 Node.js Web 服务器示例:
const http = require('http');
// 创建一个 HTTP 服务器
const server = http.createServer((req, res) => {
// 设置响应头
res.writeHead(200, { 'Content-Type': 'text/plain' });
// 发送响应内容
res.end('Hello, World!\n');
});
// 监听 3000 端口
const port = 3000;
server.listen(port, () => {
console.log(`Server running at http://localhost:${port}/`);
});
http
模块是 Node.js 内置的用于创建 HTTP 服务器和客户端的模块。http.createServer()
方法创建一个 HTTP 服务器实例,接收一个回调函数作为参数,该回调函数在每次接收到请求时被调用。res.writeHead()
方法设置响应头,这里设置状态码为 200,表示请求成功,内容类型为纯文本。res.end()
方法结束响应并发送响应内容。server.listen()
方法监听指定的端口,启动服务器。Node.js 可以用来创建功能强大的命令行工具,例如 ESLint 是一个用 Node.js 编写的 JavaScript 代码检查工具,帮助开发者发现和修复代码中的错误和潜在问题。
以下是一个简单的 Node.js 命令行工具示例,用于计算两个数的和:
#!/usr/bin/env node
// 获取命令行参数
const args = process.argv.slice(2);
// 检查参数数量
if (args.length!== 2) {
console.error('Usage: node sum.js <num1> <num2>');
process.exit(1);
}
// 将参数转换为数字
const num1 = parseFloat(args[0]);
const num2 = parseFloat(args[1]);
// 检查参数是否为有效数字
if (isNaN(num1) || isNaN(num2)) {
console.error('Both arguments must be valid numbers.');
process.exit(1);
}
// 计算和并输出结果
const sum = num1 + num2;
console.log(`The sum of ${num1} and ${num2} is ${sum}.`);
#!/usr/bin/env node
是一个 shebang 行,用于指定脚本的解释器为 Node.js。process.argv
是一个数组,包含了命令行参数,slice(2)
方法用于截取除了前两个参数(node
命令和脚本文件名)之外的参数。parseFloat()
方法将参数转换为浮点数。isNaN()
方法用于检查参数是否为有效数字。Node.js 的事件驱动和异步 I/O 特性使其非常适合构建实时应用,如聊天应用、在线游戏等。Socket.IO 是一个基于 Node.js 的实时通信库,它封装了 WebSocket 协议,提供了跨浏览器和设备的实时通信能力。
以下是一个简单的 Socket.IO 聊天应用示例:
服务器端代码(server.js)
const express = require('express');
const app = express();
const http = require('http').Server(app);
const io = require('socket.io')(http);
// 静态文件服务
app.use(express.static(__dirname + '/public'));
// 监听连接事件
io.on('connection', (socket) => {
console.log('A user connected');
// 监听消息事件
socket.on('chat message', (msg) => {
// 广播消息给所有连接的客户端
io.emit('chat message', msg);
});
// 监听断开连接事件
socket.on('disconnect', () => {
console.log('A user disconnected');
});
});
const port = 3000;
http.listen(port, () => {
console.log(`Server running at http://localhost:${port}/`);
});
客户端代码(public/index.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Chat App</title>
<style>
#messages { list-style-type: none; margin: 0; padding: 0; }
#messages li { padding: 5px 10px; }
#messages li:nth-child(odd) { background: #eee; }
</style>
</head>
<body>
<ul id="messages"></ul>
<form id="form" action="">
<input id="input" autocomplete="off" /><button>Send</button>
</form>
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io();
var form = document.getElementById('form');
var input = document.getElementById('input');
form.addEventListener('submit', function(e) {
e.preventDefault();
if (input.value) {
socket.emit('chat message', input.value);
input.value = '';
}
});
socket.on('chat message', function(msg) {
var item = document.createElement('li');
item.textContent = msg;
document.getElementById('messages').appendChild(item);
});
</script>
</body>
</html>
connection
事件,当客户端发送消息时,触发 chat message
事件,服务器将消息广播给所有连接的客户端。io()
方法连接到服务器,当用户提交表单时,发送 chat message
事件,当接收到服务器发送的消息时,将消息显示在页面上。应用场景 | 特点 | 示例代码 |
---|---|---|
Web 服务器 | 轻量高效,适合处理大量并发请求 | 简单的 HTTP 服务器示例 |
命令行工具 | 可以方便地处理命令行参数,实现各种功能 | 计算两个数的和的命令行工具示例 |
实时应用 | 事件驱动和异步 I/O 特性,适合实时通信 | Socket.IO 聊天应用示例 |
Node.js 凭借其独特的特性和丰富的生态系统,在 Web 开发、命令行工具、实时应用等多个领域都有广泛的应用。通过上面的示例代码,你可以快速上手 Node.js,开发出各种实用的应用程序。