2016-04-21 53 views
2

Pete Hunt's Webpack How To将此代码用于:阅读环境变量时,JSON.parse/stringify有什么用?

// definePlugin takes raw strings and inserts them, so you can put strings of JS if you want. 
var definePlugin = new webpack.DefinePlugin({ 
    __DEV__: JSON.stringify(JSON.parse(process.env.BUILD_DEV || 'true')), 
    __PRERELEASE__: JSON.stringify(JSON.parse(process.env.BUILD_PRERELEASE || 'false')) 
}); 

什么是JSON.stringify(JSON.parse(..))这里需要的? JSON字符串化/解析有助于克隆对象以避免突变,但process.env.BUILD_DEV是(且只能是?)一个字符串。那么,为什么要使用它?

+1

TheTo克隆一个对象,可以使用'var newObj = JSON.parse(JSON.stringify(object))''而不是相反 - 也许这是一个黑客来确保字符串是有效的,即使它包含换行符或引号 – mplungjan

+2

如果环境变量包含与数字,null,true或false(或正确转义的转义字符串或json对象)不同的东西,则会失败。可能是为了避免人们将BUILD_DEV设置为“是”,也许?虽然我会删除outlord'JSON.stringify()' –

回答

3

这是很奇怪的代码。首先,克隆机理是:

JSON.parse(JSON.stringify(obj)) 

但是,你的代码是这样的:

JSON.stringify(JSON.parse(str)) 

所以,这似乎是试图克隆一个JSON字符串艰辛的道路。这很奇怪,因为字符串在Javascript中是不可变的,所以在多次引用同一个字符串时没有危险。底层的字符串不能更改。

我想说这个额外的代码似乎是多余的和不必要的,除非它以某种方式强制process.env.BUILD_DEV的值是JSON.parse()会接受的东西,而不会出现异常,这似乎是一种非常奇怪的方式来测试值。如果这是目的,那么代码会更明确,只是明确地检查预期的合法值,而不是像这样的无证副作用测试。另外,我们在这里看不到任何异常处理程序来处理不良数据,所以它似乎不太可能是它的原因。

我想另一个原因是将字符串规范化为规范格式,因为对解析结果调用JSON.stringify()将保证统一字符串,而不管原始字符串中可能存在哪些转义字符。对于它为什么没有做任何评论,它似乎仍然是一种奇怪的做法。

+0

我认为它可能是允许字符串包含特殊字符 – mplungjan

+0

@mplungjan - 是的,我想这可能是使字符串规范化,不管是什么逃逸字符在里面。我在我的回答中加入了这一点,但它似乎仍然是一个糟糕的做法,至少没有评论它为什么要这样做。 – jfriend00

+0

JSON.stringify()通常用于webpack.DefinePlugin()内用静态方法用一个字符串替换一个变量。没有字符串化(或添加额外的引号,即“生产”),它会用另一个标识符而不是字符串替换变量。 JSON.parse()看起来像某种值测试,因为期望值在这里是0和1。尽管我仍然不能100%确定Pete在此代码背后的意图,但您的答案肯定有帮助。谢谢。 – marzelin