意見徵求:套件匯入器

由 James Stuckey Weber 發佈於 2023 年 9 月 26 日

Sass 的使用者經常需要使用來自 dependency 的樣式來自訂現有的主題或存取樣式工具程式。從前,Sass 並未指定一個標準方法來使用來自 dependency 的套件。這導致了各種特定領域的解決方案,包括 Webpack 中的 ~ 前綴,以及將 node_modules 加入 loadPaths

這一直是一個常見的痛點,並且可能使得依賴 dependency 變得困難。它也可能使得將您的專案移至新的建置流程更加困難。

套件匯入器套件匯入器 永久連結

我們提議一種新型的匯入器,允許使用者使用 pkg: 網址格式指示 Sass 使用特定環境的解析標準和慣例來解析 dependency 網址。

為了滿足最大的使用案例,我們提議為 Node 生態系統內建一個套件匯入器。我們的建議是,套件作者在其發佈的 package.json 中,為其套件的進入點定義一個 sass 條件式匯出。例如,一個包含以下內容的 package.json

{
  "exports": {
    ".": {
      "sass": "./src/scss/index.scss",
      "import": "./dist/js/index.mjs",
      "default": "./dist/js/index.js"
    },
    "./utils": {
      "sass": "./src/scss/_utils.scss",
      "default": "./dist/js/utils.js"
    }
  }
}

將允許套件使用者撰寫

@use "pkg:library";
@use "pkg:library/utils";

我們希望允許 Sass 套件使用者開始使用 pkg: 網址,而無需套件作者進行更改。由於許多 Sass 套件已經以各種方式定義了它們的進入點,因此 Node 套件匯入器也支援其他幾種定義進入點的方式,涵蓋了我們觀察到的大多數實作方式。這些解析方式會按照以下順序進行:

  1. 解析為 Sass 或 CSS 檔案的 package.json exports 中的 sassstyledefault 條件。

  2. 如果沒有子路徑,則尋找根匯出

    1. package.json 根目錄下的 sass 鍵值。

    2. package.json 根目錄下的 style 鍵值。

    3. 套件根目錄下的 index 檔案,解析檔案副檔名和部分檔案。

  3. 如果有子路徑,則解析相對於套件根目錄的該路徑,並解析檔案副檔名和部分檔案。

為了更好地理解並允許針對建議的演算法進行測試,我們建立了一個 Sass pkg: 測試 儲存庫,其中包含該演算法的初步實作。

詳細資訊詳細資訊 永久連結

由於 Node 生態系統主要關注於發佈 JavaScript,因此我們需要找到一種方法來允許套件作者發佈 Sass。在許多方面,最接近的類比是 TypeScript 類型,因為類型定義檔案與編譯後的程式碼一起發佈,而且通常不是套件中的主要匯出。

根據我們對超過 400 個設計函式庫和框架套件的分析,我們預計套件使用者將能夠為許多套件使用 pkg: 網址,而無需套件作者進行更改。套件作者將能夠更好地指定和記錄如何使用這些套件。

我們的分析還顯示,發佈 Sass 的套件幾乎總是與 JavaScript 程式碼一起發佈。有些套件在 package.json 的根目錄下將 Sass 檔案指定為 sass 鍵值,或將 CSS 檔案指定為 style 鍵值,Node 套件匯入器將支援這兩種方式。我們觀察到很少使用 mainmodule 鍵值來處理 CSS 或 Sass,因此將不支援這些方式。

雖然目前我們觀察到使用`條件式匯出`欄位來指定 Sass 和 CSS 檔案的情況並不多,但隨著套件作者採用條件式匯出,我們預計使用率會有所增長。此外,像 ViteParcelWebpack 的 Sass Loader 等建置工具目前都是使用 `sass` 和 `style` 自訂條件來解析 Sass 路徑。

使用者需要透過從 `sass` 匯入 `nodePackageImporter` 並將其包含在 `importers` 列表中來選擇使用新的套件匯入器。這在瀏覽器中的 Sass 中將無法使用。

const sass = require('sass');

sass.compile('style.scss', {
    importers: [sass.nodePackageImporter]
})

後續步驟後續步驟的永久連結

這仍在提案階段,因此我們樂於接受任何意見回饋。請在 Github 上檢視提案,並提出 issue 來分享您的任何想法或疑慮。