Node脚本使用readFileSync二次读取package.json异常问题排查
Node.js脚本更新package.json版本后二次读取内容错乱的解决方法
我编写了一个Node.js脚本用于自动更新package.json中的包版本,流程为读取文件、定位目标包所在行、升级版本号后写入文件。首次运行脚本一切正常,webpack版本从^5.8.0成功升级到^5.8.1,但第二次运行时,fs.readFileSync读取的内容出现错乱,导致脚本崩溃,而package.json文件本身却是完整的。手动修改文件后脚本可再次正常运行一次,但问题依旧复现。
读取文件的核心代码:
const data = fs.readFileSync("./package.json", { encoding: "utf8", });
问题原因
核心问题是直接按行处理JSON文本的方式存在可靠性隐患。JSON属于结构化数据,严格依赖格式规范,按行定位修改的逻辑很容易因为文件格式的微小变化(比如自动格式化后的空格、换行调整,或脚本写入时的格式不一致),导致第二次运行时无法正确定位目标行,进而出现读取内容错乱、脚本崩溃的情况。
解决方案
正确的做法是将package.json解析为JSON对象,修改对应包版本后再重新序列化写入,完全遵循JSON的结构化规范,从根源避免格式相关问题:
步骤1:读取并解析JSON文件
const fs = require('fs'); const path = require('path'); const pkgPath = path.resolve(__dirname, './package.json'); // 读取文件并解析为JSON对象 const pkg = JSON.parse(fs.readFileSync(pkgPath, { encoding: 'utf8' }));
步骤2:修改目标包版本
推荐使用semver包安全升级版本(先执行npm install semver --save-dev安装),避免手动拼接版本号出错:
const semver = require('semver'); // 提取当前版本(去掉^前缀),升级补丁版本 const currentVersion = pkg.devDependencies.webpack.replace('^', ''); pkg.devDependencies.webpack = `^${semver.inc(currentVersion, 'patch')}`;
如果不需要自动计算版本,也可以直接赋值:
pkg.devDependencies.webpack = '^5.8.1';
步骤3:序列化并写入文件
// 保留2空格缩进,保证文件可读性,末尾添加换行符 fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n', { encoding: 'utf8' });
备选方案(不推荐)
如果坚持按行处理,需要确保:
- 写入文件时完全保留原文件的缩进、换行符等格式
- 匹配目标行的正则表达式足够健壮,兼容空格、引号的格式差异
但这种方式仍存在维护风险,不建议使用。
内容的提问来源于stack exchange,提问作者eendkonijn
相关产品推荐
相关产品推荐

