Featured image of post Vite外掛開發:從零到量產Featured image of post Vite外掛開發:從零到量產

Vite外掛開發:從零到量產

開發 Vite 插件的完整指南,涵蓋插件 API、Rollup 相容性、虛擬模組、HMR 整合、配置解析和發佈到 npm。

Vite 的插件系統是其最強大的功能之一,可讓開發人員擴展和自訂建置管道。無論您需要轉換文件類型、注入建置時常數或與其他工具集成,Vite 外掛程式 API 都可以讓您完全掌控。

了解Vite的插件系統

Vite 插件是具有鉤子函數的對象,在建置生命週期中以特定積分執行。外掛程式分三個階段運作:服務(開發伺服器)、建置(生產)和 SSR。一個基本的插件如下所示:

import type { Plugin } from 'vite';

export function myPlugin(): Plugin {
  return {
    name: 'my-plugin',
    config(config) {
      return config;
    },
    transform(code, id) {
      if (id.endsWith('.custom')) {
        return { code: `export default ${JSON.stringify(code)}`, map: null };
      }
    },
  };
}

偵錯需要 name 屬性。 enforce: 'pre''post' 控制相對於其他外掛程式的執行順序。


匯總相容性

Vite 的插件介面擴展了 Rollup 的接口,這意味著大多數 Rollup 插件可以開箱即用地與 Vite 配合使用。共用掛鉤包括 resolveIdloadtransformbuildEnd。 Vite 特定的鉤子添加了開發伺服器功能:

目的
佔位符_0解析前修改Vite配置服務+建置
佔位符_0閱讀最終解決的配置服務+建置
佔位符_0擴充開發伺服器只提供
佔位符_0自訂 HMR 行為只提供

將 Rollup 外掛程式移植到 Vite 時,請確保它不會在開發伺服器上下文中錯誤地使用 Rollup 特定的 API,例如 this.emitFile


虛擬模組

虛擬模組僅在建置時存在,由插件程式碼而不是檔案系統檔案產生:

const VIRTUAL_MODULE = 'virtual:config';

export function configPlugin(): Plugin {
  return {
    name: 'config-plugin',
    resolveId(id) {
      if (id === VIRTUAL_MODULE) return '\0' + VIRTUAL_MODULE;
    },
    load(id) {
      if (id === '\0' + VIRTUAL_MODULE) {
        const config = { apiUrl: process.env.API_URL };
        return `export default ${JSON.stringify(config)}`;
      }
    },
  };
}

\0 前綴是用來標記已解析虛擬模組的 Rollup 約定。用例包括注入 polyfill、提供建置時常數以及從設定檔產生程式碼。


HMR 集成

熱模組更換可保持快速的開發體驗。 handleHotUpdate 掛鉤可讓您自訂哪些模組無效:

handleHotUpdate({ server, modules, timestamp }) {
  if (modules.every(m => m.url.includes('node_modules'))) {
    return [];
  }
  server.ws.send({
    type: 'custom',
    event: 'custom-update',
    data: { timestamp },
  });
  return modules;
}

傳回一個空數組以抑制 HMR,或傳回一個過濾列表以進行粒度更新而不是完全重新載入。


測試與發布

使用 Vite 的程式設計 API 整合測試您的插件:

import { build } from 'vite';

const result = await build({
  plugins: [testPlugin({ option: 'value' })],
  logLevel: 'silent',
});

發佈時,請遵循 vite-plugin-* 命名約定,將 vite 列為對等依賴項,並包含 TypeScript 聲明。在 CI 中跨多個 Vite 版本進行測試,以便及早發現重大變更。


Vite 的插件 API 設計精良、簡單、強大。從簡單的轉換開始,探索用於建構時程式碼產生的虛擬模組,並利用 HMR 掛鉤來獲得精美的開發體驗。