环境:
- node version: 6.10.2
- 操作系统:mac OSX
在Node.js中,使用fs.writeFileSync写一份文件,fs.writeFileSync的用法在 这里
我们本次写入文件的源数据是string,是JSON格式的字符串。写入的数据,JSON是有一定格式的,但是当你打开新写出来的文件,会发现文件只有一行。
下面是详细的例子。
'use strict';
let fs = require('fs');
let data = {
"a": {
"hehe":1,
"haha": 2
},
"b": {
"hihi": 3,
"ohoh": 4
}
};
let baseDir = __dirname;
let opts = {
cwd: baseDir,
encoding: 'utf8',
stdio: [process.stdin, process.stdout, process.stderr]
}
let fileName = baseDir + 'test.js';
fs.writeFileSync(fileName, `'use strict';\n\n module.exports = ${JSON.stringify(data)}`, opts);
打开文件可以看到数据如下:
'use strict';
module.exports = {"a":{"hehe":1,"haha":2},"b":{"hihi":3,"ohoh":4}}
如果希望新文件中的数据,显示出来的数据格式看起来和写入的源数据的格式一样,可以像下面这样使用JSON.stringify:
'use strict';
let fs = require('fs');
let data = {
"a": {
"hehe":1,
"haha": 2
},
"b": {
"hihi": 3,
"ohoh": 4
}
};
let baseDir = __dirname + '/../';
let opts = {
cwd: baseDir,
encoding: 'utf8',
stdio: [process.stdin, process.stdout, process.stderr]
}
let fileName = baseDir + 'test.js';
fs.writeFileSync(fileName, `'use strict';\n\n module.exports = ${JSON.stringify(data, null, 2)}`, opts);
打开新文件
'use strict';
module.exports = {
"a": {
"hehe": 1,
"haha": 2
},
"b": {
"hihi": 3,
"ohoh": 4
}
}
之所以会发生这样的变化,是因为JSON.stringify(value[, replacer, space])一共接受三个参数:
- value: 要序列化成 一个JSON 字符串的值
- replacer: (可选) 如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中;如果该参数为null或者未提供,则对象所有的属性都会被序列化;关于该参数更详细的解释和示例,请参考使用原生的 JSON 对象一文。
- space: (可选) 指定缩进用的空白字符串,用于美化输出(pretty-print);如果参数是个数字,它代表有多少的空格;上限为10。该值若小于1,则意味着没有空格;如果该参数为字符串(字符串的前十个字母),该字符串将被作为空格;如果该参数没有提供(或者为null)将没有空格
所以上面的例子中将第二个参数设置为null,就将源数据的对象所有属性都序列化了,而将第三个参数设置为2,就美化了输出,因此被写到文件的数据达到和源数据的格式一样的效果
关于JSON.stringify的详细介绍可见这里
另外,有一个模块也可以达到这种效果: format-json-pretty
'use strict';
let fs = require('fs');
let formatJson = require('format-json-pretty');
let data = {
"a": {
"hehe":1,
"haha": 2
},
"b": {
"hihi": 3,
"ohoh": 4
}
};
let baseDir = __dirname + '/../';
let opts = {
cwd: baseDir,
encoding: 'utf8',
stdio: [process.stdin, process.stdout, process.stderr]
}
let fileName = baseDir + 'test.js';
fs.writeFileSync(fileName, `'use strict';\n\n module.exports = ${formatJson(data)}`, opts);