【问题标题】:Combining JS files (JSONish)组合 JS 文件 (JSONish)
【发布时间】:2017-01-26 00:47:39
【问题描述】:

我想动态组合多个 javascript 文件,每个文件都表示为一个具有一些功能的对象:

// ./src/foo.js
{
   "foo": function() {
       console.log("foo");
   }
}

// ./src/bar.js
{
   "bar": function() {
       console.log("bar");
   }
}

// desired output
{
   "foo": function() {
       console.log("foo");
   },
   "bar": function() {
       console.log("bar");
   }
}

我想返回一个类似于 JSON 对象的文件。如果我结合严格的 JSON,函数看起来(非常粗略)如下:

   var files = ['./src/foo.json', './src/bar.json'];
   var final = {};

   for(var i in files) {
      var srcFile = files[i];
      var json = JSON.parse(fs.readFileSync(srcFile, 'utf8'));
      Object.assign(final, json);
   }

   console.log(JSON.stringify(final, null, 2));

但这似乎不起作用,因为我的文件包含函数和 cmets,在 JSON 表示中是不允许的。因此,我必须将文件存储为 .js 文件,这种方法不适用于将对象合并为单个对象。如何读入和合并包含函数的“JSON”文件?

所以我的问题归结为两部分:

  1. 什么替代var json = JSON.parse(fs.readFileSync(srcFile, 'utf8')); 将包含函数的javascript 对象读入var json 变量?
  2. 用什么替换Object.assign({}, json) 来合并功能对象?

【问题讨论】:

  • 从技术上讲,您不能将函数放入 json 中。但是你可以在里面放一个字符串表示

标签: javascript json node.js


【解决方案1】:

这里是解决方案的第一部分:

const fs = require('fs')
const files = ['./foo.js', './bar.js'];
const Promise = require('bluebird');

const final = Promise.resolve(files)
  .map(file => Promise.fromCallback(cb => fs.readFile(file, 'utf-8', cb)))
  .reduce(
    function(acc, file) {
      const obj = eval(`(${file})`)
      return Object.assign(acc, obj)
    },
    {}
  ).then(function(final) {
    console.log(final)
  })

结果:

> node 1.js
{ foo: [Function], bar: [Function] }

现在你需要决定如何表示函数

第二部分你可以找到here

注意:eval 是不安全的,但我认为在你的任务上下文中它完全没问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 2011-07-10
    • 1970-01-01
    相关资源
    最近更新 更多