Skip to content

Migration from Vue CLI ​

NOTE

This guide assumes that you are familiar with Vite. A good way to start learning more is to read the Why Vite Guide, and Next generation frontend tooling with ViteJS, a stream where Evan You did a demo explaining the main concepts.

Vue CLI has entered maintainance mode. Vue team recommend Vite for new Vue projects. However, Vuetify 2 does not have an official vite plugin to serve the same role as Vuetify loader in Webpack. It doesn't matter, with unplugin-vue-components and built-in css pre-processing features of Vite. We can easily migrate our Vuetify 2 project to Vite.

Auto Import Vuetify 2 components ​

First install the plugin

bash
pnpm install unplugin-vue-components -D
pnpm install unplugin-vue-components -D

Then add the plugin in vite.config.ts

ts
import { defineConfig } from 'vite'
import vue2 from '@vitejs/plugin-vue2'
import Components from 'unplugin-vue-components/vite'
import { VuetifyResolver } from 'unplugin-vue-components/resolvers'

defineComponent({
  plugins: [
     vue2(),
     Components({
        resolvers: [VuetifyResolver()],
     })
  ]
})
import { defineConfig } from 'vite'
import vue2 from '@vitejs/plugin-vue2'
import Components from 'unplugin-vue-components/vite'
import { VuetifyResolver } from 'unplugin-vue-components/resolvers'

defineComponent({
  plugins: [
     vue2(),
     Components({
        resolvers: [VuetifyResolver()],
     })
  ]
})

Custom Resolver ​

Note the built-in Vuetify resolver in this plugin is quite brutal, all the components whose name begin with V and a captial letter will be considered as Vuetify components, for example <VChart />. So I define a custom resolver which can exclude specific components.

ts
Components({
  resolvers: [
    {
      type: 'component',
      resolve: (name: string) => {
        const blackList = ['VChart', 'VHeadCard']
        if (name.match(/^V[A-Z]/) && !blackList.includes(name))
          return { name, from: 'vuetify/lib' }
      },
    },
  ],
  dts: false,
  types: [],
}),
Components({
  resolvers: [
    {
      type: 'component',
      resolve: (name: string) => {
        const blackList = ['VChart', 'VHeadCard']
        if (name.match(/^V[A-Z]/) && !blackList.includes(name))
          return { name, from: 'vuetify/lib' }
      },
    },
  ],
  dts: false,
  types: [],
}),

In the above example, <VChart /> and <VHeadCard /> will not be considered as Vuetify components and not auto imported.

Custom Sass variables ​

Another feature of Vuetify Loader is loading custom Sass variables of Vuetify. This can be achieved by CSS Pre-processors of Vite.

ts
defineComponent({
  css: {
    // https://vitejs.dev/config/#css-preprocessoroptions
    preprocessorOptions: {
      sass: {
        additionalData: [
          // vuetify variable overrides
          '@import "@/styles/variables.scss"',
          '',
        ].join('\n'),
      },
    },
  },
})
defineComponent({
  css: {
    // https://vitejs.dev/config/#css-preprocessoroptions
    preprocessorOptions: {
      sass: {
        additionalData: [
          // vuetify variable overrides
          '@import "@/styles/variables.scss"',
          '',
        ].join('\n'),
      },
    },
  },
})

Released under the MIT License.