import { resolve } from 'node:path' import viteCompression from 'vite-plugin-compression' import { defineConfig, loadEnv, splitVendorChunkPlugin } from 'vite' import vue2 from '@vitejs/plugin-vue2' import { ViteEjsPlugin } from 'vite-plugin-ejs' import { viteExternalsPlugin } from 'vite-plugin-externals' import { visualizer } from 'rollup-plugin-visualizer' import eslintPlugin from '@nabla/vite-plugin-eslint' import cssInjectedByJsPlugin from 'vite-plugin-css-injected-by-js' function getExternals(isDev) { if (isDev) { // serve return {} } // build return { // 'vue': 'Vue', // 'vue-router': 'VueRouter', // 'vuex': 'Vuex', axios: 'axios', // 'vant': 'vant', 'js-cookie': 'Cookies' } } export default defineConfig(({ mode, command }) => { const env = loadEnv(mode, process.cwd()) return { base: env.VITE_APP_BASE_PUBLIC, build: { sourcemap: true, emptyOutDir: true, lib: { entry: './src/entry.js', // 入口文件 name: 'TestBindPhone', // 库的全局变量名 fileName: 'jy-bind-phone' // 输出的文件名 }, rollupOptions: { // 确保外部化处理 Vue,避免将 Vue等 打包进库 external: ['vue', 'vant', 'vuex', 'vue-router'], output: { globals: { vue: 'Vue' } } }, target: 'es2015' // 指定目标语法版本 }, plugins: [ splitVendorChunkPlugin(), vue2(), ViteEjsPlugin({ assets: { version: Date.now() } }), eslintPlugin(), // 不打包的库(外部需要通过cdn引入) viteExternalsPlugin(getExternals(command)), viteCompression({ threshold: 1024 }), visualizer(), cssInjectedByJsPlugin() ], resolve: { alias: [ { find: /^~/, replacement: '' }, { find: '@', replacement: resolve(__dirname, 'src') } ], extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue'] }, server: { host: '0.0.0.0', port: 8080, proxy: { // 接口解密iframe '^/page_decrypt': { target: 'https://jybx-webtest.jydev.jianyu360.com', changeOrigin: true }, '/jyapi': { target: 'https://app2-jytest.jydev.jianyu360.com', changeOrigin: true, rewrite: (path) => path.replace(/^\/jyapi/, '') }, '/api': { target: 'https://app2-jytest.jydev.jianyu360.com', changeOrigin: true, rewrite: (path) => path.replace(/^\/api/, '') } } } } })