徵求意見稿:嚴格單元 運算子

由 Natalie Weizenbaum 發佈於 2022 年 6 月 15 日

你知道在 Sass 中,margin: $a -$b 的作用是什麼嗎?如果你認為它和 margin: $a (-$b) 的作用相同,很抱歉,你錯了。它實際上和 margin: $a - $b 的作用相同。別擔心,你不是第一個被 Sass 解析器這個奇怪的角落絆倒的人!但我們新的語言提案旨在解決這個 問題。

在目前公開徵求社群意見的「嚴格單元運算子」提案中,我們提議先棄用,最終禁止 $a -$b 這種形式的表達式。我們知道棄用從來都不是一件令人愉快的事情,但這個棄用應該相當輕鬆:你可以簡單地寫成 $a - $b$a (-$b),取決於你的意圖。我們還會提供一個 Sass 遷移工具 來自動更新你的 樣式表。

已棄用

  • $a -$b 將不再被允許,因為作者的意圖不明確,而且目前的行為很可能 不正確。

仍然允許

  • $a - $b 將繼續有效,因為它清楚地表示 減法。

  • $a (-$b) 將繼續有效,因為括號使單元負號的意義 明確。

所有廣泛使用的 Sass 版本都支援 $a - $b$a (-$b) 選項,因此函式庫應該可以輕鬆避免這個棄用警告,並繼續支援舊版 Sass。此外,你隨時可以使用 --quiet-deps 命令列標記quietDeps JS API 選項 來隱藏你無法控制的依賴項的 警告。

為什麼會這樣運作?為什麼會這樣運作?永久 連結

你可能會想,為什麼 $a -$b 一開始會這樣解析?簡短的答案是:「因為其他程式語言也是這樣做的」。在大多數程式語言中,運算子的解析方式相同,無論它們周圍是否有空格。如果你將 $a - $b 解析為減法,那麼你也應該將 $a -$b 解析為 減法。

Sass 的問題在於,我們也繼承了 CSS 使用空格分隔的值列表,因此在某些情況下,使用者期望能夠並排寫兩個表達式,並且它們的解析方式與單獨使用時 相同。這兩個原則相互衝突,導致了這個提案試圖解決的 混淆。

為什麼不直接改變它的運作方式?為什麼不直接改變它的運作方式?永久 連結

理論上,我們可以更改 Sass,使 $a -$b 的解析方式與 $a (-$b) 相同:一個以空格分隔的兩個值的列表,後者帶有一個單元負號。我們選擇不這樣做有兩個 原因

  1. 實際上,比起完全禁止語法,修改現有語法的行為所造成的破壞性變更更加棘手。它需要更多次的版本發佈,以及更多不同行為的 Sass 版本。它也可能導致樣式表一次升級多個版本後切換到新的行為 *卻沒有產生錯誤*,這可能導致最糟的情況:發佈錯誤的樣式。

  2. 並不顯而易見的是,$a -$b 在所有情況下都*應該*被解析為 $a (-$b)。來自其他程式語言的使用者可能會期望它像在那些語言中一樣被解析。即使在 Sass 中,$a -$bcalc() 中仍將繼續作為有效的二元運算。這可能不是優雅的風格,但有時格式並不是作者的首要考量!

讓我們知道您的想法!讓我們知道您的想法!永久連結

如果您對此變更有任何想法或意見,請閱讀完整的提案,然後提交 issue 提供您的回饋。我們將開放評論一個月,之後我們將 finalized 提案並開始實作。