vite配置

古德猫码农 2024-08-16 16:33:02 阅读 83

#vite配置

    ##这是项目初始化创建的时候配置(vite.config.js):

<code>import { defineConfig } from 'vite'

import vue from '@vitejs/plugin-vue'

// https://vitejs.dev/config/

export default defineConfig({

plugins: [vue()],

})

接下来围绕vite.config.js对项目进行配置(这里主要讲解用到比较常用的操作):

        主要模块:

                    1、基础配置与环境变量

                    2、插件配置

                    3、开发服务器配置

                    4、打包配置

  1、基础配置与环境变量

        一下配置都在defineConfig下配置:

主要配置有:root(源文件路径)、define(全局常量)、resolve(模块解析)、base(静态文件路径)等

import { defineConfig } from 'vite';

import vue from '@vitejs/plugin-vue';

import path from 'path';

// 定义一个路径解析辅助函数

const resolvePath = (relativePath) => path.resolve(__dirname, relativePath);

// 获取当前环境

const isDev = process.env.NODE_ENV !== 'production';

export default defineConfig({

// 项目根目录,默认是配置文件所在目录,根据需要可自定义

root: resolvePath('./'),

// 应用的基路径,影响资源和路由的基准URL

base: isDev ? '/' : './',

// 静态资源目录,存放不会通过 Vite 转换的静态资源

publicDir: 'public',

// 环境变量前缀,确保安全性和避免冲突

envPrefix: 'VITE_',

// 定义全局常量,用于环境变量注入或其他编译时替换

define: {

__APP_VERSION__: JSON.stringify(process.env.npm_package_version),

'process.env': process.env,

},

// 配置模块解析规则,如别名,简化导入路径

resolve: {

alias: [

{ find: '@', replacement: resolvePath('src') },

],

extensions: ['.js', '.ts', '.jsx', '.tsx', '.json', '.vue'],

},

// CSS配置,包括预处理器设置等

css: {

preprocessorOptions: {

less: {

modifyVars: {

hack: `true; @import (reference) "${resolvePath('src/assets/css/variables.less')}";`,

},

javascriptEnabled: true,

},

},

},

//打包忽略的debug

esbuild:{

drop: isDev ? [] : ["console", "debugger"]

},

// 依赖优化配置,控制哪些依赖进行预构建等

optimizeDeps: {

include: ['vue', 'vue-router'],

exclude: ['lodash-es'],

},

// 日志配置,虽然未展示具体配置,但可通过此选项调整日志输出

// logger: { ... },

});

2、插件配置

plugins配置(这个,模块主要是针对三方库的配置,不用详细了解):

库文件配置主要是如下两个(参考):

npm | Home

简介 | Rollup 中文文档

主要用于安装库的运用导入(包括打包库、图标库、以及各种格式优化等)可以根据不同模式进行配置,这里不区分开发和生产模式:

import postcss from 'rollup-plugin-postcss';//压缩css

import VitePluginDistZipJs from "vite-plugin-zip-dist";//zip构建

import htmlMinifier from 'html-minifier';//html压缩

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

import AutoImport from 'unplugin-auto-import/vite'//自动导入Vue和WebExtension Polyfill的相关功能

import copy from 'rollup-plugin-copy'//文件复制

plugins: [

vue(),

//Build zip

mode() === 'development' ? null : VitePluginDistZipJs(

{

zipName: 'moolah-extension' + '-' + browser() + '-' + mode() + '.' + process.env.VITE_VERSION,

dayjsFormat: '',

zipDir: r('dist'),

}

),

//compress css

isDev ? null : postcss({

plugins: [],

extract: 'style.css',

minimize: true,

}),

//compress html

{

name: 'html-minify',

transformIndexHtml(html) {

return htmlMinifier.minify(html, {

collapseWhitespace: true, // 折叠空白符,将多余的空格和换行符折叠为一个空格

removeComments: true,// 删除 HTML 中的注释

minifyCSS: true,// 压缩内联 CSS

minifyJS: true, // 压缩内联 JavaScript

conservativeCollapse: true // 保守地折叠空白符,仅在标签之间的空格会被折叠,忽略元素内容中的空格

});

}

},

//compress Img

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,

},

],

},

}),

AutoImport({

imports: [

"vue",

{

'webextension-polyfill': [

['*', 'browser'],

],

},

],

}),

// rewrite assets to use relative path-路径重写

{

name: 'assets-rewrite',

enforce: 'post',

apply: 'build',

transformIndexHtml(html, { path }) {

return html.replace(/"\/dist\/assets\//g, `"${relative(dirname(path), '/assets')}/`.replace(/\\/g, '/'))

},

},

copy({

targets: [

{ src: 'src/assets', dest: `dist/${mode()}` },

{ src: 'src/manifest.json', dest: `dist/${mode()}` },

{ src: 'src/_locales', dest: `dist/${mode()}` }

]

}),

],

      3、开发服务器配置

        这个模块主要是配置服务器相关的,配置请看代码(包含了大部分配置,不是每个配置都需要开启,根据具体项目情况而定):

server: {

// 更改服务器监听的主机名,使其在局域网内可访问

host: '0.0.0.0',

// 修改开发服务器的端口号

port: 8080,

// 是否在服务器启动时自动打开浏览器

open: true,

// 启用HTTPS服务,需要提供证书和私钥的路径

https: {

key: '/path/to/server.key',

cert: '/path/to/server.crt',

},

// 跨源资源共享配置,允许所有源访问

cors: true,

// 配置代理,将 /api 开头的请求代理到 http://localhost:3001

proxy: {

'/api': {

target: 'http://localhost:3001',

changeOrigin: true,

rewrite: (path) => path.replace(/^\/api/, ''),

},

},

// 控制文件系统监视,忽略监视 node_modules 目录

watch: {

ignored: '**/node_modules',

},

// 当端口被占用时,不自动寻找下一个可用端口,而是直接报错

strictPort: false,

// 热模块替换,默认开启,可根据需要关闭

hmr: true,

},

        4、打包配置

        这个主要是自己的打包build配置,一般会结合上面的插件一起使用,才能让build更便捷:

        以下也是常用的配置(实际根据具体项目而定)

build: {

// 输出目录,构建产物将存放在此目录下,默认为'dist'

outDir: 'dist',

// 构建前是否清空输出目录,默认为true

emptyOutDir: true,

// 指定构建目标的ECMAScript版本,影响代码的转译程度,默认为'es2020'

target: 'es2020',

// 构建时是否进行代码压缩,默认为true

minify: true,

// 当拆分的chunk大小超过此限制(单位:KB)时发出警告,默认为500KB

chunkSizeWarningLimit: 500,

// 构建后是否报告压缩后的文件大小,默认为true

reportCompressedSize: true,

// 传递给Rollup的额外配置选项

rollupOptions: {

// 输入配置,可以定义多个入口点

input: {

main: 'src/main.js', // 例如,主入口文件

alternative: 'src/alternative-entry.js', // 另一个入口文件

},

// 输出配置,可以自定义输出格式、文件名等

output: {

// 例如,修改输出文件名

entryFileNames: '[name].[hash].js',

},

},

// 服务器端渲染相关配置

ssr: {

// SSR相关选项

},

// 小于该大小(单位:字节)的资源会被内联到bundle中,默认为4096字节

assetsInlineLimit: 4096,

// 指定CSS构建的目标浏览器支持等级,独立于'target'配置

cssTarget: 'defaults',

// 是否为模块preload/prefetch添加polyfill,默认为true

polyfillModulePreload: true,

// 配置如何处理CommonJS模块

commonjsOptions: {

// 例如,是否将混合模块转换为ESM

transformMixedEsModules: true,

},

// 是否在构建时生成manifest文件,默认为true

writeManifest: true,

},

完整配置如下:

由于有时候需要分开打包,所以将公共部分抽离了:

import { defineConfig } from "vite";

import vue from "@vitejs/plugin-vue";

import { r, port, isDev, mode } from "./scripts/utils";

import { dirname, relative } from 'node:path'

import AutoImport from 'unplugin-auto-import/vite'

import copy from 'rollup-plugin-copy'

import viteImagemin from 'vite-plugin-imagemin'

import htmlMinifier from 'html-minifier';

import postcss from 'rollup-plugin-postcss';

import VitePluginDistZipJs from "vite-plugin-zip-dist";

export const sharedConfig = {

root: r("src"),

define: {

'__DEV__': isDev,

'process.env': process.env

},

resolve: {

alias: {

"@": r("src"),

"~@": r("src"),

},

extensions: [".js", ".ts", ".jsx", ".tsx", ".json", ".vue"],

},

esbuild:{

drop: isDev ? [] : ["console", "debugger"]

},

plugins: [

vue(),

//Build zip

mode() === 'development' ? null : VitePluginDistZipJs(

{

zipName: 'moolah-extension' + '-' + '-' + mode() + '.' + process.env.VITE_VERSION,

dayjsFormat: '',

zipDir: r('dist'),

}

),

//compress css

isDev ? null : postcss({

plugins: [],

extract: 'style.css',

minimize: true,

}),

//compress html

{

name: 'html-minify',

transformIndexHtml(html) {

return htmlMinifier.minify(html, {

collapseWhitespace: true, // 折叠空白符,将多余的空格和换行符折叠为一个空格

removeComments: true,// 删除 HTML 中的注释

minifyCSS: true,// 压缩内联 CSS

minifyJS: true, // 压缩内联 JavaScript

conservativeCollapse: true // 保守地折叠空白符,仅在标签之间的空格会被折叠,忽略元素内容中的空格

});

}

},

//compress Img

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,

},

],

},

}),

AutoImport({

imports: [

"vue",

{

'webextension-polyfill': [

['*', 'browser'],

],

},

],

}),

// rewrite assets to use relative path

{

name: 'assets-rewrite',

enforce: 'post',

apply: 'build',

transformIndexHtml(html, { path }) {

return html.replace(/"\/dist\/assets\//g, `"${relative(dirname(path), '/assets')}/`.replace(/\\/g, '/'))

},

},

copy({

targets: [

{ src: 'src/assets', dest: `dist/${mode()}` },

{ src: 'src/manifest.json', dest: `dist/${mode()}` },

{ src: 'src/_locales', dest: `dist/${mode()}` }

]

}),

],

}

export default defineConfig(({ command }) => ({

...sharedConfig,

server: {

port,

hmr: {

host: 'localhost',

},

},

build: {

outDir: r(`dist/${mode()}`),

emptyOutDir: false,

rollupOptions: {

input: {

options: r("src/options/index.html"),

popup: r("src/popup/index.html"),

},

},

terserOptions: {

mangle: false,

},

extensions: [".js", ".ts", ".jsx", ".tsx", ".json", ".vue"],

},

}));



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。