VUE3 + VITE 部署二级目录白屏:base 设置 + nginx 配置
本文主要介绍项目如何放到 nginx 二级目录,或者 nginx 部署多个站点,大致 3 点:
采用的 vue3+vite+ts 构建的,当然,技术栈不重要,重要的是解决方式,vue3+webpack 的方式,放在文章最后解决。
NODE_ENV='development'
VITE_BASE_PATH='/'
NODE_ENV='production'
VITE_BASE_PATH=/front-test/
"scripts": {
"dev": "vite --mode development",
"build": "vue-tsc && vite build --mode production",
"preview": "vite preview"
},
// 路由
const router = createRouter({
history: createWebHistory(import.meta.env.VITE_BASE_PATH),
routes
})
import.meta.env.VITE_BASE_PATH 可取到环境变量,设置 base。
由于 vite 项目的启动顺序,import.meta.env.VITE_BASE_PATH 无法在 vite.config.ts 中直接获取,但是提供了 loadEnv(mode, process.cwd()) 来获取:
import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue'
import type { UserConfig, ConfigEnv } from 'vite'
// 配置@别名
import { resolve } from "path";
// 自动导入vue中hook reactive ref等
import AutoImport from "unplugin-auto-import/vite"
//自动导入ui-组件 比如说ant-design-vue element-plus等
import Components from 'unplugin-vue-components/vite';
// element-ui
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers';
// https://vitejs.dev/config/
export default defineConfig(({ mode }: ConfigEnv): UserConfig => {
const env = loadEnv(mode, process.cwd());
return {
base: env.VITE_BASE_PATH,
plugins: [
vue(),
AutoImport({
//安装两行后你会发现在组件中不用再导入ref,reactive等
imports: ['vue', 'vue-router'],
//存放的位置
dts: "src/auto-import.d.ts",
resolvers: [ElementPlusResolver()]
}),
Components({
// 引入组件的,包括自定义组件
// 存放的位置
dts: "src/components.d.ts",
resolvers: [ElementPlusResolver()]
}),
],
resolve: {
// ↓路径别名
alias: {
"@": resolve(__dirname, "./src")
},
}
}
})
把 dist 打包好的文件,直接复制到二级目录下,访问即可。
如服务器目录为 ai-chat-room-h5,nginx 的 root 默认为 html 文件夹,可以更改 root 指向,这里就不更改了,nginx 需要对应配置:
# 配置前端访问
location /ai-chat-room-h5/ {
#二级路由时需要使用别名alias,不用root
alias html/ai-chat-room-h5/;
index index.html;
#若不配置try_files,刷新会404 history模式
try_files $uri $uri/ /ai-chat-room-h5/index.html;
}
接口代理 proxyAiApis,意思为遇见 proxyAiApis 做代理,为了解决跨域。如:遇见 proxyAiApis 给我代理到 https://test-zdzk.com 上面,proxyAiManApis/api/counselling/findSessionId? 会被代理成 https://test-zdzk.com/api/counselling/findSessionId?:
location /proxyAiManApis/ {
proxy_send_timeout 600s;
proxy_read_timeout 600s;
proxy_pass http://10.56.180.64:8091/;
}
此时 vite.config.js 可做同样配置:
'/proxyAiManApis': {
target: 'http://10.56.180.64:8091',
changeOrigin: true,
pathRewrite: {
'^/proxyAiManApis': ''
}
}
关于 nginx 的斜杠问题,可以参考 nginx 斜杠使用。
const router = createRouter({
scrollBehavior(to, from, savedPosition) {
return { top: 0 };
},
history: createWebHistory(`/${process.env.PROD_PREFIX}`),
routes
});
PROD_PREFIX 为 webpack 中的环境变量名称,可以自行命名,process.env 在 webpack 中获取环境变量,注意与 vite 区分。
const isProduction = process.env.NODE_ENV === 'production';
module.exports = {
publicPath: isProduction ? `/${process.env.PROD_PREFIX}` : '/',
}
如项目具体需求,部署的目录不在二级,二级更深的层级,如目录如下:
safety/midscr/zdldzhpc/pc/video-list
则需要把:
VITE_BASE_PATH=/safety/midscr/zdldzhpc/pc/video-list