我有一个创建和导出配置对象的模块。在浏览器环境中运行时,其字符串值必须为JSON.stringified。否则,它们将被解释为裸标识符。
在节点中,JSON.stringify似乎添加了一组无关的双引号。
什么解决方案适用于浏览器和节点?
我检出的大多数节点模块,搜索JSON.stringify处理复杂对象的字符串表示/翻译。
module.exports = {
url: JSON.stringify(process.env.SOME_URL),
// in node, resolves to '"https://..."'
headers: {
Authorization: JSON.stringify(basicAuthString),
// in node, resolves to '"Basic ...="'
'Content-Type': JSON.stringify('application/json'),
}
};
module.exports = {
url: process.env.SOME_URL,
// in node, resolves to bare https://...
// Uncaught SyntaxError: Unexpected token :
headers: {
Authorization: basicAuthString,
// in browser, resolves to bare Basic ...=
// actions.js:15 Uncaught SyntaxError: Unexpected identifier
'Content-Type': JSON.stringify('application/json'),
}
};
对于webpack,process.env
值是在构建时使用以下方法捕获的:https://github.com/AngularClass/angular2-webpack-starter/wiki/How-to-pass-environment-variables
此解决方法只检查开头和结尾的重复引号。它适用于两种环境。
const str = (s) => {
let ret = JSON.stringify(s);
if (ret.indexOf('""') === 0) {
ret = ret.slice(1);
}
if (ret[ret.length - 2] === '"') {
ret = ret.slice(0, -1 + ret.length);
}
return ret;
};
module.exports = { foo: str('bar') };
答案 0 :(得分:0)
By definition JSON.stringify()
通过添加额外的引号将字符串转换为字符串。
如果Type(value)是String,则返回使用参数值调用抽象操作Quote的结果。
而不是JSON.stringify()
你不能只使用String()
吗?
Node不会更改字符串,webpack也应该正确处理它。