可編程CSS代碼說明文檔的幾種選擇
本文為譯文,原文請閱讀The Options for Programmatically Documenting CSS
我堅信代碼說明文檔應當儘可能維護在緊靠源碼的位置。就我個人經歷而言,這是令代碼說明文檔長期有效的唯一選擇。那些維護在源碼外部的文檔、筆記、知識集最終都逃脫不了過期、被遺忘或者被遺失的命運。 n
代碼說明文檔總是一個令我心煩的話題。嚴重缺失代碼說明文檔的代碼庫對於其使用者來說,如同一個定時炸彈。這很容易讓剛接手項目的工作者對工作產生厭惡情緒。從另一方面來考慮,不良的代碼說明文檔會催生低卡車因子(low truck factor),可以理解為:一個團隊最多失去幾位成員才會導致項目陷入困境)。 n
最近我剛接手了一個不止1500頁word代碼說明文檔的項目。這些代碼說明文檔不是過時,就是缺乏組織性。除了確定這是個災難,我也必須堅信一定會有更好的辦法! n
不久前,我在CSS-Tricks上發表了文章What Does a Well-Documented CSS Codebase Look Like?,跟大家簡單探討了一些關於代碼說明文檔的問題。這次,讓我們進一步探究用編程方式編寫代碼說明文檔的幾種方式,特別是對CSS編寫代碼說明文檔。n
與JSDoc類似,CSS代碼也有多種描述組件的方式,例如在源碼種加註釋 /* comments */。一旦代碼加上了這樣的注釋,那麼一份活著的樣式指南便生成了。之所以強調活著,因為它是代碼說明文檔可維護性的關鍵成功因素。根據我的經驗,採用這種方式很快就能體會到如下幾點益處:
- 整個團隊使用共同的辭彙,大大減少溝通問題和誤解。
- 組件視覺效果的當前狀態始終可見。
- 用最小的代價把前端代碼庫轉變成精心描述的樣品庫。
- 它是個有用的開發試驗田。
有時候這種聚焦於文檔的開發方式也會被詬病為是相當耗費時間的。對此,我不作反駁。每個人都應當在代碼功能與說明文檔之間爭取平衡。拿我現在的團隊舉例,我們採用敏捷的開發方式,每個迭代都會預留部分時間專門用於補全缺失的文檔。
當然,很多時候人們會認同可運行的軟體勝於詳盡的文檔。這也完全正確,只要負責人清楚項目的長期維護計劃即可。
Knyle Style Sheets (KSS)
KSS既是一份文檔規格說明,也是一種編寫樣式指南的格式。它為團隊編寫具有可維護性、可文檔化的CSS提供一套方法。我周圍的大多數同行們採用KSS,是因為它具有較高的人氣、豐富的表現力以及簡潔的特點。
KSS的編寫格具有可讀、可解析的特點。因此,它旨在幫助人們自動化地創建活著的樣式指南。
類似於JSDoc,KSS允許在CSS的源代碼中添加註釋來描述組件。每一段KSS文檔塊由三部分組成:描述元素的功能、外觀;羅列一下修飾類、偽類如何修改元素;指出樣式指南中元素所在的位置。SCSS的代碼舉例如下:// Primary Buttonn//n// Use this class for the primary call to action button.n// Typically youll want to use either a `<button>` or an `<a>` element.n//n// Markup:n// <button class="btn btn--primary">Click Me</button>n// <a href="#" class="btn btn--primary">Click Me</a>n//n// Styleguide Components.Buttons.Primaryn.btn--primary {n padding: 10px 20px;n text-transform: uppercase;n font-weight: bold;n bacgkround-color: yellow;n}n
至於用Node.js實現KSS,Benjamin Robertson發表過一篇詳細描述使用kss-node經歷的文章。此外,還有大把的生成器使用KSS標記法將樣式表生成為樣式指南。其中,SC5 Style Generator 是一個很流行的工具。此外,這些生成器的語法得到了擴展,引入了標籤容器、處理時可以忽略樣式表中的部分內容以及其他一些優秀的改進。
另一些時而有用的好處(但在我看來比較花哨的)如下:
- 使用設計師工具可以之間通過web界面編輯Sass、Less、PostCSS的變數。
- 針對每一種設備都有樣式的在線預覽。
誰知道呢,可能這些功能在某些用戶場景下是有益的。這裡有個SC5的可交互demo。
GitHub 的樣式指南 (Primer) 就是用KSS生成的。
MDCSS
如果你正在搜索一個簡單、精鍊的解決方案,mdcss 是一個選擇。這裡有一個可交互demo。要叫上一段文檔,加上以`---`開頭的CSS注釋即可。CSS代碼如下:
/*---ntitle: Primary Buttonnsection: Buttonsn---nnUse this class for the primary call to action button.nTypically youll want to use either a `<button>` or an `<a>` elementnn```example:htmln<button class="btn btn--primary">Click</button>n<a href="#" class="btn btn--primary">Click Me</a>n```n*/n.btn--primary {n text-transform: uppercase;n font-weight: bold;n background-color: yellow;n}n
文檔內容用Markdown解析並轉成HTML,這點很棒!此外,文檔中的某塊內容可以從另一個文件中自動帶入,這對於需要更詳盡解釋的說明文檔很有用。CSS代碼如下:
/*---ntitle: Buttonsnimport: buttons.mdn---*/n
每個文檔對象可包含如title(當前部分的),unique name, context以及其他屬性。
我所了解的有類似功能的其他工具如下:
- Styledown | 可交互的demo
- Aigis | 可交互的demo
Nucleus
Nucleus 一種活著的樣式指南生成器,它要求組件符合原子性設計理念。Nucleus從DocBlock標記中讀取信息。
原子設計是編寫模塊化樣式的指導原則,Nucleus將樣式的複雜度級別映射到生物化學的測量級別。這導致了較低的選擇器特異性,允許使用者通過簡單的元素組成複雜的實體。如果你不太熟悉原子設計,初始階段的學習曲線會比較陡峭。Nucleus的實體包括以下這些:
- Nuclides: 樣式本身不可直接使用(包括:mixing, settings, variables)。
- Atoms: 單類元素或選擇器規則(包括:buttons, links, headlines, inputs...)。
- Molecules: 一個或多個嵌套規則,但是任何一個規則都不能超過Atom級別。
- Structures: 最複雜的類型,可以由多個molecules或structures構成。
- ...其他更多。
本文通篇用到的按鈕的代碼例子,在這裡就代表一個Atom——一個樣式表中非常基本的元素(單類元素或選擇器)。為了把它標記成Atom,我們需要用`@atom`標籤來標記,並在後面寫上組件的名稱。CSS代碼如下:
/**n * @atom Buttonn * @section Navigation > Buttonsn * @modifiersn * .btn--primary - Use this class for the primary call to action button.n * @markupn * <button class="btn">Click me</button>n * <button class="btn btn--primary">Click me</button>n * <a href="#" class="btn btn--primary">Click Me</a>n */n.btn--primary {n text-transform: uppercase;n font-weight: bold;n bacgkround-color: yellow;n}n
總結
對於可編程的CSS代碼說明文檔而言,從工具到通用的語法定義,到目前為止還沒有絕對的贏家。
一方面,KSS似乎在引領著大家,所以我認為把KSS的使用融入到一個長期項目是值得考慮的。我的直覺告訴我KSS會存活很久。另一方面,不同的語法選擇、工具,好像Nucleus、MDCSS看起來也很有前途。我會建議你把它們用到短期項目里。
需要強調一點,本文所列舉的所有工具可能實際使用效果都不錯,並有足夠的可伸縮性。因此挑選最適合於你的團隊的工具進行嘗試即可。
如果讀者們願意在評論中分享使用這些工具的經驗,或者推薦使用其他工具,我將不勝感激。
推薦閱讀: