🌟 引言:Node.js不是前端的"私生子"
你以为Node.js只是前端工程师的副业工具?大错特错!这个基于V8引擎的JavaScript运行时,早已成为全栈开发的中流砥柱。今天我们就从一个简单的项目出发,用最接地气的方式聊聊Node.js那些实用技能——从模块化到数据库连接,让你彻底摆脱"只会用npm install"的初级阶段。
📦 模块化:Node.js的"乐高积木"艺术
CommonJS:Node.js的"原配"模块系统
就像每个超级英雄都有起源故事,Node.js的模块化系统也有它的"初恋"——CommonJS。看看我们项目中的module/lib/add.js:
function add(a, b) { return a + b; }
module.exports = { add };
这就是CommonJS的标准写法:用module.exports导出,再用require导入。有趣的是,这种"同步加载"机制曾被前端开发者吐槽像"拨号上网",但在服务器端却恰到好处——毕竟服务器启动时多等几毫秒不算事儿!
ES Modules:模块化的"新欢"
随着ECMAScript标准的推进,Node.js也拥抱了ES Modules。看看module/lib/divi.mjs:
function chu(a, b) { return a / b; }
export default chu;
export function test() { console.log('test'); }
注意文件名后缀是.mjs,这是Node.js识别ES Modules的"暗号"之一。你也可以在package.json中设置"type": "module"来全局启用。这种"import/export"语法是不是让前端同学倍感亲切?
模块混战:如何避免"选择困难症"
项目中同时存在两种模块系统怎么办?记住这个黄金法则:
- 新项目优先用ES Modules(未来趋势)
- 维护老项目就乖乖用CommonJS(别自找麻烦)
- 实在要混用?可以用
import()函数动态加载CommonJS模块
🌐 HTTP服务:Node.js的"看家本领"
Node.js最引以为傲的能力之一就是构建HTTP服务。看看innerModule/http.js中的极简服务器:
const http = require('http');
const server = http.createServer((req, res) => {
res.end('hello http server');
});
server.listen(3000, () => {
console.log('server is listen at http://localhost:3000');
});
仅仅8行代码,一个HTTP服务器就诞生了!这就像用乐高积木搭城堡——简单却强大。不过在实际项目中,我们通常会用Express这样的框架(项目package.json中就有express: ^5.1.0)来简化开发。
🛢️ 数据库连接:Node.js的"数据管家"
没有数据库的后端就像没有灵魂的躯体。项目中的sql/index.js展示了如何用mysql2连接MySQL:
const mysql = require('mysql2');
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '123456',
database: 'demo'
});
connection.query(`select * from user`, (err, data) => {
res.end(JSON.stringify(data));
});
小贴士:实际开发中千万不要把密码硬编码!可以用环境变量或配置文件(记得在.gitignore中排除哦,就像项目中已经做的那样)。
🎮 命令行交互:Node.js的"控制台魔术"
game.js展示了如何通过命令行与Node.js程序交互:
const playerAction = process.argv[process.argv.length - 1];
// 石头剪刀布游戏逻辑...
if (playerAction !== 'rock' && playerAction !== 'paper' && playerAction !== 'scissor') {
console.log('请输入 rock、paper、scissor');
} else {
const arr = ['rock', 'paper', 'scissor']
const index = Math.floor(Math.random() * 3);
const computerAction = arr[index];
console.log('你出的是:' + playerAction);
console.log('电脑出的是:' + computerAction);
if (playerAction === computerAction) {
console.log('平局');
} else if (
(playerAction == 'rock' && computerAction == 'paper') ||
(playerAction == 'paper' && computerAction == 'scissor') ||
(playerAction == 'scissor' && computerAction == 'rock')
) {
console.log('你输了');
} else {
console.log('你赢了');
}
}
通过process.argv获取命令行参数,让你的程序瞬间变身"控制台应用"。这招在写脚本工具时特别有用,比如批量处理文件、自动化部署等。
📝 实用工具:Node.js的"瑞士军刀"
Node.js内置了很多实用模块,比如:
fs:文件系统操作(innerModule/fs.js展示了文件读写)path:路径处理(innerModule/path.js中的path.resolve和path.dirname)buffer:二进制数据处理(innerModule/index.js中的Buffer操作)
这些模块就像瑞士军刀,虽然小巧但功能强大,能解决开发中的各种"小麻烦"。
🚀 进阶之路:从"能用"到"精通"
如果你已经掌握了这些基础,不妨挑战一下:
- 用Express重构HTTP服务器,实现RESTful API
- 尝试用Promise封装数据库操作,避免"回调地狱"
- 探索
cluster模块,让你的Node.js程序利用多核CPU - 学习
stream模块处理大文件,提升性能
💡 结语:Node.js不是银弹,但它是把好枪
Node.js绝非万能药,但在I/O密集型应用(如API服务、实时通讯)中表现出色。通过本文的项目示例,你已经见识了它的模块化系统、HTTP服务构建、数据库连接等核心能力。
记住,最好的学习方式就是动手实践——克隆这个项目,修改代码,打破它,再修复它。毕竟,程序员的成长之路,就是在不断"搞破坏"和"擦屁股"中前进的!