4 - 《vite常用配置和插件》

1,242 阅读4分钟

常用配置

vite.config.js

import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import vueJsx from "@vitejs/plugin-vue-jsx";
import path from "path";

export default defineConfig({
  plugins: [vue(), vueJsx()],
  //静态资源服务的文件夹
  publicDir: "public",
  base: './',
  //静态资源处理
  assetsInclude: "",
  //控制台输出的级别 info 、warn、error、silent
  logLevel: "info",
  // 设为false 可以避免 vite 清屏而错过在终端中打印某些关键信息
  clearScreen: true,
  //本地运行配置,以及反向代理配置
  server: {
    host: true, // 默认 "localhost" 可以设置为'0.0.0.0' or true
    https: false,//是否启用 http 2
    cors: true,//为开发服务器配置 CORS , 默认启用并允许任何源
    open: true,//服务启动时自动在浏览器中打开应用
    port: 3000, // 端口
    strictPort: false, //设为true时端口被占用则直接退出,不会尝试下一个可用端口
    force: true,//是否强制依赖预构建
    hmr: false,//禁用或配置 HMR 连接
    // 传递给 chockidar 的文件系统监视器选项
    watch: {
      ignored: ["!**/node_modules/your-package-name/**"]
    },
    /* 设置代理 */
    proxy: {
      "/api": {
        target: "http://jsonplaceholder.typicode.com",
        changeOrigin: true,  // 改变来源
        rewrite: path => path.replace(/^\/api/, "")  // 重写path
      }
    }
  },
  resolve: {
    /* 设置路径别名 */
    alias: {
      '@': path.resolve(__dirname, './src')
    },
    // 情景导出 package.json 配置中的exports字段
    conditions: [],
    /* 使用路径别名时想要省略的后缀名 可以自己 增减 不建议使用 .vue 影响IDE和类型支持 */
    extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue']
  },
  css: {
    // 配置 css modules 的行为
    modules: {
      localsConvention: 'camelCase', // 默认只支持驼峰,修改为同时支持横线和驼峰
    },
    //指定传递给 css 预处理器的选项
    preprocessorOptions: {
      scss: {
        charset: false,
      },
      less: {
        charset: false,
      },
    },
    // TODO 构建包含@charset问题 https://github.com/vitejs/vite/issues/5833
    // charset: false,
    postcss: {
      plugins: [
        {
          postcssPlugin: 'internal:charset-removal',
          AtRule: {
            charset: (atRule) => {
              if (atRule.name === 'charset') {
                atRule.remove();
              }
            },
          },
        },
      ],
    },
    // css预设的配置
    preprocessorOptions: {
      scss: {
        /* 自动引入全局scss文件 */
        additionalData: {
          `@import "@/assets/scss/variable.scss";
                 @import "@/assets/scss/mixin.scss";
                 @import "@/assets/scss/helper.scss";
                `
      }
    }
  },
  json: {
    //是否支持从 .json 文件中进行按名导入
    namedExports: true,
    //若设置为 true 导入的json会被转为 export default JSON.parse("..") 会比转译成对象字面量性能更好
    stringify: false
  },
  //继承自 esbuild 转换选项,最常见的用例是自定义 JSX
  esbuild: {
    jsxFactory: "h",
    jsxFragment: "Fragment",
    jsxInject: `import Vue from 'vue'`
  },
  //打包配置
  build: {
    target: 'modules', // 设置最终构建的浏览器兼容目标。默认值是一个 Vite 特有的值——'modules'  还可设置为 'es2015' 'es2016'等
    outDir: "dist",//指定输出路径
    assetsDir: "assets",//生成静态资源的存放路径
    assetsInlineLimit: 4096, //小于此阈值的导入或引用资源将内联为 base64 编码,以避免额外的 http 请求。设置为 0 可以完全禁用此项
    cssCodeSplit: true, // 如果设置为false,整个项目中的所有 CSS 将被提取到一个 CSS 文件中
    sourcemap: false, // 构建后是否生成 source map 文件。如果为 true,将会创建一个独立的 source map 文件
    chunkSizeWarningLimit: 550, // 单位kb  打包后文件大小警告的限制 (文件大于此此值会出现警告)
    assetsInlineLimit: 4096, // 单位字节(1024等于1kb) 小于此阈值的导入或引用资源将内联为 base64 编码,以避免额外的 http 请求。设置为 0 可以完全禁用此项。
    minify: 'terser', // 'terser' 相对较慢,但大多数情况下构建后的文件体积更小。'esbuild' 最小化混淆更快但构建后的文件相对更大。
    write: true, //设置为 false 来禁用将构建后的文件写入磁盘
    emptyOutDir: true, //默认情况下,若 outDir 在 root 目录下,则 Vite 会在构建时清空该目录。
    brotliSize: true, //启用/禁用 brotli 压缩大小报告
    chunkSizeWarningLimit: 500,//chunk 大小警告的限制
    // 传递给 Terser 的更多 minify 选项。
    terserOptions: {
      compress: {
        drop_console: true, // 生产环境去除console
        drop_debugger: true, // 生产环境去除debugger
      },
    },
    // 自定义底层的 Rollup 打包配置
    rollupOptions: {
      input: {
        main: resolve(__dirname, 'index.html'),
        preview: resolve(__dirname, 'preview/index.html'),
      },
      output: {
        manualChunks: {
          jsonWorker: [`${prefix}/language/json/json.worker`],
          cssWorker: [`${prefix}/language/css/css.worker`],
          htmlWorker: [`${prefix}/language/html/html.worker`],
          tsWorker: [`${prefix}/language/typescript/ts.worker`],
          editorWorker: [`${prefix}/editor/editor.worker`],
        },
      },
      /* 确保外部化处理那些你不想打包进库的依赖 */
      external: ['vue', 'element-plus'],
      output: {
        /* 在 UMD 构建模式下为这些外部化的依赖提供一个全局变量 */
        globals: {
          vue: 'Vue',
          'element-plus': 'ELEMENT',
        }
      }
    },
    //@rollup/plugin-commonjs 插件的选项
    commonjsOptions:{},
    //构建的库
    lib: {
      // 打包入口,entry 是必需的,因为库不能使用 HTML 作为入口
      entry: resolve(__dirname, 'src/packages/index.ts'),
      // 暴露的全局变量,并且在 formats 包含 'umd' 或 'iife' 时是必需的
      name:"MyLib",
      // 需要打包的格式 默认 formats 是 ['es', 'umd'],如果使用了多个配置入口,则是 ['es', 'cjs']
      formats: ['es'],
      // 输出的包文件名 默认 fileName 是 package.json 的 name 选项,可以被定义为参数为 format 和 entryAlias 的函数
      fileName: 'index',
    },
  },
  // 默认情况下,不在 node_modules 中的,链接的包不会被预构建。使用此选项可强制预构建链接的包
  optimizeDeps: {
    //检测需要预构建的依赖项
    entries: [],
    //默认情况下,不在 node_modules 中的,链接的包不会预构建
    include: ['axios','@/../lib/vuedraggable/dist/vuedraggable.umd.js'],
    exclude: ['your-package-name'], //排除在优化之外
  },

});

Plugin

名称描述
@vitejs/plugin-vue解析vue
@vitejs/plugin-vue-jsx添加jsx/tsx支持
@vitejs/plugin-legacy生产构建时提供浏览器支持
vite-plugin-svg-icons处理和优化svg图标
vite-plugin-vue-images自动导入图片
vite-plugin-vue-setup-extend不用写两个script标签,可以直接在script标签上定义name
vite-plugin-mockmock数据(需要安装mockjs yarn add mockjs)
vite-plugin-pages根据目录结构自动生成路由
vite-plugin-vue-layoutslayout配置,和vite-plugin-pages搭配使用
vite-plugin-md使用 Markdown 作为 Vue 组件,在 Markdown 中使用 Vue 组件
vite-plugin-windicsswindicss插件
vite-plugin-inspect检查 Vite 插件的中间状态。用于调试和创作插件
vite-plugin-imagemin一个压缩图片资产的vite插件
@intlify/vite-plugin-vue-i18n多语言配置
@rollup/plugin-commonjs解决引入commonjs模块后打包出现的{'default' is not exported by XXX}错误
rollup-plugin-visualizer可视化Bundle
unplugin-auto-import实现自动导入,无需import即可在文件里使用Vue的API
unplugin-vue-components按需导入组件,可以和ui库搭配使用
unplugin-vue-macros宏和语法糖的扩展
unplugin-vue-define-optionssetup中使用defineOptions宏
unocsscss原子化引擎
vitest单元测试

use Plugin

import path from 'path'
// 处理vue和jsx
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'

// svg配置
import viteSvgIcons from 'vite-plugin-svg-icons'

// 处理commjs模块
import commonjs from '@rollup/plugin-commonjs'

// 可视化bundle
import visualizer from 'rollup-plugin-visualizer'

// 处理script setup name
import VueSetupExtend from 'vite-plugin-vue-setup-extend'

// 自动导入
import AutoImport from 'unplugin-auto-import/vite'

// 图片导入配置
import ViteImages from 'vite-plugin-vue-images'

// mock配置
import { viteMockServe } from "vite-plugin-mock"

// 自动注册页面配置
import Pages from 'vite-plugin-pages'
import Layouts from 'vite-plugin-vue-layouts'

// 按需导入组件配置
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers';

// markedown配置
import Markdown from 'vite-plugin-md'
import Prism from 'markdown-it-prism'
import LinkAttributes from 'markdown-it-link-attributes'

// 多语言配置
import VueI18n from '@intlify/vite-plugin-vue-i18n'

// unocss配置
import Unocss from 'unocss/vite'

// 调试vite
import Inspect from 'vite-plugin-inspect'

// 使用宏和语法糖
import VueMacros from 'unplugin-vue-macros/vite';

// 使用windicss
import WindiCSS from 'vite-plugin-windicss';

// 压缩图片
import viteImagemin from 'vite-plugin-imagemin'

// defintOptions
import DefineOptions from 'unplugin-vue-define-options/vite'

export default {
  plugins:[
    vue({
      reactivityTransform:true   // 测试阶段,谨慎开启  $ref
    }),

    vueJsx({}),

    DefineOptions(),

    // https://github.com/rollup/plugins/tree/master/packages/commonjs
    commonjs(),

    // https://github.com/btd/rollup-plugin-visualizer
    visualizer(),

    // https://github.com/vbenjs/vite-plugin-svg-icons
    viteSvgIcons({
      iconDirs: [path.resolve(process.cwd(), 'src/icons/svg')],
      symbolId: 'icon-[dir]-[name]',
      svgoOptions: isBuild
    }),

    // https://github.com/vbenjs/vite-plugin-vue-setup-extend
    VueSetupExtend(),

    // https://github.com/antfu/unplugin-auto-import
    AutoImport({
      imports: [
        'vue',
        'vue-router',
        {
          'vuex': ['useStore']
        }
      ],
      dts: false,   // 不生成.d.ts文件,如果需要生成填写路径,默认根路径
      vueTemplate: true,
    }),

    // https://github.com/sampullman/vite-plugin-vue-images
    ViteImages({
      // Relative paths of image search directories
      dirs: ['src/assets/img'],

      // valid image extensions
      extensions: ['jpg', 'jpeg', 'png', 'svg', 'webp'],

      // Override default behavior of name -> image path resolution
      customResolvers: [],

      // Override Regex that searches for variables to replace. MUST include group
      customSearchRegex: '([a-zA-Z0-9]+)',
    });

    // https://github.com/vbenjs/vite-plugin-mock
    viteMockServe({
      mockPath: "mock",
      localEnabled: command === 'serve'  // 不是打包的时候开启
    }),

  // https://github.com/hannoeru/vite-plugin-pages
  Pages({
    extensions: ['vue', 'md'],
  }),

  // https://github.com/JohnCampionJr/vite-plugin-vue-layouts
  Layouts(),

  // https://github.com/antfu/unplugin-vue-components
  Components({
    // allow auto load markdown components under `./src/components/`
    extensions: ['vue', 'md'],
    // allow auto import and register components used in markdown
    include: [/\.vue$/, /\.vue\?vue/, /\.md$/],
    dts: 'src/components.d.ts',
    resolvers: [ElementPlusResolver()],
  }),

  // https://github.com/antfu/vite-plugin-md
  // Don't need this? Try vitesse-lite: https://github.com/antfu/vitesse-lite
  Markdown({
    wrapperClasses: markdownWrapperClasses,
    headEnabled: true,
    markdownItSetup(md) {
      // https://prismjs.com/
      md.use(Prism)
      md.use(LinkAttributes, {
        matcher: (link: string) => /^https?:\/\//.test(link),
        attrs: {
          target: '_blank',
          rel: 'noopener',
        },
      })
    },
  }),

  // https://github.com/intlify/bundle-tools/tree/main/packages/vite-plugin-vue-i18n
  VueI18n({
    runtimeOnly: true,
    compositionOnly: true,
    include: [path.resolve(__dirname, 'locales/**')],
  }),

  // https://github.com/antfu/unocss
  // see unocss.config.ts for config
  Unocss(),

  // https://github.com/antfu/vite-plugin-inspect
  // Visit http://localhost:3333/__inspect/ to see the inspector
  Inspect(),

  // https://github.com/sxzz/unplugin-vue-macros
   VueMacros({
      plugins: {
        vue: Vue({
          reactivityTransform: true,
        }),
      },
    }),

  // https://github.com/windicss/vite-plugin-windicss
  WindiCSS(),

  // https://github.com/vbenjs/vite-plugin-imagemin
  viteImagemin({
    gifsicle: {
      optimizationLevel: 7,
      interlaced: false,
    },
    optipng: {
      optimizationLevel: 7,
    },
    mozjpeg: {
      quality: 20,
    },
    pngquant: {
      quality: [0.8, 0.9],
      speed: 4,
    },
    svgo: {
      plugins: [
        {
          name: 'removeViewBox',
        },
        {
          name: 'removeEmptyAttrs',
          active: false,
        },
      ],
    },
  }),
  ]
}