跳過導覽
Image showing a box of icons being automatically created in Sketch
學習設計

開放格式:如何自動建立圖示元件庫

探索如何使用 Sketch 和 Google 的 Material Design 圖示集自動建立圖示元件庫

本文是我們「開放格式」系列文章的一部分。如果您想在深入了解技術細節之前先大致了解一下,請查看本系列的第一篇文章

在本文中,我們將運用在本系列先前文章中學到的知識,使用 Google 的 Material Design 圖示集 來建構一些很棒的東西。我們將建立一個工具,使用圖示集中包含的 10,000 多個圖示自動建立圖示元件庫,並準備分發給 Monday Studio 的設計師。

Subheading showing for designers.

您可能以前也遇到過這種情況 — 需要將一堆素材轉換成元件庫。您將其中一些素材導入到文件中,將它們整齊地排列成網格,然後重複這個過程。光是想一想就讓人頭痛。將此過程自動化,可以讓您騰出心思去思考在這些圖示可以使用後,您需要用它們來做哪些*重要*的事情。

Subheading showing for managers.

重複性的工作雖然有助於提升某些技能,但卻會消磨士氣。您希望您的團隊快樂且充滿動力,而不是漫無目的地移動像素。而且這也很耗時 — 您的團隊可以用這些時間來做更重要的工作。從開始使用這個工具的那一刻起,自動化這項任務就值回票價了。

Subheading showing for developers.

建構這種自動化將會教您更具雄心壯志工作的基礎。您不必就此止步 — 您可以透過新增一些黏合和轉換層來連接不同的系統,將 Sketch 整合到您現有的許多工作流程中。

免責聲明:本文中的範例程式碼是一個**概念驗證**。雖然結果相當不錯,但並非 100% 完美,且本專案旨在作為啟發,讓您建構自己的自動化。撰寫一個完整的 SVG 解析器*遠遠超出*本文的範圍。但是,撰寫一些可以理解 SVG 格式非常有限子集的程式碼則更為合理。Material Design 圖示集就是一個理想的例子。

我們將建構的內容

我們將把這個專案的工作分成三個步驟

  1. 讀取 SVG 資料並將其解析成我們可以在 JavaScript 中使用的內容。
  2. 將該資料轉換成 Sketch 可以理解的內容。
  3. 使用我們在本系列先前文章中使用的檔案格式工具,將資料儲存在 .sketch 文件中。

我們將使用一些現有的 node 函式庫和工具。這樣可以將重複造輪子的工作量保持在合理的最低限度。

您需要的東西

要跟著做,您需要相當熟悉 TypeScript,並且安裝了相當新版本的 node。對於本文,一些 JavaScript 的知識會很有幫助。至於程式碼編輯器,我們推薦 Visual Studio Code。您不需要 Sketch 或 Mac — 可以在任何作業系統上執行範例程式碼。

這些是我們將用於專案的建構基礎

  • svgson — 將 SVG 轉換為 JavaScript 物件的工具。我們將在第一階段使用它。
  • svg-points — 將 SVG 點轉換為路徑,反之亦然。在第二階段會很有用。
  • @sketch-hq/sketch-file-format-ts — 讓在第三階段從 TypeScript 建立 Sketch 檔案變得簡單又愉快。

除了這些建構基礎,我們還需要編寫一些膠水程式碼和一個簡化的轉譯器,將 Material Design Icons 中使用的 SVG 程式碼轉譯成 Sketch 物件。

我們已將專案的所有程式碼包含在此 GitHub 儲存庫 中。我們將在此處介紹比較有趣的部分,您可以參考 GitHub 儲存庫閱讀完整的程式碼。

開始吧!

從頭開始獲取和產生我們的 Sketch 函式庫

如果您查看 src 資料夾,您會看到我們已將程式碼拆分為三個模組

  • sketch-svg — 將 SVG 資料轉換為 Sketch 物件
  • sketch-blocks — 一組輔助程式,讓我們更容易建立這些 Sketch 物件
  • to-file — 負責將資料儲存到 Sketch 可以開啟的檔案中

src/index.ts 結合了所有這些,這表示我們可以

從磁碟讀取 SVG 檔案

const files = glob.sync('assets/material-design-icons/src/**/**/**/*.svg')

files.forEach((file, index) => {
  const svgData = fs.readFileSync(file, { encoding: 'utf8', flag: 'r' })
  ...
})

將 SVG 程式碼解析為 JavaScript 物件

使用 svgson 我們可以將 SVG 資料轉換為一個可以在 JavaScript 中輕鬆使用的物件。parseSync 函式完成了所有神奇的操作

const json = parseSync(svgData)

一旦 SVG 資料轉換為 AST(抽象語法樹),我們就可以像一般的 JavaScript 物件一樣存取其屬性

const width: number = parseFloat(json.attributes.width) || 100
const height: number = parseFloat(json.attributes.height) || 100

它還允許我們使用慣用的 JavaScript 程式碼遍歷 SVG 文件中的節點

json.children.forEach((child, index) => {
  symbolMaster.layers.push(s2v.parse(child, index))
})

建立 Sketch 物件來儲存資料

對於每個 SVG 檔案,我們將建立一個 SymbolMaster 物件,用於儲存 Sketch 文件中的圖示。

如果您使用 Visual Studio Code 編輯程式碼,TypeScript 將會協助您自動完成 Sketch 物件的所有必要屬性。

Image showing code for creating icon library automatically in Visual Studio.

如果您使用 Visual Studio Code 編輯程式碼,TypeScript 將會協助您自動完成 Sketch 物件的所有必要屬性。

每次都輸入所有這些資訊相當繁瑣,因此我們在 sketch-blocks 中添加了一些輔助程式,讓工作更輕鬆

var symbolMaster: FileFormat.SymbolMaster = sketchBlocks.emptySymbolMaster(...)
Image showing code hints for creating icon library automatically in Visual Studio.

Visual Studio Code 也會顯示這些輔助程式的提示

將 SVG 資料轉換為有效的 Sketch 物件需要一些嘗試和錯誤(尤其是在路徑點座標方面)。

Sketch 將點座標正規化到 0 到 1 的範圍,表示點沿著圖層框架全長的位置。例如,如果一個點應該放在 400 × 150 像素圖層上的 {200,150} 位置,則在 Sketch 中應將其座標設定為 {0.5,1}

為了盡可能保持簡潔,我們的概念驗證專案不支援 SVG 中一些更複雜的功能(例如矩陣變換)。您可能會看到這裡有一些圖示看起來並不完美,但大多數圖示應該看起來都不錯。

儲存 Sketch 文件

一旦準備好資料,我們需要將其儲存為 Sketch 可以開啟的格式。為此,to-file 模組提供了一個非常簡單的方法:toFile(contents, path)

若要了解 contents 應該是什麼樣子,請查看主要 index.ts 檔案中的 saveFile 函式。

測試我們的工作

儲存庫中有一個動作,它會在每次提交後執行 yarn start,並將產生的資源儲存為構件,您可以從 GitHub 上的「動作」索引標籤下載。如果您想了解更多關於動作的資訊,我們將在系列的下一篇文章中介紹。

總結

您現在知道了如何自動建立圖示庫。您可以將這些知識用於其他自動化操作,例如從外部資料來源動態產生形狀,或為 Sketch 不直接支援的格式編寫匯入器。

如果您想繼續探索,請嘗試看看是否可以擴展程式碼以實作更多 SVG 功能。或者嘗試將圖示庫發佈在公開網頁上(也許使用 GitHub Pages),並使用 RSS Feed 在 Sketch 中接收自動更新。


下一篇文章中,我們將更詳細地了解如何使用 GitHub 動作來為我們執行所有這些自動化操作,而無需任何介入。

您是否在本系列中建構了值得分享的東西?是否有自動化的想法,但需要開發方面的協助?對開發體驗有任何意見嗎?請透過 developer@sketch.com 與我們聯繫!

您可能也喜歡

免費試用 Sketch

無論您是 Sketch 新手,還是回來看看有什麼新功能,我們都能讓您在幾分鐘內設定好並準備好開始最佳工作。

免費開始使用
免費開始使用