这两天没事玩 Nodejs 的 fs 模块,用到了 JSON.stringify
,因为操作的是 package.json
文件,本身是 json
格式,因此就直接用 JSON.stringify
和 JSON.parse
了
需求&问题:
- 自定义某些配置,如
name, author, license
等 - 读取
package.json
文件,取出数据,将配置重新组合(写入个人的配置),再将数据JSON.stringify
写入进去 - 写入后的 数据有个问题,换行回车丢失了,所有配置数据成了一行
当时写的代码其实也很简单:
const fs = require('fs')
const data = fs.readFileSync('../package.json', { encoding: 'utf8'})
const dataObj = JSON.parse(data)
const newData = JSON.stringify({
...dataObj,
name: "Osmond"
})
fs.writeFileSync('../package.test.json', newData, { encoding: 'utf8'})
这样的结果是,虽然 自定义属性 配置写进去了,但是代码格式全丢了,成了一行
{"name":"Osmond","version":"1.0.0","description":"","main":"index.js"}
当时想着有 2 个办法解决:
- 使用模板配置文件:handlebars
- 手动处理字符串,在逗号和括号后加入回车换行符
第一种方法:
需要先定义 .hbs
模板文件
{
"name": "{{name}}",
"version": "1.0.0",
"description": "",
"main": "index.js"
}
实现代码为:
const fs = require('fs')
const sourcePath = './package.test.json.hbs'
const targetPath = './package.output.json'
const handlebars = require('handlebars')
function compile(meta, filePath, templatePath) {
if (fs.existsSync(templatePath)) {
const content = fs.readFileSync(templatePath).toString()
const result = handlebars.compile(content)(meta)
fs.writeFileSync(filePath, result)
console.log(`${filePath} 创建成功`)
}
}
compile({ name: '测试测试'}, targetPath, sourcePath)
第二种方法,写一个正则替换即可。(这里遇到一个问题:Nodejs 中 不支持 String.replaceAll
方法,记录一下)
总感觉一个简单的 读取和写入,不应该这么麻烦的操作。查找资料发现,原来 JSON.stringify
就可以做到:
const newData = JSON.stringify({
...dataObj,
name: "Osmond"
}, null, 2)
我们来重新看它的 API:
JSON.stringify ( value [, replacer] [ , space] )
- replacer: 作为过滤器使用
const test = {a:1, b:2, c:3}
console.log(JSON.stringify(test, ['a', 'b']))
// {"a":1,"b":2}
- space:换行的空格个数
const test = {a:1, b:2, c:3}
console.log(JSON.stringify(test, ['a'], 2))
//{
// "a": 1
//}
至此,如果我要写入格式化的 json 数据,实际只要一行代码:
const newData = JSON.stringify({
...dataObj,
name: "Osmond"
}, null, 2)
Oh, yes! 又 get 到一个新知识了
参考资料:
- JSON.stringify-MDN
- 浅谈 JSON.stringify 方法
- json.stringify()的妙用,json.stringify()与json.parse()的区别
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!