--- outline: deep lastUpdated: false --- # Getting Started ## Overview **Unplugin** is a library that offers a unified plugin system for various build tools. It extends the excellent [Rollup plugin API](https://rollupjs.org/plugin-development/#plugins-overview) to serve as the standard plugin interface, and provides a compatibility layer based on the build tools employed. **Unplugin** currently supports: - [Vite](https://vite.dev/) - [Rollup](https://rollupjs.org/) - [webpack](https://webpack.js.org/) - [esbuild](https://esbuild.github.io/) - [Rspack](https://www.rspack.dev/) - [Rolldown](https://rolldown.rs/) - [Farm](https://www.farmfe.org/) - [Bun](https://bun.com/) ## Trying It Online You can try **Unplugin** in your browser directly. [![open](/open_in_codeflow.svg)](https://stackblitz.com/~/github.com/yuyinws/unplugin-starter?file=src/index.ts) ## Creating an Unplugin package ### Templates - [unplugin/unplugin-starter](https://github.com/unplugin/unplugin-starter) - [sxzz/unplugin-starter](https://github.com/sxzz/unplugin-starter) Check repositories above for more details. ## Plugin Installation ### Pre-requisites - Node.js 18.12.0 or later. - webpack 5 or later, if you are using webpack. ### Install package ::: code-group ```bash [npm] npm install unplugin-starter --save-dev ``` ```bash [yarn] yarn add unplugin-starter -D ``` ```bash [pnpm] pnpm add unplugin-starter -D ``` ```bash [bun] bun add unplugin-starter -D ``` ::: ### Bundler & Framework Integration ::: code-group ```ts [Vite] // vite.config.ts import Starter from 'unplugin-starter/vite' export default defineConfig({ plugins: [ Starter({ /* options */ }), ], }) ``` ```js [Rollup] // rollup.config.js import Starter from 'unplugin-starter/rollup' export default { plugins: [ Starter({ /* options */ }), ], } ``` ```js [Rolldown] // rolldown.config.js import Starter from 'unplugin-starter/rolldown' export default { plugins: [ Starter({ /* options */ }), ], } ``` ```js [webpack] // webpack.config.js module.exports = { /* ... */ plugins: [ require('unplugin-starter/webpack')({ /* options */ }), ], } ``` ```js [Rspack] // rspack.config.js module.exports = { /* ... */ plugins: [ require('unplugin-starter/rspack')({ /* options */ }), ], } ``` ```js [esbuild] // esbuild.config.js import { build } from 'esbuild' import Starter from 'unplugin-starter/esbuild' build({ plugins: [Starter()], }) ``` ```ts [Farm] // farm.config.ts import Starter from 'unplugin-starter/farm' export default defineConfig({ plugins: [ Starter({ /* options */ }), ], }) ``` ```ts [Bun] // bun.config.ts import Starter from 'unplugin-starter/bun' await Bun.build({ entrypoints: ['./src/index.ts'], outdir: './dist', plugins: [ Starter({ /* options */ }), ], }) ``` ```js [Vue-CLI] // vue.config.js module.exports = { configureWebpack: { plugins: [ require('unplugin-starter/webpack')({ /* options */ }), ], }, } ``` ```js [Nuxt] // nuxt.config.ts export default defineNuxtConfig({ modules: [ [ 'unplugin-starter/nuxt', { /* options */ }, ], ], }) ``` ```js [Astro] // astro.config.mjs import { defineConfig } from 'astro/config' import Starter from 'unplugin-turbo-console/astro' // https://astro.build/config export default defineConfig({ integrations: [Starter()], }) ``` ## Supported Hooks | Hook | Rollup | Vite | webpack | esbuild | Rspack | Farm | Rolldown | Bun | | --------------------------------------------------------------------------------- | :-------------: | :--: | :-----: | :-------------: | :-------------: | :--: | :------: | :-------------: | | [`enforce`](https://vite.dev/guide/api-plugin.html#plugin-ordering) | ❌ 1 | ✅ | ✅ | ❌ 1 | ✅ | ✅ | ✅ | ❌ | | [`buildStart`](https://rollupjs.org/plugin-development/#buildstart) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | [`resolveId`](https://rollupjs.org/plugin-development/#resolveid) | ✅ | ✅ | ✅ | ✅ | ✅ 5 | ✅ | ✅ | ✅ | | ~~`loadInclude`~~2 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | [`load`](https://rollupjs.org/plugin-development/#load) | ✅ | ✅ | ✅ | ✅ 3 | ✅ | ✅ | ✅ | ✅ | | ~~`transformInclude`~~2 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | [`transform`](https://rollupjs.org/plugin-development/#transform) | ✅ | ✅ | ✅ | ✅ 3 | ✅ | ✅ | ✅ | ✅ | | [`watchChange`](https://rollupjs.org/plugin-development/#watchchange) | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❌ | | [`buildEnd`](https://rollupjs.org/plugin-development/#buildend) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ 6 | | [`writeBundle`](https://rollupjs.org/plugin-development/#writebundle)4 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ 6 | ::: details Notice 1. Rollup and esbuild do not support using `enforce` to control the order of plugins. Users need to maintain the order manually. 2. Webpack's id filter is outside of loader logic; an additional hook is needed for better performance on Webpack and Rolldown. However, it is now deprecated. Please use `transform/load/resolveId.filter` instead. In Rollup, this hook has been polyfilled to match the behaviors. See the following usage examples for reference. 3. Although esbuild can handle both JavaScript and CSS and many other file formats, you can only return JavaScript in `load` and `transform` results. 4. Currently, `writeBundle` is only serves as a hook for the timing. It doesn't pass any arguments. 5. Rspack supports `resolveId` with a minimum required version of v1.0.0-alpha.1. 6. Bun's plugin API doesn't have an `onEnd` hook yet, so `buildEnd` and `writeBundle` are not supported. ::: ### Usage ```ts{12-14,16-18} twoslash import type { UnpluginFactory } from 'unplugin' import { createUnplugin } from 'unplugin' export interface Options { // define your plugin options here } export const unpluginFactory: UnpluginFactory = options => ({ name: 'unplugin-starter', transform: { // an additional hook is needed for better perf on webpack and rolldown filter: { id: /main\.ts$/ }, handler(code) { return code.replace(/