需要 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");
如果你使用打字稿,你可以初始化一个默认的 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");