cannot assign instance of scala.Some to field org.apache.spark.scheduler.Task.appAttemptId
在專案開發的過程中,基於有限的時間內保質保量的完成開發任務無疑是一場挑戰。在這場挑戰中我們不但要快速處理自己的問題,還需要與別人協同合作,以避免兩者之間的衝突。
針對於大型專案的開發,css如何組織和管理才能讓我們用更少的時間寫出更強大的功能。這篇文章來表述一些我對css組織和管理的理解。當然,對於 ToC(面向個人) 應用,出於細節和動畫的把控。再加上這種網頁生命週期較短,往往復用性較差,但是針對於 ToB(面向企業) 應用,統一風格往往會贏得客戶的青睞。行列間距,主題樣式等都應該結合統一,而不是每個頁面不同設計。基於此,我們需要組織與管理我們的 css,而不僅僅只是是靠 css injs來為每個元件單獨設計。
BEM 命名約定
BEM 是一種相當知名的命名約定,BEM 的意思就是塊(block)、元素(element)、修飾符(modifier),是由Yandex團隊提出的一種前端命名方法論。這種巧妙的命名方法讓你的CSS類對其他開發者來說更加透明而且更有意義。BEM 命名約定更加嚴格,而且包含更多的資訊,它用於一個團隊開發一個耗時的大專案。
如 我們在書寫夥伴卡片元件程式碼風格如下:
.partner-card {
}
.partner-card__name {
}
.partner-card__content {
}
.partner-card__content {
}
.partner-card__content--md {
}
根據上述程式碼,我們很容易看出當前開發的意圖,同時也很難遇到程式碼重複的問題。當然,我們可以利用Less、Sass、Stylus 這些 css 處理器輔助開發,這裡不再贅述。
計算科學中最難的兩件事之一就是命名,日常開發中如果沒有一些約定,就很容易發生命名衝突,BEM 恰恰解決了這一痛點,我們只需要外層樣式名是一個有意義且獨立唯一,就無需考慮太多。
與 BEM 相對應的還有 OOCSS SMACSS。而這兩種不是直接可見的命名約定,而是提供了一系列的目標規則。這裡不再詳細闡述,大家如果想要了解,可以去看一看值得參考的css理論:OOCSS、SMACSS與BEM。當然了,真正的組織與管理必然也離不開這些目標規則。
同時,使用 BEM 而不是 CSS 後代選擇器進行專案也會有一定效能優勢(可以忽略不計),這是因為瀏覽器解析 css 時是逆向解析,之前對 css 解析有一定誤區,由於書寫是從前往後,所以認為解析也一定是從前往後,但是大部分情況下,css 解析都是從後往前。
如果規則正向解析,例如「divdivp em」,我們首先就要檢查當前元素到html的整條路徑,找到最上層的 div,再往下找,如果遇到不匹配就必須回到最上層那個 div,往下再去匹配選擇器中的第一個 div,回溯若干次才能確定匹配與否,效率很低。逆向匹配則不同,如果當前的 DOM 元素是 div,而不是 selector 最後的 em 元素,那隻要一步就能排除。只有在匹配時,才會不斷向上找父節點進行驗證與過濾。無需回溯,效率較高。
Atomic CSS
ACSS表示的是原子化 CSS(Atomic CSS),是 Yahoo 提出來的一種獨特的 CSS 程式碼組織方式,應用在 Yahoo 首頁和其他產品中。ACSS 的獨特性在於它的理念與一般開發人員的理解有很大的不同,並挑戰了傳統意義上編寫 CSS 的最佳實踐,也就是關注點分離原則。ACSS 認為關注點分離原則會導致冗餘、繁瑣和難以維護的 CSS 程式碼。
程式碼風格如下所示:
/** 背景色 顏色 內邊距 */
<div class="Bgc(#0280ae.5) C(#fff) P(20px)">
Lorem ipsum
</div>
<div>
<div class="Bgc(#0280ae.5) H(90px) IbBox W(50%) foo_W(100%)"></div>
<div class="Bgc(#0280ae) H(90px) IbBox W(50%) foo_W(100%)"></div>
</div>
<hr>
<div class="foo">
<div class="Bgc(#0280ae.5) H(90px) IbBox W(50%) foo_W(100%)"></div>
<div class="Bgc(#0280ae) H(90px) IbBox