将包含函数的对象保存到.js文件

时间:2019-12-07 23:52:06

标签: javascript node.js json object require

说我有一个如下对象:

let obj = {
    mounted: (value) => {
        return "Yeesss" + value;
    },
    a: "123123",
    c: {
        d: (key) => {
            return key + 1;
        }
    }
}

我可以像这样对对象及其功能进行字符串化:

let objString = JSON.stringify(obj, (key, value) => {
    if(typeof value === "function") return "[Function]" + value;
    return value;
});

它将类似于:

{
    "mounted":"[Function](value) => {\n        return \"Yeesss\" + value;\n    }",
    "a":"123123",
    "c":{
        "d":"[Function](key) => {\n            return key + 1;\n        }"
    }
}

我可以将此字符串保存到.json文件中,然后按如下所示读取并解析它,这将带给我相同的对象:

let obj = JSON.parse(objString, (key, value) => {
    if(typeof value === "string" && value.startsWith("[Function]")){
        value = value.substring(10);
        value = eval(value);
        return value;
    }
    return value;
});

我想知道的是如何以fs开头的对象以以下格式保存在.js文件中:

module.exports = {
    mounted: (value) => {
        return "Yeesss" + value;
    },
    a: "123123",
    c: {
        d: (key) => {
            return key + 1;
        }
    }
}

以便我可以要求它,并在将来的其他时间使用它。

1 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

  1. 在功能处理中使用JSON.stringify()来生成字符串。
  2. 搜索并替换为带有引号且未转义的值。
  3. 添加模块前缀。

let obj = {
    mounted: (value) => {
        return "Yeesss" + value;
    },
    a: "123123",
    c: {
        d: (key) => {
            return key + 1;
        }
    }
};

let json = JSON.stringify(obj, (key, value) => {
  if (typeof value === 'function') {
    return '[FUNCTION]' + value;
  }
  return value;
}, '    ');

let moduleJavascript = json.replace(/"(\[FUNCTION])?((?:\\.|[^\\"])*)"(:)?/g, (match, group1, group2, group3) => {
    if (group1) return JSON.parse('"' + group2 + '"');
    if (group3 && /^\w+$/.test(group2)) return group2 + ':';
    return match;
});

moduleJavascript = 'module.exports = ' + moduleJavascript + ';';

console.log(moduleJavascript);


如果这变得太复杂,则可以考虑使用代码生成工具。 EJS可能符合您的需求。

模板:

module.exports = {
    mounted: (value) => {
        return "Yeesss" + value;
    },
    a: <%= locals.avalue %>,
    c: {
        d: (key) => {
            return key + 1;
        }
    }
};

并致电:

let ejs = require('ejs'),
    fs = require('fs');

fs.readFile('template.ejs', (err, templateText) => {
    if (err) throw err;
    let moduleJavascript = ejs.render(templateText, {
        // Arguments into the template
        avalue: "123123"
    }, {
        // To make <%= %> escape JavaScript instead of HTML
        escape: JSON.stringify
    });
});