模块管理
1 ) 安装与加载模块
javascript
// 通过require加载内置模块
const fs = require('fs');
// 加载第三方模块(需先安装)
// npm install lodash
const _ = require('lodash');
// 加载本地模块
const myModule = require('./myModule');
关键点:
- Node.js 使用 CommonJS 模块系统
- 内置模块无需安装,直接通过名称加载
- 第三方模块需通过 npm install 安装
- 本地模块使用相对路径(./ 或 .../)或绝对路径加载
2 ) 创建与管理模块
javascript
// myModule.js - 创建模块
const privateVar = '内部变量';
function privateFunction() {
return '私有函数';
}
// 导出单个函数
exports.publicFunction = () => {
return '公共函数:' + privateFunction();
};
// 导出对象
module.exports = {
version: '1.0',
author: 'Node开发者',
getInfo: () => '模块信息'
};
// 主文件 - 使用模块
const myMod = require('./myModule');
console.log(myMod.publicFunction()); // 公共函数:私有函数
console.log(myMod.version); // 1.0
模块缓存机制
javascript
// 第一次加载
const mod1 = require('./myModule');
// 第二次加载 - 从缓存获取
const mod2 = require('./myModule');
console.log(mod1 === mod2); // true
// 强制卸载模块
delete require.cache[require.resolve('./myModule')];
// 重新加载
const mod3 = require('./myModule');
console.log(mod1 === mod3); // false
3 ) 加载一组相关模块
javascript
// group/index.js - 聚合模块
module.exports = {
moduleA: require('./moduleA'),
moduleB: require('./moduleB')
};
// group/moduleA.js
module.exports = () => '模块A功能';
// group/moduleB.js
module.exports = () => '模块B功能';
// 主文件 - 加载组模块
const group = require('./group');
console.log(group.moduleA()); // 模块A功能
console.log(group.moduleB()); // 模块B功能
使用package.json组织:
json
// group/package.json
{
"name": "module-group",
"main": "index.js"
}
4 ) 使用路径
javascript
// 获取当前文件路径
console.log('当前目录:', dirname);
console.log('当前文件:', filename);
// 路径拼接
const path = require('path');
const fullPath = path.join(dirname, 'data', 'file.txt');
console.log('完整路径:', fullPath);
// 解析路径
const parsedPath = path.parse(filename);
console.log('路径解析:', parsedPath);
/*
{
root: '/',
dir: '/Users/project',
base: 'app.js',
ext: '.js',
name: 'app'
}
*/
标准I/O及console对象
1 ) 标准I/O流的读写
javascript
// 设置编码
process.stdin.setEncoding('utf8');
console.log('请输入文本 (Ctrl+D结束):');
// 处理输入数据
process.stdin.on('data', (chunk) => {
const upperText = chunk.toString().toUpperCase();
process.stdout.write(转换结果: ${upperText}\n);
});
// 处理结束信号
process.stdin.on('end', () => {
process.stdout.write('输入结束\n');
});
// 开始读取输入
process.stdin.resume();
执行方式:
bash
# 直接输入
node ioDemo.js
# 管道操作
cat input.txt | node ioDemo.js > output.txt
I/O流流程图:
cat file.txt
process.stdin
数据处理
process.stdout
wc -l
6 ) 打印日志消息
javascript
const user = {
name: 'Alice',
age: 30,
skills: ['Node.js', 'JavaScript']
};
// 基本日志
console.log('普通日志:', user);
// 格式化输出
console.log('姓名: %s, 年龄: %d', user.name, user.age);
console.log('用户对象: %j', user);
// 错误和警告
console.error('错误信息');
console.warn('警告信息');
// 堆栈跟踪
console.trace('当前调用堆栈');
// 表格展示
console.table([
{ name: 'Alice', framework: 'Express' },
{ name: 'Bob', framework: 'Koa' }
]);
// 分组日志
console.group('用户详情');
console.log('姓名:', user.name);
console.log('年龄:', user.age);
console.groupEnd();
输出流关系:
stdin (0): 标准输入流stdout (1): 标准输出流stderr (2): 标准错误流
7 ) 基准测试
javascript
// 简单基准测试
console.time('arrayCreate');
const arr = [];
for (let i = 0; i < 1000000; i++) {
arr.push(i);
}
console.timeEnd('arrayCreate');
// 输出: arrayCreate: 15.432ms
// 复杂基准测试
const benchmark = require('benchmark');
const microtime = require('microtime');
const suite = new benchmark.Suite();
suite.add('字符串连接+', () => {
let str = '';
for (let i = 0; i < 1000; i++) {
str += 'a';
}
})
.add('数组join', () => {
const arr = [];
for (let i = 0; i < 1000; i++) {
arr.push('a');
}
arr.join('');
})
.on('cycle', (event) => {
console.log(String(event.target));
})
.on('complete', function() {
console.log('最快方法: ' + this.filter('fastest').map('name'));
})
.run();
基准测试结果解读:
- 使用 console.time/timeEnd 进行简单性能测量
- 使用 benchmark 模块进行更精确的对比测试
- 结合 microtime 获取微秒级精度
- 注意避免在测试中包含不相关操作
- 多次运行取平均值更准确
总结
Node.js 的模块系统和I/O处理是其核心优势。通过合理使用模块化开发,你可以创建可维护的代码结构;
而掌握标准I/O和console对象,则能有效处理数据流和调试需求。这些技巧共同构成了Node.js高效开发的基础
最佳实践建议
1 ) 使用 path.join() 代替字符串拼接处理路径
2 ) 合理利用模块缓存提升性能
3 ) 对于复杂应用,使用 index.js 组织模块
4 ) 生产环境使用专业日志库(如Winston)
5 ) 重要性能测试应在接近生产的环境中进行
知识扩展:Node.js 14+ 支持ES模块,可使用 import/export 语法,通过在package.json中添加 "type": "module" 启用,或使用 .mjs 扩展名
通过掌握这些核心技巧,你将能够构建更高效、更健壮的Node.js应用程序