vue3+vite项目,怎么动态适配打包后的文件名?vite.config.js 中使用import.meta.env 返回undefined?

1,070 阅读2分钟

1. vue3+vite项目,怎么动态适配打包后的文件名?即,不同的项目,npm run build后生成自定义文件夹和文件名。

2. vite.config.js中怎么调用环境变量?

如果 import.meta.envvite.config.js 中返回 undefined,而在其他 JavaScript 文件中能正常工作,这通常是因为 Vite 的配置文件和实际应用代码的执行环境不同。vite.config.js 运行在 Node.js 环境中,而应用代码则在浏览器环境中运行,因此环境变量的处理方式可能有所不同。

以下是几种可能的解决方案和检查步骤:

1. 使用 dotenv 加载环境变量

vite.config.js 中,你可以使用 dotenv 来手动加载环境变量:

  1. 安装 dotenv:

    bashCopy Code
    npm install dotenv
    
  2. vite.config.js 中引入并配置 dotenv:

    javascriptCopy Code
    import { defineConfig } from 'vite';
    import vue from '@vitejs/plugin-vue';
    import path from 'path';
    import dotenv from 'dotenv';
    
    // 加载环境变量
    dotenv.config();
    
    // 获取环境变量
    const projectName = process.env.VITE_APP_PROJECT_NAME || 'default';
    
    export default defineConfig({
      plugins: [vue()],
      build: {
        outDir: `dist_${projectName}`,
      },
      resolve: {
        alias: {
          '@': path.resolve(__dirname, 'src'),
        },
      },
    });
    

2. 确保 .env 文件在项目根目录

.env 文件应该放在项目的根目录中,即与 vite.config.js 同级,确保路径正确。

3. 确保 .env 文件格式正确。

#注意:在 Vite 中,环境变量的前缀应该是 VITE_,而不是 VUE_APP_。这是一个重要的区别。

# VITE_APP_PROJECT_NAME='xianggang'
# VITE_APP_PROJECT_C_NAME='湘钢' 
# VITE_APP_PROJECT_ID='3' 

VITE_APP_PROJECT_NAME='kanban'
VITE_APP_PROJECT_C_NAME='看板' 
VITE_APP_PROJECT_ID='4' 

4. 检查 vite.config.js 的运行环境

确保你在 Node.js 环境中运行 Vite。环境变量通常在 Node.js 环境中通过 process.env 提供,而不是 import.meta.env

javascriptCopy Code
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import path from 'path';

const projectName = process.env.VITE_APP_PROJECT_NAME || 'default';

5. 动态配置打包文件名:

这句:

build: {
  outDir: `dist_${projectName}`,
}

完整的vite.config.js文件:

import vue from '@vitejs/plugin-vue';
import path from 'path';
import { defineConfig } from 'vite';
// import htmlTemplate from 'vite-plugin-html-template'; // 导入 HTML 模板插件
import dotenv from 'dotenv';
import { createHtmlPlugin } from 'vite-plugin-html';
// https://vitejs.dev/config/

// 加载环境变量
dotenv.config();
// 动态获取环境变量或者其他条件来决定目录名
console.log('import.meta.env=',import.meta.env); // 检查是否包含 VITE_APP_PROJECT_NAME
console.log('process.env=', process.env); // 检查是否包含 VITE_APP_PROJECT_NAME

const getOutDir = () => {
  const env = process.env.VITE_APP_PROJECT_NAME || 'default';
  return `dist_${env}`;
};

export default defineConfig(() => {
  return{
    base:'/',
    plugins: [
      vue(),
      createHtmlPlugin({
        // minify: true,
        // pages: [
        //   {
        //     entry: 'src/main.js',
        //     filename: 'index.html',
        //     template: 'index.html',
        //     injectOptions: {
        //       data: {
        //         title: import.meta.env.VUE_APP_API_URL,
        //         // injectScript: `<script src="./inject.js"></script>`,
        //       },
        //       tags: [
        //         {
        //           injectTo: 'body-prepend',
        //           tag: 'div',
        //           attrs: {
        //             id: 'tag1',
        //           },
        //         },
        //       ],
        //     },
        //   },
        // ],
      }),
      // legacy({
      //   targets:['ie>=11'],
      //   additionalLegacyPolyfills:['regenerator-runtime/runtime']
      // })
    ],
    lintOnSave:false, //关闭语法检查
    // 起个别名,在引用资源时,可以用‘@/资源路径’直接访问
    resolve: {
      alias: {
        '@': path.resolve(__dirname, 'src')
      }
    },
    build:{
      minify:'terser',
      terserOptions:{
        compress:{
          drop_console:true,
          drop_debugger:true
        }
      },
      outDir: getOutDir(),   //想要把dist修改成什么名字在这边改
      //assetsDir: 'static/img/', // 指定生成静态资源的存放路径
    },
    server: {
      open:true, //是否主动唤醒浏览器
      host:'0.0.0.0',
      port:80,
      // strictPort:false,
      proxy: {
        '/api': {
          target: 'http://*.*.*.*:9014/', // 目标服务器地址
          changeOrigin: true, // 是否改变源地址
          rewrite: (path) => path.replace(/^\/api/, ''), // 重写路径
        }
      },
    },
    // define: {
    //   'process.env': process.env // 这行可能会帮助让环境变量在 Vite 中生效
    // }
  }
})

6. 确认 Vite 版本

确保你使用的是最新版本的 Vite,以避免由于版本问题导致的错误。可以通过以下命令检查版本:

bashCopy Code
npm list vite

7. Vite 配置缓存

有时,Vite 的配置可能会被缓存。尝试清除缓存并重新启动 Vite:

bashCopy Code
rm -rf node_modules/.vite
npm run dev

8. 其他备注:index.html文件配置浏览器显示信息:

<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title><%- VITE_APP_PROJECT_C_NAME %>后台管理系统</title>  
  </head>
  <body>
    <div id="app"></div>
    <script type="module" src="/src/main.js"></script>
    <script>global = globalThis</script>
  </body>
</html>