需要 JSON 并在 node.js 中发表评论

Requiring a JSON with comments in node.js

如果你使用打字稿,你可以初始化一个默认的 tsconfig.json,json 将有 javascript // 和 /* */ 注释。我遇到过 ts-jest 的情况,我需要我的 tsconfig 并解析它,但 jest 没有解析它,因为 json 不允许评论。 see this我不确定打字稿是如何处理它的,但它似乎偏离了规则。

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

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

有没有办法使用 nodejs 要求 json 文件带有注释?

我设法通过预处理 json 来删除评论。以下代码正在为我完成这项工作:

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)

自答笔记:发布以保留此 public 并获得一些反馈

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

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

请注意,您可以自行删除评论,但存在一些缺陷,因此不推荐这样做。您应该寻找:

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

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

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

或者更简单:

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