2

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

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

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

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

4

3 回答 3

4

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

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

请注意,自己删除评论是可能的,但有几个陷阱,这就是不建议这样做的原因。你应该寻找:

  • 字符串可能包含看起来像注释的序列,但它们不是。
  • 注释可能包含看起来像字符串开头的序列,但它们不是。
  • 字符串可能包含"不标记字符串结尾的内容,例如"foo\"bar". 更令人困惑的是"foo\\",第二个 " 确实结束了字符串。
  • //注释可能包含,/*但不会启动多行注释。
  • 多行注释中的A//不会开始单行注释,因此删除注释会 /* // */ "hi"导致"hi".
  • a 是否将\单行继续到下一行?\*/结束多行注释,还是\使*行为不同?(JavaScript 都不支持)。
  • 是否支持多行字符串(它们在 JavaScript 中)?它们是如何声明/处理的。
于 2020-05-25T06:29:16.530 回答
1

require-json5专门为此而设计:

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

或者更简单:

require('require-json5').replace();
var tsconfig = require("./tsconfig");
于 2020-11-18T13:16:07.227 回答
-1

我设法通过预处理 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)

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

于 2020-05-25T05:17:56.197 回答