Nodejs-HardCore: 模块管理与I/O操作详解

模块管理

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();

基准测试结果解读:

  1. 使用 console.time/timeEnd 进行简单性能测量
  2. 使用 benchmark 模块进行更精确的对比测试
  3. 结合 microtime 获取微秒级精度
  4. 注意避免在测试中包含不相关操作
  5. 多次运行取平均值更准确

总结

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应用程序

相关推荐
菩提树下的凡夫2 小时前
如何将python的程序py文件转换为exe程序
开发语言·python
萧曵 丶2 小时前
Java 安全的单例模式详解
java·开发语言·单例模式
superman超哥2 小时前
Rust 错误处理模式:Result、?运算符与 anyhow 的最佳实践
开发语言·后端·rust·运算符·anyhow·rust 错误处理
lly2024062 小时前
Web 品质样式表
开发语言
微爱帮监所写信寄信2 小时前
微爱帮监狱寄信写信小程序PHP底层优化框架
java·开发语言·数据库·spring·微信·php·mybatis
lly2024062 小时前
R 语言注释指南
开发语言
bigHead-2 小时前
前端双屏显示与通信
开发语言·前端·javascript
richxu202510012 小时前
Java是当今最优雅的开发语言
java·开发语言