【譯】Vue 的小奇技(第三篇):用 PurgeCSS 移除不需要的 CSS

程式猿何大叔發表於2019-03-03

特別宣告:本文是作者 Alex Jover 釋出在 VueDose 上的一個系列。

版權歸作者所有。

譯者在翻譯前已經和作者溝通得到了翻譯整個系列的授權。

為了不影響大家閱讀,獲得授權的記錄會放在本文的最後。

我們有很多可以提高 web 效能的方法,而其中一種就是把所不需要的 JS 和 CSS,從我們的應用中全部移除掉。

當我們需要面對大型應用或者老舊專案,且其中使用了類似 Bootstrap、Bulma 或 Tailwind 這種框架時,移除不需要的 CSS 程式碼就變得尤為重要。

PurgeCSS 是一個能夠通過字串對比,來決定移除不需要的 CSS 的工具。這能帶來一些好處,但也存在要注意的點,所以特別留意一下我接下來要提到的白名單部分。

舉個例子,VueDose’s website 是建立在應用框架 Nuxt 和 UI 框架 Tailwind 之上的,並且通過 PurgeCSS 這個工具來優化了 CSS 程式碼。

在不啟用 PurgeCSS 時,你可以看到 tailwind.css 這檔案足足有 485 KB:

【譯】Vue 的小奇技(第三篇):用 PurgeCSS 移除不需要的 CSS

在啟用 PurgeCSS 後,tailwind.css 直接被壓縮到了 16 KB:

【譯】Vue 的小奇技(第三篇):用 PurgeCSS 移除不需要的 CSS

對於 PurgeCSS 的配置因專案不同而異,它不僅可以作為 webpack 的外掛,還可以作為 postcss 的外掛。

以 VueDose 官網為例,我將 PurgeCSS 用作為 postcss 的外掛,併為該專案建立瞭如下的 postcss.config.js 配置檔案:

const purgecss = require("@fullhuman/postcss-purgecss");

const plugins = [
    // ...
];

if (process.env.NODE_ENV === "production") {
  plugins.push(
    purgecss({
      content: [
        "./layouts/**/*.vue",
        "./components/**/*.vue",
        "./pages/**/*.vue"
      ],
      whitelist: ["html", "body"],
      whitelistPatternsChildren: [/^token/, /^pre/, /^code/],
    })
  );
}

module.exports = { plugins };
複製程式碼

首先,你所要做的就是使用 content 欄位,來告訴 PurgeCSS 去哪裡查詢將要對應匹配的 class。

其次,對於一些你不想要移除的 class 或者某些標籤上對應的樣式名稱,你可以它們加到白名單欄位中。你至少需要新增 htmlbody 標籤以及任意的動態 class 樣式名稱到白名單配置欄位中。

在我的 VueDose 官網專案中,我使用了 prismjs 來高亮程式碼段,這個庫會新增一些名為 token 的 class,以及一些樣式程式碼到 precode 元素上。為了能夠排除掉這些不需要應用 PurgeCSS 的地方,我用上了 whitelistPatternsChildren 這個屬性。

另外的,Tailwind 需要一個自定義 extractor 來與 PurgeCSS 配合使用。VueDose 官網專案中所使用的 postcss.config.js 配置檔案,其所有內容如下所示:

const join = require("path").join;
const tailwindJS = join(__dirname, "tailwind.js");
const purgecss = require("@fullhuman/postcss-purgecss");

class TailwindExtractor {
  static extract(content) {
    return content.match(/[A-Za-z0-9-_:\/]+/g) || [];
  }
}

const plugins = [require("tailwindcss")(tailwindJS), require("autoprefixer")];

if (process.env.NODE_ENV === "production") {
  plugins.push(
    purgecss({
      content: [
        "./layouts/**/*.vue",
        "./components/**/*.vue",
        "./pages/**/*.vue"
      ],
      whitelist: ["html", "body"],
      whitelistPatternsChildren: [/^token/, /^pre/, /^code/],
      extractors: [
        {
          extractor: TailwindExtractor,
          extensions: ["html", "vue"]
        }
      ]
    })
  );
}

module.exports = {
  plugins
};
複製程式碼

這就是今天的內容啦~

你可以線上閱讀這篇 原文,裡面有可供複製貼上的原始碼。如果你喜歡這個系列的話,請分享給你的同事們!

下週再見哦。

結語

此係列的其他文章,會同步系列官網的釋出情況,及時地翻譯釋出到掘金。請持續關注「程式猿何大叔」,相信我會給大家帶來更多優質的內容,不要忘了點贊~

如果想要了解譯者的更多,請查閱如下:

請求翻譯授權記錄

請求翻譯授權記錄

微信公眾號
覺得本文不錯的話,分享一下給小夥伴吧~

相關文章