前言:接到這麼一個需求,需要將每個模塊exports出來的對象拼接成一個新的對象,並寫入到一個新的js文件中。
一、準備工作
1、在nodeTest文件夾下創建3個js文件
└─ nodeTest
├─── obj1.js
├─── obj2.js
└─── test.js
//obj1.js
module.exports = {
nick:{
name: "nick",
age: 22,
sex: "男"
}
}
//obj2.js
module.exports = {
freddy:{
name: "freddy",
age: 24,
sex: "男"
}
}
//test.js
const fs = require('fs');
let obj1 = require('./obj1.js'),
obj2 = require('./obj2.js'),
newObj = {};
newObj = {
...obj1,
...obj2
}
//通過fs模塊的writeFileSync進入內容寫入
fs.writeFileSync('./newObj.js', newObj);
2、然後在node環境下運行該test.js,進行newObj文件寫入
會發現並不能拿到自己想要的內容,這是因爲writeFileSync是最終是通過將內容轉換成字節碼進行寫入的,而類型爲Object內容沒辦法轉換成字節碼,會被先轉換成字符類型。最終出現上述類型。
二、解決方案
1、通過JSON.parse跟JSON.stringify之間的巧妙轉換進行寫入
//test.js
const fs = require('fs');
let obj1 = require('./obj1.js'),
obj2 = require('./obj2.js'),
newObj = {},
writeStr = '';
newObj = {
...obj1,
...obj2
};
writeStr = `let newObj = JSON.parse('${JSON.stringify(newObj)}');
console.log(newObj);
`;
fs.writeFileSync('./newObj.js', writeStr);
2、然後在node環境下運行該test.js,進行newObj文件寫入
3、然後在node環境下運行該newObj.js,查看結果
這樣就能拿到我們需要的結果啦!
三、注意事項
1、注意事項一:JSON轉換問題
let obj = {
test1: 1,
test2: '1',
test3: true,
test4: null,
test5: function(){},
test6: undefined,
test7: Symbol('1')
}
let newObj = JSON.parse(JSON.stringify(obj));
console.log(newObj);
如果對象屬性值爲function、undefined、Symbol類型,通過JSON轉換時,會將這些屬性刪掉。其他類型並不會出現這問題。
2、注意事項二:屬性值中同時出現單引號和雙引號時,寫入文件後,會出現JSON.parse轉換報錯問題
const fs = require('fs');
let newObj = {
test: '<i class="className"></i>'
};
writeStr = `let newObj = JSON.parse('${JSON.stringify(newObj)}');
console.log(newObj);
`;
fs.writeFileSync('./newObj.js', writeStr);
會發現新寫入的內容會存在轉義符。
運行newObj.js
如果這個其實不是JSON.stringify的轉換問題,而且node文件寫入導致的問題。
處理方案
const fs = require('fs');
let newObj = {
test: "<i class='className'></i>"
};
writeStr = "let newObj = JSON.parse(`"+ JSON.stringify(newObj) +"`);"+
"console.log(newObj);";
fs.writeFileSync('./newObj.js', writeStr);
這裏注意我是用反引號進行拼裝,這樣寫入的時候就不會出現轉義符了。