【问题标题】:Requiring a JSON with comments in node.js在 node.js 中需要带有注释的 JSON
【发布时间】:2020-09-11 17:26:41
【问题描述】:

如果您使用 typescript,您可以初始化一个默认的 tsconfig.json,该 json 将包含 javascript // 和 /* */ cmets。我遇到了 ts-jest 的情况,我需要我的 tsconfig 并解析它,但 jest 没有解析它,因为 json 不允许 cmets。 see this 不知道 typescript 是怎么处理的,但是好像有偏差。

// this fails if tsconfig has comments
const tsconfig = require('./tsconfig')

我想保留 cmets,因为它们对理解和维护我的 tsconfig.json 非常有帮助,并且我希望我的配置能够避免重复代码并使事情变得更加动态。

有没有办法使用 nodejs 要求一个带有 cmets 的 json 文件?

【问题讨论】:

    标签: javascript node.js json typescript json5


    【解决方案1】:

    我设法通过预处理 json 以剥离 cmets 来做到这一点。以下代码为我完成了这项工作:

    const fs = require('fs')
    const stripForwardSlashForwardSlashComment = new RegExp('//(.*)', 'g')
    const stripForwardSlashStarComment = new RegExp('[/][*](.*)[*][/]', 'gm')
    let jsontxt = fs.readFileSync('./tsconfig.json', 'utf8')
    jsontxt = jsontxt.replace(stripForwardSlashForwardSlashComment,'').replace(stripForwardSlashStarComment, '')
    const tsconfig = JSON.parse(jsontxt)
    

    自我回答说明:发布以保持公开并获得一些反馈

    【讨论】:

    • 这不安全。例如。 ["//text"] 字符串应该保持原样,尽管它包含一些看起来像评论的东西。
    【解决方案2】:

    json5 可以解决问题。安装 JSON5,​​然后:

    const JSON5 = require('json5');
    const tsconfig = JSON5.parse(jsontxt);
    

    请注意,您可以自行删除 cmets,但存在一些缺陷,因此不建议这样做。你应该寻找:

    • 字符串可能包含看起来像 cmets 的序列,但实际上不是。
    • 评论可能包含看起来像字符串开头的序列,但实际上不是。
    • 字符串可能包含不标记字符串结尾的",例如"foo\"bar""foo\\" 更容易混淆,第二个 " 确实结束了字符串。
    • // 评论可能包含 /*,但这不会启动多行评论。
    • 多行注释中的// 不会启动单行注释,因此删除/* // */ "hi" 中的cmets 会导致"hi"
    • \ 是否将单行继续到下一行? \*/ 是结束多行注释,还是 \ 使 * 行为不同? (JavaScript 都不支持)。
    • 是否支持多行字符串(它们在 JavaScript 中)?它们是如何申报/处理的。

    【讨论】:

      【解决方案3】:

      require-json5 是为此专门构建的:

      const requireJSON5 = require('require-json5');
      const tsconfig = requireJSON5('./tsconfig.json');
      

      或者更简单:

      require('require-json5').replace();
      var tsconfig = require("./tsconfig");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-22
        • 2022-01-23
        • 1970-01-01
        • 2011-11-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多