86 lines
2.5 KiB
JavaScript
86 lines
2.5 KiB
JavaScript
|
|
import { defineConfig, loadEnv } from "vite";
|
|||
|
|
import vue from "@vitejs/plugin-vue";
|
|||
|
|
import path from "path";
|
|||
|
|
import WindiCSS from "vite-plugin-windicss";
|
|||
|
|
import { createSvgIconsPlugin } from "vite-plugin-svg-icons";
|
|||
|
|
import { resolve } from "path";
|
|||
|
|
import fs from "fs-extra";
|
|||
|
|
|
|||
|
|
export default defineConfig(({ command, mode }) => {
|
|||
|
|
const { VITE_TCB_PATH,VITE_API_URL } = loadEnv(mode, process.cwd());
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
base: `/${VITE_TCB_PATH}/`, //相对路径
|
|||
|
|
server: {
|
|||
|
|
host: "0.0.0.0",
|
|||
|
|
port: "5173",
|
|||
|
|
headers: {
|
|||
|
|
// 防止点击劫持攻击
|
|||
|
|
'X-Frame-Options': 'SAMEORIGIN', // 只允许同源页面嵌入
|
|||
|
|
// 'X-Frame-Options': 'DENY', // 如果要完全禁止被嵌入,使用 DENY
|
|||
|
|
// 额外的安全响应头
|
|||
|
|
'X-Content-Type-Options': 'nosniff',
|
|||
|
|
'X-XSS-Protection': '1; mode=block',
|
|||
|
|
'Content-Security-Policy': "frame-ancestors 'self'", // CSP 的现代替代方案
|
|||
|
|
},
|
|||
|
|
proxy: {
|
|||
|
|
// 将 VITE_PROXY_API_URL 的请求代理到 VITE_API_URL
|
|||
|
|
'/API': {
|
|||
|
|
target: VITE_API_URL,
|
|||
|
|
changeOrigin: true,
|
|||
|
|
rewrite: (path) => path.replace(/^\/API/, '') // 可选:重写路径
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
plugins: [
|
|||
|
|
vue(),
|
|||
|
|
WindiCSS(),
|
|||
|
|
createSvgIconsPlugin({
|
|||
|
|
// 指定需要缓存的图标文件夹
|
|||
|
|
iconDirs: [path.resolve(process.cwd(), "src/assets/svg-icons")],
|
|||
|
|
// 指定symbolId格式
|
|||
|
|
symbolId: "icon-[dir]-[name]",
|
|||
|
|
}),
|
|||
|
|
],
|
|||
|
|
optimizeDeps: {
|
|||
|
|
exclude: ["lib-generate-test-usersig-es.min"],
|
|||
|
|
},
|
|||
|
|
build: {
|
|||
|
|
outDir: `package/${VITE_TCB_PATH}`,
|
|||
|
|
target: ["chrome52"],
|
|||
|
|
cssTarget: ["chrome52"],
|
|||
|
|
terserOptions: {
|
|||
|
|
compress: {
|
|||
|
|
drop_console: true, // 去除 console.log 等调试信息
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
cssCodeSplit: true, // 分割 CSS,避免全局 CSS 被打包成一个大文件
|
|||
|
|
minify: "terser", // 使用 terser 进行压缩
|
|||
|
|
brotliSize: true,
|
|||
|
|
},
|
|||
|
|
resolve: {
|
|||
|
|
//文件系统路径的别名, 绝对路径
|
|||
|
|
alias: {
|
|||
|
|
"@": path.resolve(__dirname, "src"),
|
|||
|
|
},
|
|||
|
|
extensions: [".js", ".ts", ".vue", ".json"],
|
|||
|
|
},
|
|||
|
|
};
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
async function copyOldFiles(name) {
|
|||
|
|
const srcDir = resolve(__dirname, name);
|
|||
|
|
const destDir = resolve(__dirname, `oldFile`);
|
|||
|
|
// 创建目标目录
|
|||
|
|
if (!fs.existsSync(srcDir)) {
|
|||
|
|
fs.mkdirSync(srcDir, { recursive: true });
|
|||
|
|
}
|
|||
|
|
if (!fs.existsSync(destDir)) {
|
|||
|
|
fs.mkdirSync(destDir, { recursive: true });
|
|||
|
|
}
|
|||
|
|
try {
|
|||
|
|
// 复制文件
|
|||
|
|
await fs.copy(srcDir, destDir);
|
|||
|
|
} catch (err) {}
|
|||
|
|
}
|