爲何會有這個需求?
一些異步的靜態資源(例如打包後的chunk.css,chunk.js),是指向當前請求server的地址的,而不是咱們指望的靜態資源服務器,因此咱們要配置publicpath,打包的時候指定請求的靜態資源服務器地址。
問題來了:
咱們有不少的環境,dev,test,uat,prd,
你總不能發佈每一個環境前,打不一樣的publicpath包吧?
那麼咱們就須要動態配置publicpath
webpack給咱們留了一條後路,
webpack_public_path
按照文檔所說,
咱們配置下__webpack_public_path__ = process.env.ASSET_PATH;
而後在main.js或者index.js 的首行代碼加載就行了,由於要在加載動態組件以前進行配置。
通常狀況下,咱們的首行代碼爲 import App from "./App"
你們也都知道 import 和 require的區別
import 是 編譯時導入,會有「提高現象」css
__webpack_public_path__ = "http://cdn.com"; import App from "./App"
實際上在打包編譯時爲webpack
import App from "./App" __webpack_public_path__ = "http://cdn.com";
那麼組件加載 是在 咱們publicPath 以前,那麼咱們配置publicPath也就失去了意義。
因此 咱們變通一下web
// publicpath.js __webpack_public_path__ = "http://cdn.com";
這樣就解決了typescript
import "./publicpath.js" import App from "./App"
另外上述只是配置publicpath,動態配置的話 須要 服務器template模版將當前環境的靜態資源服務器地址配置服務器
<script> window.publicpath = "http://test.cdn.com" </script>
// publicpath.js __webpack_public_path__ = window.publicpath;
注意一點,__webpack_public_path__是webpack的內部全局參數,而不是window對象的屬性,因此不要畫蛇添足寫成「window.__webpack_public_path__」異步
使用typescript的同窗,eslint 會error,
你改爲ide
// publicpath.js (__webpack_public_path__ as any) = "http://cdn.com";
就不會報錯了。ui