vite配置terser,压缩代码及丢弃console
只需安装terser,无需import terser 然后使用下方配置
npm i terser
build: {
minify: "terser",
terserOptions: {
compress: {
drop_console: true,
drop_debugger: true,
},
}
},
// vue3+vite打包配置,绝对路径改相对路径,更改静态资源目录
export default defineConfig({
build: {
rollupOptions: {
output: {
// 在这里修改静态资源路径
chunkFileNames: 'static/assets/js/[name]-[hash].js',
entryFileNames: 'static/assets/js/[name]-[hash].js',
assetFileNames: 'static/assets/[ext]/[name]-[hash].[ext]',
}
}
},
base: './', // 这里更改打包相对绝对路径
minify: true, // 是否压缩代码
sourceMap: true, // 是否生成sourceMap
plugins: [vue(),basicSsl()],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src',
import.meta.url))
}
},
server: { //
port: 8082,
proxy: {
'/rss': {
target: ENV_URL, //要访问的地址
changeOrigin: true,
rewrite: (path) => path.replace(/^\/rss/, ""),
// secure: false
}
},
https:true,
host: '0.0.0.0' // ← 新增内容 ←
}
})
模式
默认情况下,开发服务器
(dev 命令)
运行在development
(开发) 模式,而build
命令则运行在production
(生产) 模式。这意味着当执行
vite build
时,它会自动加载.env.production
中可能存在的环境变量:
加载的环境变量也会通过 i
以字符串形式暴露给客户端源码。
- 为了防止意外地将一些环境变量泄漏到客户端,只有以
VITE_
为前缀的变量 才会暴露给经过vite
处理的代码。例如下面这些环境变量:
# .env.production
VITE_APP_TITLE=My App
在你的应用中,你可以使用 i
渲染标题。
环境变量
Vite 在一个特殊的 i
对象上暴露环境变量。这里有一些在所有情况下都可以使用的内建变量:
i
: {string} 应用运行的模式。mport.meta.env.MODE i
: {string} 部署应用时的基本 URL。他由base 配置项决定。mport.meta.env.BASE_URL i
: {boolean} 应用是否运行在生产环境。mport.meta.env.PROD i
: {boolean} 应用是否运行在开发环境 (永远与mport.meta.env.DEV i
相反)。mport.meta.env.PROD i
: {boolean} 应用是否运行在 server 上。mport.meta.env.SSR
.env 文件
.env # 所有情况下都会加载
.env.local # 所有情况下都会加载,但会被 git 忽略
.env.[mode] # 只在指定模式下加载
.env.[mode].local # 只在指定模式下加载,但会被 git 忽略
vite.config.js
import { defineConfig } from "vite";
import AutoImport from "unplugin-auto-import/vite";
import Components from "unplugin-vue-components/vite";
import vue from "@vitejs/plugin-vue";
import { ElementPlusResolver } from "unplugin-vue-components/resolvers";
import path from "path";
export default defineConfig({
plugins: [
vue(),
//引入vue 插件
AutoImport({
imports: ["vue"],
dts: "src/auto-import.d.ts",
}),
//plus按需引入
AutoImport({
resolvers: [ElementPlusResolver()],
}),
//plus按需引入
Components({
resolvers: [ElementPlusResolver()],
}),
],
build: {
minify: "terser", // 必须开启:使用terserOptions才有效果
terserOptions: {
compress: {
//生产环境时移除console
drop_console: true,
drop_debugger: true,
},
},
},
resolve: {
//配置根路径别名: import('@/pages/login/login.vue')
alias: {
"@": path.resolve(__dirname, "src"),
// 注意一定不要随意命名,a b c这样的,项目的目录也不能为关键字保留字!!
"comp": resolve(__dirname, "src/components"),
// 配置图片要这样引用
"/img": "./src/assets",
},
},
// 跨域
server: {
//使用IP能访问
host: "0.0.0.0",
// 热更新
hmr: true,
//设为 true 时若端口已被占用则会直接退出,而不是尝试下一个可用端口
strictPort: false,
//自定义代理规则
proxy: {
// 选项写法
"/api": {
target: "https://admin.itrustnow.com",
// target: "http://192.168.0.50:8083",
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, ""),
},
},
},
});
Vite常用基本配置
{
root: process.cwd(), // 项目根目录(index.html 文件所在的位置),
base: '/', // 开发或生产环境服务的公共基础路径 配置引入相对路径
mode: 'development', // 模式
plugins: [vue()], // 需要用到的插件数组
publicDir: 'public', // 静态资源服务的文件夹
cacheDir: 'node_modules/.vite', // 存储缓存文件的目录
resolve: {
alias: [ // 文件系统路径别名
{
find: /\/@\//,
replacement: pathResolve('src') + '/'
}
],
dedupe: [], // 强制 Vite 始终将列出的依赖项解析为同一副本
conditions: [], // 解决程序包中 情景导出 时的其他允许条件
mainFields: [], // 解析包入口点尝试的字段列表
extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json'], // 导入时想要忽略的扩展名列表
preserveSymlinks: false, // 启用此选项会使 Vite 通过原始文件路径确定文件身份
},
css: {
modules: {
scopeBehaviour: 'global' | 'local',
// ...
},
postcss: '', // 内联的 PostCSS 配置 如果提供了该内联配置,Vite 将不会搜索其他 PostCSS 配置源
preprocessorOptions: { // css的预处理器选项
scss: {
additionalData: `$injectedColor: orange;`
}
}
},
json: {
namedExports: true, // 是否支持从.json文件中进行按名导入
stringify: false, // 开启此项,导入的 JSON 会被转换为 export default JSON.parse("...") 会禁用按名导入
},
esbuild: { // 最常见的用例是自定义 JSX
jsxFactory: 'h',
jsxFragment: 'Fragment'
},
assetsInclude: ['**/*.gltf'], // 指定额外的 picomatch 模式 作为静态资源处理
logLevel: 'info', // 调整控制台输出的级别 'info' | 'warn' | 'error' | 'silent'
clearScreen: true, // 设为 false 可以避免 Vite 清屏而错过在终端中打印某些关键信息
envDir: '/', // 用于加载 .env 文件的目录
envPrefix: [], // 以 envPrefix 开头的环境变量会通过 import.meta.env 暴露在你的客户端源码中
server: {
host: '127.0.0.1', // 指定服务器应该监听哪个 IP 地址
port: 5000, // 指定开发服务器端口
strictPort: true, // 若端口已被占用则会直接退出
https: false, // 启用 TLS + HTTP/2
open: true, // 启动时自动在浏览器中打开应用程序
proxy: { // 配置自定义代理规则
'/api': {
target: 'http://jsonplaceholder.typicode.com',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '')
}
},
cors: true, // 配置 CORS
force: true, // 强制使依赖预构建
hmr: { // 禁用或配置 HMR 连接
// ...
},
watch: { // 传递给 chokidar 的文件系统监听器选项
// ...
},
middlewareMode: '', // 以中间件模式创建 Vite 服务器
fs: {
strict: true, // 限制为工作区 root 路径以外的文件的访问
allow: [], // 限制哪些文件可以通过 /@fs/ 路径提供服务
deny: ['.env', '.env.*', '*.{pem,crt}'], // 用于限制 Vite 开发服务器提供敏感文件的黑名单
},
origin: 'http://127.0.0.1:8080/', // 用于定义开发调试阶段生成资产的 origin
},
build: {
target: ['modules'], // 设置最终构建的浏览器兼容目标
polyfillModulePreload: true, // 是否自动注入 module preload 的 polyfill
outDir: 'dist', // 指定输出路径
assetsDir: 'assets', // 指定生成静态文件目录
assetsInlineLimit: '4096', // 小于此阈值的导入或引用资源将内联为 base64 编码
cssCodeSplit: true, // 启用 CSS 代码拆分
cssTarget: '', // 允许用户为 CSS 的压缩设置一个不同的浏览器 target 与 build.target 一致
sourcemap: false, // 构建后是否生成 source map 文件
rollupOptions: {}, // 自定义底层的 Rollup 打包配置
lib: {}, // 构建为库
manifest: false, // 当设置为 true,构建后将会生成 manifest.json 文件
ssrManifest: false, // 构建不生成 SSR 的 manifest 文件
ssr: undefined, // 生成面向 SSR 的构建
minify: 'esbuild', // 指定使用哪种混淆器
terserOptions: {}, // 传递给 Terser 的更多 minify 选项
write: true, // 启用将构建后的文件写入磁盘
emptyOutDir: true, // 构建时清空该目录
brotliSize: true, // 启用 brotli 压缩大小报告
chunkSizeWarningLimit: 500, // chunk 大小警告的限制
watch: null, // 设置为 {} 则会启用 rollup 的监听器
},
preview: {
port: 5000, // 指定开发服务器端口
strictPort: true, // 若端口已被占用则会直接退出
https: false, // 启用 TLS + HTTP/2
open: true, // 启动时自动在浏览器中打开应用程序
proxy: { // 配置自定义代理规则
'/api': {
target: 'http://jsonplaceholder.typicode.com',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '')
}
},
cors: true, // 配置 CORS
},
optimizeDeps: {
entries: [], // 指定自定义条目——该值需要遵循 fast-glob 模式
exclude: [], // 在预构建中强制排除的依赖项
include: [], // 可强制预构建链接的包
keepNames: false, // true 可以在函数和类上保留 name 属性
},
ssr: {
external: [], // 列出的是要为 SSR 强制外部化的依赖,
noExternal: '', // 列出的是防止被 SSR 外部化依赖项
target: 'node', // SSR 服务器的构建目标
}
}
route
useRouter,useRoute
。
在vue3.0中取消了vue2.0的部分api,新增的两个API 4、vue3.0中路由跳转 1、第一步先引入import {useRouter} from 'vue-router';
2、第二步 const router = useRouter();
3、第三步 router.push({path:'/home', query:{id:'12' }})
5、vue3.0如何取出路由的值 1、第一步先引入import {useRoute} from 'vue-router';
2、第二步 const route = useRoute();
3、第三步route.query.id
Vue3—路由传参query和params
路由传参有query和params两种方式。
query以?形式传参,如 / user ? id=1 & name=tom & gender=male
params通过:形式绑定参数传参,如 / user / :id / :name / :gender --> / user / 1 / tom / male
总结:路由传参用query或param都可以。一般采用params方式进行路由传参,其url比较美观。
1.定义路由
<!--routers/router.ts-->
{
path: '/test', //测试路由
name: 'test',
component: () => import('~/views/test/index.vue'),
meta: {
title: '测试路由'
}
},
{
path: '/user', //query定义路由
name: 'user',
component: () => import('~/views/user/index.vue'),
meta: {
title: 'user页面'
}
},
// {
// path: '/user/:id/:name/:age/:gender', //params定义路由(特殊,注意!!)
// name: 'user',
// component: () => import('~/views/pgc/user/index.vue'),
// meta: {
// title: 'user页面'
// }
// }
2.路由跳转
<!--views/test/index.vue-->
<template>
<div>Test页面</div>
<router-link to="/user?id=12&name=tom&age=13&gender=male">
query传参
</router-link>
<router-link to="/user/12/tom/13/male">
params传参
</router-link>
</template>
3.接收参数
<!--views/user/index.vue-->
<template>
<div>user页面接收参数</div>
<div>
<!-- 获得到query传参的参数 { "id": "12", "name": "tom", "age": "13", "gender": "male" } -->
{{ query }}
</div>
<div>
<!-- 获得到params传参的参数 { "id": "12", "name": "tom", "age": "13", "gender": "male" } -->
{{ params }}
</div>
</template>
<script lang="ts" setup>
import { useRoute } from 'vue-router'; //1.先在需要跳转的页面引入useRouter
const { query, params } = useRoute(); //2.在跳转页面定义router变量,解构得到指定的query和params传参的参数
</script>
使用 Router History
// router.js createWebHistory .env.producation 默认为 ''
const router = createRouter({
history: createWebHistory (import.meta.env.BASE_URL),
// history: createWebHashHistory (import.meta.env.BASE_URL),
routes:[]
})
VITE_APP_BASE_API='/app'
BASE_URL='uapp'
// vite config js
base: '/uapp',
nginx.conf
vite config
import { fileURLToPath, URL } from 'node:url'
import cesium from 'vite-plugin-cesium';
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
export default defineConfig({
base: '/uapp',
build: {
minify: 'terser', // 必须启用:terserOptions配置才会有效
terserOptions: {
compress: {
// 生产环境时移除console.log调试代码
drop_console:false,
drop_debugger: false,
// drop_console:true,
// drop_debugger: true,
}
}
},
server: {
open: true, // 启动时自动在浏览器中打开应用程序
proxy: {
'/api': {
target: 'http://127.0.0.1:18088',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '/app'),
},
}
},
plugins: [
vue(),cesium()
],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
}
}
})
使用root还是alias
刚才提到root和alias这两个指令都可以使用,实际我们应该如何选择呢?
当无前缀时,使用root和alias一样,一般使用root; 当有前缀时,如果前缀名和目录路径最后一段路径一致,那应该使用root,而不一致的话,应该使用alias.。
- try_files后面可以定义多个文件路径和最后一个作为内部跳转的uri,其中文件路径是和
alias
和root
两个指令合在一起构造而成; 多个文件以第一个找到的文件作为请求; 而文件后面以"/"
结尾,会检查目录是否存在; 当文件都找不到时,就会去以最后一个uri进行内部跳转请求。
请求了
http://localhost:8081/personalcenter/static/js/1.326021aaadef08402891.js
细心的小伙伴应该已经看出来了失败的原因了,如果还有小伙伴没看出来的我把他两放一起,你们仔细瞧
成功的: http://localhost:8081/static/js/0.141001dab9a800dfa8d8.js
失败的: http://localhost:8081/personalcenter/static/js/1.326021aaadef08402891.js
是不是失败的请求与成功的请求相比url多了一个personalcenter,personalcenter是啥?这不就是我们一级路由的名称嘛,接着我们看看打包的文件夹内有personalcenter路径吗?是不是没有,只有static,所以现在明白为啥刷新后请求失败了吧,因为路径根本不存在
nginx 相关配置
location / { try_files $uri $uri/ /index.html; }
这里用到了try_files配置,简单说下它的作用:它首先匹配url有没有对应的资源(即上面的uri),如果有则返回;如果没有,则继续查找url目录下(即上面的uri/)有没有默认的index.html文件,如果还没有,最后返回根目录下的index.html(即上面的/index.html)。其实在这里,我们想要的就是让它无脑返回根目录下的index.html(因为我们只有这个可访问文件)
history模式部署时需要改动的地方
- 如果是部署在根目录下,只需要改nginx配置如下即可,前端配置无需修改
location / {
try_files $uri $uri/ /index.html;
}
如果是部署在二级目录下(如部署在/wj目录),修改内容如下
- nginx配置
# nginx 修改后配置
location /wj {
try_files $uri $uri/ /wj/index.html;
}
- vue-router配置
const router = createRouter({
history: createWebHistory('/wj/')
})
- vite.config配置
// vite.config.js
{
base: '/wj/'
// 其他代码省略
}