如何在Node.js中通过不同命令行指令运行同文件中的两个函数?
解决ES模块下命令行调用异步函数的问题
问题根源
- 你用了ES模块的
import语法,但同时使用了CommonJS的module.exports——ES模块环境中不存在module对象,因此抛出ReferenceError。 - 改为
export default时,一个模块只能有一个默认导出,第二个export default会覆盖第一个,导致只能调用单个函数;且你没有处理命令行参数触发对应函数的逻辑,执行时仅加载文件,不会自动调用目标函数。
解决方案
1. 明确项目为ES模块
在项目根目录的package.json中添加"type": "module",告诉Node.js按ES模块规则处理文件:
{ "type": "module", "scripts": { "replace": "node replacePaths.js replace", "revert": "node replacePaths.js revert" } }
2. 修改replacePaths.js,添加命令行触发逻辑
用命名导出两个函数,并通过process.argv读取命令行参数,调用对应函数:
// replacePaths.js import { replaceInFile } from 'replace-in-file'; async function replace() { const options = { files: 'src/**/*.jsx', from: 'dev/svgs/icons-main.svg', to: 'staging/media/svgs/icons-main.svg', }; try { const results = await replaceInFile(options); console.log('替换完成:', results); } catch (error) { console.error('替换出错:', error); } } async function revert() { const options = { files: 'src/**/*.jsx', from: 'staging/media/svgs/icons-main.svg', to: 'dev/svgs/icons-main.svg', }; try { const results = await replaceInFile(options); console.log('还原完成:', results); } catch (error) { console.error('还原出错:', error); } } // 读取命令行参数,执行对应函数 const command = process.argv[2]; if (command === 'replace') { replace(); } else if (command === 'revert') { revert(); } else { console.error('无效命令,请使用 replace 或 revert'); } // 命名导出(供其他模块引用,可选) export { replace, revert };
3. 执行命令
现在可以正常运行:
npm run replace npm run revert
补充说明
process.argv是Node.js的命令行参数数组:process.argv[0]是node程序路径,process.argv[1]是当前执行的文件路径,process.argv[2]就是你传入的replace/revert指令。- 异步函数内部已通过
try/catch处理错误,直接调用即可,无需额外捕获。
内容的提问来源于stack exchange,提问作者MeltingDog
相关产品推荐
相关产品推荐

