Appearance
Node.js 入门指南
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,它允许我们在服务器端运行 JavaScript 代码。本文将介绍 Node.js 的核心概念和使用方法。
1. 安装 Node.js
Windows
- 访问 Node.js 官网
- 下载 LTS 版本的安装包
- 运行安装程序,按照提示完成安装
- 打开命令提示符,运行
node -v验证安装
macOS
- 访问 Node.js 官网
- 下载 LTS 版本的安装包
- 运行安装程序,按照提示完成安装
- 打开终端,运行
node -v验证安装
Linux
bash
# 使用包管理器安装
# Ubuntu/Debian
sudo apt update
sudo apt install nodejs npm
# CentOS/RHEL
sudo yum install nodejs npm
# 验证安装
node -v
npm -v2. 基本概念
模块系统
Node.js 使用 CommonJS 模块系统。
javascript
// 导出模块
// math.js
function add(a, b) {
return a + b;
}
module.exports = {
add
};
// 导入模块
// app.js
const math = require('./math');
console.log(math.add(1, 2)); // 3包管理
Node.js 使用 npm 作为包管理器。
bash
# 初始化项目
npm init
# 安装包
npm install express
# 安装开发依赖
npm install --save-dev nodemon
# 运行脚本
npm run start事件循环
Node.js 使用事件循环来处理异步操作。
javascript
console.log('Start');
setTimeout(() => {
console.log('Timeout');
}, 0);
console.log('End');
// 输出顺序:Start, End, Timeout3. 核心模块
fs 模块
用于文件系统操作。
javascript
const fs = require('fs');
// 读取文件(同步)
try {
const data = fs.readFileSync('file.txt', 'utf8');
console.log(data);
} catch (err) {
console.error(err);
}
// 读取文件(异步)
fs.readFile('file.txt', 'utf8', (err, data) => {
if (err) {
console.error(err);
return;
}
console.log(data);
});
// 写入文件
fs.writeFile('file.txt', 'Hello Node.js', (err) => {
if (err) {
console.error(err);
return;
}
console.log('File written successfully');
});http 模块
用于创建 HTTP 服务器。
javascript
const http = require('http');
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
});
server.listen(3000, '127.0.0.1', () => {
console.log('Server running at http://127.0.0.1:3000/');
});path 模块
用于处理文件路径。
javascript
const path = require('path');
// 连接路径
const fullPath = path.join(__dirname, 'file.txt');
console.log(fullPath);
// 获取文件名
const fileName = path.basename(fullPath);
console.log(fileName);
// 获取扩展名
const extName = path.extname(fullPath);
console.log(extName);os 模块
用于获取操作系统信息。
javascript
const os = require('os');
// 获取操作系统类型
console.log(os.type());
// 获取操作系统版本
console.log(os.release());
// 获取内存信息
console.log(os.totalmem());
console.log(os.freemem());
// 获取 CPU 信息
console.log(os.cpus());events 模块
用于处理事件。
javascript
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
// 监听事件
myEmitter.on('event', () => {
console.log('An event occurred!');
});
// 触发事件
myEmitter.emit('event');4. 异步编程
回调函数
javascript
function fetchData(callback) {
setTimeout(() => {
callback(null, 'Data fetched successfully');
}, 1000);
}
fetchData((err, data) => {
if (err) {
console.error(err);
return;
}
console.log(data);
});Promise
javascript
function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Data fetched successfully');
}, 1000);
});
}
fetchData()
.then(data => console.log(data))
.catch(err => console.error(err));async/await
javascript
async function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Data fetched successfully');
}, 1000);
});
}
async function main() {
try {
const data = await fetchData();
console.log(data);
} catch (err) {
console.error(err);
}
}
main();5. 文件系统
同步操作
javascript
const fs = require('fs');
// 读取文件
const data = fs.readFileSync('file.txt', 'utf8');
console.log(data);
// 写入文件
fs.writeFileSync('file.txt', 'Hello Node.js');
console.log('File written successfully');
// 追加文件
fs.appendFileSync('file.txt', '\nAppend content');
console.log('File appended successfully');
// 删除文件
fs.unlinkSync('file.txt');
console.log('File deleted successfully');异步操作
javascript
const fs = require('fs');
// 读取文件
fs.readFile('file.txt', 'utf8', (err, data) => {
if (err) {
console.error(err);
return;
}
console.log(data);
});
// 写入文件
fs.writeFile('file.txt', 'Hello Node.js', (err) => {
if (err) {
console.error(err);
return;
}
console.log('File written successfully');
});
// 追加文件
fs.appendFile('file.txt', '\nAppend content', (err) => {
if (err) {
console.error(err);
return;
}
console.log('File appended successfully');
});
// 删除文件
fs.unlink('file.txt', (err) => {
if (err) {
console.error(err);
return;
}
console.log('File deleted successfully');
});6. HTTP 服务器
基本服务器
javascript
const http = require('http');
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
});
server.listen(3000, '127.0.0.1', () => {
console.log('Server running at http://127.0.0.1:3000/');
});处理不同路由
javascript
const http = require('http');
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
if (req.url === '/') {
res.end('Home page\n');
} else if (req.url === '/about') {
res.end('About page\n');
} else {
res.statusCode = 404;
res.end('Not found\n');
}
});
server.listen(3000, '127.0.0.1', () => {
console.log('Server running at http://127.0.0.1:3000/');
});处理 POST 请求
javascript
const http = require('http');
const querystring = require('querystring');
const server = http.createServer((req, res) => {
if (req.method === 'POST' && req.url === '/submit') {
let body = '';
req.on('data', chunk => {
body += chunk.toString();
});
req.on('end', () => {
const data = querystring.parse(body);
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end(`Name: ${data.name}\nEmail: ${data.email}\n`);
});
} else {
res.statusCode = 404;
res.end('Not found\n');
}
});
server.listen(3000, '127.0.0.1', () => {
console.log('Server running at http://127.0.0.1:3000/');
});7. 包管理
package.json
json
{
"name": "my-nodejs-app",
"version": "1.0.0",
"description": "A Node.js application",
"main": "app.js",
"scripts": {
"start": "node app.js",
"dev": "nodemon app.js"
},
"dependencies": {
"express": "^4.17.1"
},
"devDependencies": {
"nodemon": "^2.0.7"
},
"keywords": ["nodejs", "express"],
"author": "Your Name",
"license": "MIT"
}安装依赖
bash
# 安装所有依赖
npm install
# 安装特定依赖
npm install express
# 安装开发依赖
npm install --save-dev nodemon
# 卸载依赖
npm uninstall express运行脚本
bash
# 运行 start 脚本
npm start
# 运行 dev 脚本
npm run dev8. 调试
使用 console
javascript
console.log('Debug message');
console.error('Error message');
console.warn('Warning message');
console.info('Info message');使用 debugger
- 在代码中添加
debugger;语句 - 使用
node --inspect app.js运行应用 - 在 Chrome 中打开
chrome://inspect - 点击 "Open dedicated DevTools for Node"
使用 nodemon
bash
# 安装 nodemon
npm install --save-dev nodemon
# 运行应用
npx nodemon app.js9. 部署
本地部署
bash
# 安装依赖
npm install
# 运行应用
npm start云部署
Heroku
- 安装 Heroku CLI
- 登录 Heroku:
heroku login - 创建 Heroku 应用:
heroku create - 部署代码:
git push heroku master - 打开应用:
heroku open
AWS
- 创建 EC2 实例
- 安装 Node.js
- 上传代码
- 安装依赖
- 运行应用
Docker
dockerfile
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]10. 最佳实践
- 使用 async/await:避免回调地狱
- 错误处理:使用 try/catch 处理错误
- 模块化:将代码拆分为多个模块
- 环境变量:使用 .env 文件存储配置
- 日志记录:使用 winston 或 bunyan 进行日志记录
- 测试:使用 mocha 或 jest 进行测试
- 代码风格:使用 ESLint 和 Prettier
- 版本控制:使用 Git 进行版本控制
- 依赖管理:定期更新依赖
- 安全性:使用 helmet 等安全中间件
11. 常见问题
端口被占用
bash
# 查找占用端口的进程
lsof -i :3000
# 终止进程
kill -9 <PID>依赖冲突
bash
# 清除缓存
npm cache clean --force
# 重新安装依赖
rm -rf node_modules package-lock.json
npm install内存泄漏
- 使用
node --inspect进行调试 - 使用 heapdump 生成堆快照
- 使用 clinic 进行性能分析
12. 总结
Node.js 是一个强大的 JavaScript 运行时环境,它使我们能够在服务器端运行 JavaScript 代码。通过学习 Node.js,我们可以构建高性能的后端应用程序。
Node.js 的核心特性包括:
- 非阻塞 I/O
- 事件驱动
- 单线程
- 跨平台
Node.js 已经成为后端开发的主流技术,许多大型公司都在使用 Node.js 构建他们的应用程序。掌握 Node.js 是现代后端开发者的必备技能。