意見徵求:套件匯入器
由 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 套件匯入器也支援其他幾種定義進入點的方式,涵蓋了我們觀察到的大多數實作方式。這些解析方式會按照以下順序進行:
-
解析為 Sass 或 CSS 檔案的
package.json
exports
中的sass
、style
或default
條件。 -
如果沒有子路徑,則尋找根匯出
-
package.json
根目錄下的sass
鍵值。 -
package.json
根目錄下的style
鍵值。 -
套件根目錄下的
index
檔案,解析檔案副檔名和部分檔案。
-
-
如果有子路徑,則解析相對於套件根目錄的該路徑,並解析檔案副檔名和部分檔案。
為了更好地理解並允許針對建議的演算法進行測試,我們建立了一個 Sass pkg: 測試 儲存庫,其中包含該演算法的初步實作。
詳細資訊詳細資訊 永久連結
由於 Node 生態系統主要關注於發佈 JavaScript,因此我們需要找到一種方法來允許套件作者發佈 Sass。在許多方面,最接近的類比是 TypeScript 類型,因為類型定義檔案與編譯後的程式碼一起發佈,而且通常不是套件中的主要匯出。
根據我們對超過 400 個設計函式庫和框架套件的分析,我們預計套件使用者將能夠為許多套件使用 pkg:
網址,而無需套件作者進行更改。套件作者將能夠更好地指定和記錄如何使用這些套件。
我們的分析還顯示,發佈 Sass 的套件幾乎總是與 JavaScript 程式碼一起發佈。有些套件在 package.json
的根目錄下將 Sass 檔案指定為 sass
鍵值,或將 CSS 檔案指定為 style
鍵值,Node 套件匯入器將支援這兩種方式。我們觀察到很少使用 main
或 module
鍵值來處理 CSS 或 Sass,因此將不支援這些方式。
雖然目前我們觀察到使用`條件式匯出`欄位來指定 Sass 和 CSS 檔案的情況並不多,但隨著套件作者採用條件式匯出,我們預計使用率會有所增長。此外,像 Vite、Parcel 和 Webpack 的 Sass Loader 等建置工具目前都是使用 `sass` 和 `style` 自訂條件來解析 Sass 路徑。
使用者需要透過從 `sass` 匯入 `nodePackageImporter` 並將其包含在 `importers` 列表中來選擇使用新的套件匯入器。這在瀏覽器中的 Sass 中將無法使用。
const sass = require('sass');
sass.compile('style.scss', {
importers: [sass.nodePackageImporter]
})
後續步驟後續步驟的永久連結
這仍在提案階段,因此我們樂於接受任何意見回饋。請在 Github 上檢視提案,並提出 issue 來分享您的任何想法或疑慮。