關於我專案踩到連環雷這件事

# 環境

  • Laravel 7
  • Laravel-Mix 6
  • webpack 5

# 問題描述

Laravel 專案使用 laravel-mix , 專案根目錄在 webserver 下並非指到 /path/to/project/public , 而是 /path/to/project/ ,最後前端 SPA 加載 chunk 失敗

Chunk-Load-Error

# 想到的幾種解法與嘗試

勾選為嘗試過,刪除線非正解

# 連環雷?Murmur

這整個事件的起因是

  1. testing, development, production 的 entry 不同

    我個人 testing 直接 nginx 指到專案 public 目錄,i.e. https://測試網址/
    其他人 testing 則是指到專案目錄,i.e. https://測試網址/public
    dev 環境則是 http://測試IP/path/to/專案/public

    但這不能算 laravel 的 bug
    laravel 官方文件一開始就講明
    site root 應該指到 laravel_project/public
    就測試/開發環境的不同,才會踩到雷

    我想其他夥伴開發時需要指到 public 可能有其他需求,
    算了入境隨俗,路徑上能處理還是彈性點處理掉吧

  2. Webpack Dynamic Public Path Plugin,都是支援 Webpack 4 的
    其中有使用到 Webpack 5 棄用的 api,所以裝完在 build 時,就會無情地溫馨報錯

  3. 這應該不算但是工作量 +1,XD

    對接 API 時的路徑,原先想說大部分 API 只會在對應的 vue 組件中被調用,就偷懶
    結果跟路徑雷一起小踩了,最後還是把 API 的部份獨立拆到 api.js 中做管理

    怎麼拆?我是這個效仿這個方式
    使用Axios時你的API都怎麼管理? (opens new window)

# 腦霧戰士回憶錄

// global
window.g_config = {
	publicPath: "{{ Request::root() }}/"
}

// vue-router
let spaPath = '/'

if (window.g_config && window.g_config.publicPath) {
    const appUrl = new URL(window.g_config.publicPath)
    spaPath = appUrl.pathname
}

const router = new VueRouter({
    mode: "history",
    base: spaPath,

# 參考資料與延伸閱讀