2016-04-21 54 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