在webstorm 中识别vite alias @

18 min read

在webstorm 中识别vite alias @

tsconfig.json compilerOptions 配置 paths baseUrl

{
  "extends": "@vue/tsconfig/tsconfig.web.json",
  "compilerOptions": {
    "baseUrl": ".",
    "allowJs": true,
    "sourceMap": true,
    "noUnusedLocals": true,
    "noEmit": false,
    "lib": ["esnext", "dom", "dom.iterable"],
    "types": ["node", "vite/client", "unplugin-vue-define-options", "unplugin-icons/types/vue"],
    "noImplicitAny": false,
    "allowSyntheticDefaultImports": true,
    "paths": {
      "@/*": ["./src/*"],
      "~/*": ["src/*"],
      "#/*": ["types/*"],
      "preact/*": ["./types/empty.d.ts"]
    }
  },
  "include": ["vite.config.*", "types/**/*", "src/**/*", "src/**/*.vue", "build/**/*", ],
  "exclude": ["node_modules", "dist"]
}

vite.config.ts

import path from 'path'

import { defineConfig, loadEnv } from 'vite'
import Vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
import DefineOptions from 'unplugin-vue-define-options/vite'
import WindiCSS from 'vite-plugin-windicss'
import Components from 'unplugin-vue-components/vite'
import AutoImport from 'unplugin-auto-import/vite'
import Icons from 'unplugin-icons/vite'
import IconsResolver from 'unplugin-icons/resolver'
import Inspect from 'vite-plugin-inspect'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
import { FileSystemIconLoader } from 'unplugin-icons/loaders'
import { wrapperEnv } from './build/utils'
import { createProxy } from './build/vite/proxy'

import type { ConfigEnv } from 'vite'

export default defineConfig(({ mode }: ConfigEnv) => {
  const root = process.cwd()
  const env = loadEnv(mode, root)
  const viteEnv = wrapperEnv(env)
  const { VITE_PROXY, VITE_PORT } = viteEnv
  return {
    server: {
      host: true,
      port: VITE_PORT,
      proxy: createProxy(VITE_PROXY),
    },
    plugins: [
      Vue(),
      vueJsx(),
      DefineOptions(),
      AutoImport({
        imports: ['vue', 'vue-router', 'pinia'],
        resolvers: [
          ElementPlusResolver(),
        ],
        dts: 'src/auto-imports.d.ts',
      }),
      Components({
        dts: 'src/components.d.ts',
        resolvers: [
          ElementPlusResolver({ importStyle: 'sass' }),
          IconsResolver({
            prefix: 'icon',
            customCollections: ['custom'],
            enabledCollections: ['ep', 'ri'],
          }),
        ],
      }),
      Icons({
        scale: 1,
        customCollections: {
          custom: FileSystemIconLoader(
            './src/assets/icons',
            svg => svg.replace(/^<svg /, '<svg fill="currentColor" '),
          ),
        },
      }),
      WindiCSS(),
      Inspect(),
    ],
    resolve: {
      alias: [
        { find: '/^~/', replacement: '' },
        { find: '@', replacement: path.resolve(__dirname, 'src') },
        { find: '~@', replacement: path.resolve(__dirname, 'src') },
      ],
    },
    css: {
      preprocessorOptions: {
        scss: {
          additionalData: `
          @use "@/styles/element/index.scss" as *;
        `,
        },
      },
    },
  }
})