
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,开发出各种实用的应用程序。