章節連結
使用 Vite 開發時, dev 與 prod 環境中若要自動注入 window 物件,其邏輯是有所不同的。這邊筆記下不同之處,以及如何修正。
內容
開發 Dev 環境
1. 可以透過 vite.config.define 來定義
2. 開發時,會透過 esbuild 將其主動注入 window 物件中。因此你可以透過 window.[物件 key] 來取得
正式 Prod 環境
1. 打包時,並不會主動注入 vite.config.define 的內容。因此你會需要自行將這些值,在打包時注入每一個 JS 檔案。如此一來,你就可以在 window 內取得
2. 你可以撰寫一個 Plugin 如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
const injectToWindowPlugin = (variables)=> { return { name: 'inject-to-window', renderChunk(code: string) { const injectCode = Object.keys(variables) .map((key) => `window.${key} = ${JSON.stringify(variables[key])};`) .join('\n') return { code: code + `\n\n${injectCode}`, map: null, } }, } } |
https://github.com/andy922200/vite-inject-to-window/blob/master/src/injectToWindow/index.ts
3. 打包後的每一個 JS 檔案都是需要的,不然 window 的寫入值會有問題,不過 html 就可視情況而定了。這回在專案中,index.html 作為 dev 環境下的登錄頁面。於最後的打包環節,再將 index.html 給移除即可