为什么Webpack的DefinePlugin要求我们将所有内容都包装在JSON.stringify中?

时间:2016-09-19 03:09:42

标签: javascript webpack

new webpack.DefinePlugin({
    PRODUCTION: JSON.stringify(true),
    VERSION: JSON.stringify("5fa3b9"),
    BROWSER_SUPPORTS_HTML5: true,
    TWO: "1+1",
    "typeof window": JSON.stringify("object")
})

https://github.com/webpack/docs/wiki/list-of-plugins#defineplugin

这似乎非常不寻常,不必要且“容易出错”。

是否存在类型检查问题?

1 个答案:

答案 0 :(得分:33)

答案在示例下面:

  
      
  • 如果值是字符串,则将其用作代码片段。
  •   
  • 如果值不是字符串,则会进行字符串化(包括函数)。
  •   

即。将字符串的值插入源代码 verbatim

直接传递JSON.stringify(true)或传递true是相同的,因为非字符串值会转换为字符串。

但是,JSON.stringify('5fa3b9')"5fa3b9"之间存在很大差异:

假设您的代码是

if (version === VERSION)

然后VERSION: JSON.stringify('5fa3b9')将导致

if (version === "5fa3b9")

VERSION: "5fa3b9"会导致

if (version === 5fa3b9)

这是无效代码。

  

请注意,因为插件执行直接文本替换,所以赋予它的值必须包含字符串本身内部的实际引号。通常情况下,这可以通过替代引号完成,例如'"""""""""""""'''生产'