子系統環境變數及vite.config.js

今天把子系統推上了測試機,卻發生了不能登入的慘案。我本來以為是login沒有寫好,研究了很久,後來問了公司的devope工程師,他幫我看了之後,跟我說是我環境變數沒設好,就讓我來整理一下子系統的環境變數該怎麼設。

在 Vite 中使用 Vue做專案開發,會在.env檔中設定環境變數,針對不同的環境,設定不同的env檔,例如.env.develop是測試環境使用的,.env.production則放正式環境使用的環境變數。

那環境變數的內容是那哪些呢?

VITE_BASE_URL=/放入子系統路由/
VITE_APP_APPID=""
VITE_APP_APPKEY=""
VITE_APP_APIDOMAINNAME=http://API 環境的網域/
VITE_APP_DOMAINNAME=http://環境的網域/
VITE_GA4=GA監控碼

我這次踩的坑就是沒有設 VITE_BASE_URL,導致 router 在抓路由的時候找不到子系統的路徑,直接往上去找整個平台的路由,所以登入就卡在登入頁面的第一行,既沒有mounted,更沒有去打 signIn 的API。

搭配路由要設定:

VITE_APP_GA=GA監控碼
VITE_BASE_URL=/子系統路由/
VITE_APP_DOMAINNAME=http://19X.16X.5X.XX/
VITE_APP_APIDOMAINNAME=http://19X.16X.5X.XX/
VITE_APP_APPID="XXXXXXXXXXXXXXXXXXXXXXX"
VITE_APP_APPKEY="XXXXXXXXXXXXXXXXXXXXXXX"

在router.js 會這樣去抓 BASE_URL:history: createWebHashHistory(import.meta.env.BASE_URL)

let router = createRouter({
  history: createWebHashHistory(import.meta.env.BASE_URL),
  routes: [
    ...Object.keys(pages.public).map((a) => ({
      name: a,
      path: a,
      component: pages.public[a],
      meta: { allowAnonymous: true },
    })),    
  ],
});

但是我設完環境變數,還是卡在登入頁面沒辦法進入網站,我研究了一下是 build 時產生的 index.js跟 index.css 沒有套到 BASE_URL。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta
      name="viewport"
      content="width=device-width,initial-scale=1,user-scalable=no"
    />   
    <title>網站名稱</title>   
    <script
      type="module"
      crossorigin
			// 在/assets前面應該要放入子系統路由
      src="/assets/index-f9de6ee9.js"
    ></script>
		<!-- 在/assets前面應該要放入子系統路由 -->
    <link rel="stylesheet" href="/assets/index-a495fa2b.css" />
  </head>
  <body>
    <div id="app"></div>
  </body>
</html>

這件事的解法要從 vite.config.js 著手,但是要先安裝這兩個套件:

  • vite-plugin-html
  • dotenv

然後原本的 vite.config.js 要改寫為:

import { fileURLToPath, URL } from "node:url";
import { defineConfig, loadEnv } from "vite";
import vue from "@vitejs/plugin-vue";
import { createHtmlPlugin } from "vite-plugin-html";

// https://vitejs.dev/config/
export default ({ mode }) => {
  // require('dotenv').config({ path: `./.env.${mode}` });

  process.env = { ...process.env, ...loadEnv(mode, process.cwd()) };
  return defineConfig({
    base: process.env.VITE_BASE_URL,
    plugins: [
      vue(),
      createHtmlPlugin({
        minify: true,
        inject: {
          data: {
            GA4: process.env.VITE_GA4,
            title: "wde",
            // injectScript: `<script src="./inject.js"></script>`,
          },
        },
      }),
      // 新增 wom 所需套件
      AutoImport({
        resolvers: [ElementPlusResolver()],
      }),
      // Components({
      //   resolvers: [ElementPlusResolver()],
      // }),
    ],
    // sever
    

    // sever
    resolve: {
      alias: {
        // "@": path.resolve(_dirname,"./src")
        "@": fileURLToPath(new URL("./src", import.meta.url)),
      },
    },
  });
};

原本的 index.html

<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0, user-scalable=no">

    <!-- <link rel="icon" href="/favicon.ico"> -->
    <!-- <link rel="stylesheet" href="/css/reset.css"> -->
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" integrity="sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN" crossorigin="anonymous">
    
    <title><%- title %></title>

    <script async src="https://www.googletagmanager.com/gtag/js?id=%VITE_APP_GA%"></script>
    <script>
      window.dataLayer = window.dataLayer || [];
      function gtag(){dataLayer.push(arguments);}
      gtag('js', new Date());
  
      gtag('config', "<%- GA4 %>");
    </script>
  </head>
  <body>
    <div id="app"></div>
    <script type="module" src="/src/main.js"></script>
  </body>
</html>

修改過 vite.config.js 產出的 index.html:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta
      name="viewport"
      content="width=device-width,initial-scale=1,user-scalable=no"
    />   
    <title>網站名稱</title>   
    <script
      type="module"
      crossorigin
      src="/子系統路由/assets/index-f9de6ee9.js"
    ></script>
    <link rel="stylesheet" href="/子系統路由/assets/index-a495fa2b.css" />
  </head>
  <body>
    <div id="app"></div>
  </body>
</html>

Leave a Reply

Your email address will not be published. Required fields are marked *