| # @vitejs/plugin-vue [](https://npmjs.com/package/@vitejs/plugin-vue) | |
| > Note: as of `vue` 3.2.13+ and `@vitejs/plugin-vue` 1.9.0+, `@vue/compiler-sfc` is no longer required as a peer dependency. | |
| ```js | |
| // vite.config.js | |
| import vue from '@vitejs/plugin-vue' | |
| export default { | |
| plugins: [vue()] | |
| } | |
| ``` | |
| ## Options | |
| ```ts | |
| export interface Options { | |
| include?: string | RegExp | (string | RegExp)[] | |
| exclude?: string | RegExp | (string | RegExp)[] | |
| ssr?: boolean | |
| isProduction?: boolean | |
| /** | |
| * Transform Vue SFCs into custom elements (requires vue@^3.2.0) | |
| * - `true` -> all `*.vue` imports are converted into custom elements | |
| * - `string | RegExp` -> matched files are converted into custom elements | |
| * | |
| * @default /\.ce\.vue$/ | |
| */ | |
| customElement?: boolean | string | RegExp | (string | RegExp)[] | |
| /** | |
| * Enable Vue reactivity transform (experimental, requires vue@^3.2.25). | |
| * https://github.com/vuejs/core/tree/master/packages/reactivity-transform | |
| * | |
| * - `true`: transform will be enabled for all vue,js(x),ts(x) files except | |
| * those inside node_modules | |
| * - `string | RegExp`: apply to vue + only matched files (will include | |
| * node_modules, so specify directories in necessary) | |
| * - `false`: disable in all cases | |
| * | |
| * @default false | |
| */ | |
| reactivityTransform?: boolean | string | RegExp | (string | RegExp)[] | |
| // options to pass on to vue/compiler-sfc | |
| script?: Partial<Pick<SFCScriptCompileOptions, 'babelParserPlugins'>> | |
| template?: Partial< | |
| Pick< | |
| SFCTemplateCompileOptions, | |
| | 'compiler' | |
| | 'compilerOptions' | |
| | 'preprocessOptions' | |
| | 'preprocessCustomRequire' | |
| | 'transformAssetUrls' | |
| > | |
| > | |
| style?: Partial<Pick<SFCStyleCompileOptions, 'trim'>> | |
| } | |
| ``` | |
| ## Asset URL handling | |
| When `@vitejs/plugin-vue` compiles the `<template>` blocks in SFCs, it also converts any encountered asset URLs into ESM imports. | |
| For example, the following template snippet: | |
| ```vue | |
| <img src="../image.png" /> | |
| ``` | |
| Is the same as: | |
| ```vue | |
| <script setup> | |
| import _imports_0 from '../image.png' | |
| </script> | |
| <img :src="_imports_0" /> | |
| ``` | |
| By default the following tag/attribute combinations are transformed, and can be configured using the `template.transformAssetUrls` option. | |
| ```js | |
| { | |
| video: ['src', 'poster'], | |
| source: ['src'], | |
| img: ['src'], | |
| image: ['xlink:href', 'href'], | |
| use: ['xlink:href', 'href'] | |
| } | |
| ``` | |
| Note that only attribute values that are static strings are transformed. Otherwise, you'd need to import the asset manually, e.g. `import imgUrl from '../image.png'`. | |
| ## Example for passing options to `vue/compiler-sfc`: | |
| ```ts | |
| import vue from '@vitejs/plugin-vue' | |
| export default { | |
| plugins: [ | |
| vue({ | |
| template: { | |
| compilerOptions: { | |
| // ... | |
| }, | |
| transformAssetUrls: { | |
| // ... | |
| } | |
| } | |
| }) | |
| ] | |
| } | |
| ``` | |
| ## Example for transforming custom blocks | |
| ```ts | |
| import vue from '@vitejs/plugin-vue' | |
| import yaml from 'js-yaml' | |
| const vueI18nPlugin = { | |
| name: 'vue-i18n', | |
| transform(code, id) { | |
| if (!/vue&type=i18n/.test(id)) { | |
| return | |
| } | |
| if (/\.ya?ml$/.test(id)) { | |
| code = JSON.stringify(yaml.load(code.trim())) | |
| } | |
| return `export default Comp => { | |
| Comp.i18n = ${code} | |
| }` | |
| } | |
| } | |
| export default { | |
| plugins: [vue(), vueI18nPlugin] | |
| } | |
| ``` | |
| ## Using Vue SFCs as Custom Elements | |
| > Requires `vue@^3.2.0` & `@vitejs/plugin-vue@^1.4.0` | |
| Vue 3.2 introduces the `defineCustomElement` method, which works with SFCs. By default, `<style>` tags inside SFCs are extracted and merged into CSS files during build. However when shipping a library of custom elements, it may be desirable to inline the styles as JavaScript strings and inject them into the custom elements' shadow root instead. | |
| Starting in 1.4.0, files ending with `*.ce.vue` will be compiled in "custom elements" mode: its `<style>` tags are compiled into inlined CSS strings and attached to the component as its `styles` property: | |
| ```js | |
| import { defineCustomElement } from 'vue' | |
| import Example from './Example.ce.vue' | |
| console.log(Example.styles) // ['/* css content */'] | |
| // register | |
| customElements.define('my-example', defineCustomElement(Example)) | |
| ``` | |
| Note in custom elements mode there is no need to use `<style scoped>` since the CSS is already scoped inside the shadow DOM. | |
| The `customElement` plugin option can be used to configure the behavior: | |
| - `{ customElement: true }` will import all `*.vue` files in custom element mode. | |
| - Use a string or regex pattern to change how files should be loaded as Custom Elements (this check is applied after `include` and `exclude` matches). | |
| ## License | |
| MIT | |