Vue項目中對index.html中BASE_URL的配置方式

Vue項目對index.html中BASE_URL的配置

問題

有時候後端配置資源的默認訪問路徑的時候,可能會與前端打包時配置的默認根路徑有所差異

比如:後端要訪問靜態資源的根路徑為/static,而一般情況下,我們項目的vue.config.js中對BAES_URL的配置是/,或者不做配置,因為它默認的值也是/

這個路徑決定瞭我們的前端項目打包後獲取靜態資源的默認的根路徑(不顯示在代碼中),同時,這個路徑也在public/index.html中有明顯的引用,大多時候都會看到如下的代碼: 

<!DOCTYPE html>
<html lang="zh-cmn-Hans">
  <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">
    <link rel="icon" href="<%=%20BASE_URL%20%>logo.png" rel="external nofollow" >
    <title>xxxx</title>
  </head>
  <body>
  	<div>.......</div>
  </body>
</html>

那麼,我們應該如何去修改這個BAE_URL的值呢?

解決

通過 vue-cli3 官方文檔的查閱,發現:

所以,顯而易見,如果想修改 BASE_URL,

Vue CLI 3.3 之前的版本,配置:baseURl: '/static'

Vue CLI 3.3 之後(包括3.3)的版本,配置:publicPath: '/static'

因為這個值在開發環境下同樣生效,所以說這麼一改打包後是沒問題瞭,但自己的項目運行起來卻會報錯,官方也給出瞭方案。很簡單,隻需要判斷一下當前環境是生產環境還是開發環境,再應用不同的路徑就可以瞭。如下:

module.exports = {
  publicPath: process.env.NODE_ENV === 'production'
    ? '/static/'
    : '/'
}

註意:

還需要註意的一個問題是,當我們修改瞭publicPath 之後,如果我們對路由的配置是像下面這樣:

export default new Router({
  mode: 'history',
  base: process.env.BASE_URL,
  scrollBehavior: () => ({ y: 0 }),
  routes: constantRouterMap.concat(asyncRouterMap)
})

可以看到路由的基礎路徑跟 BASE_URL 即 publicPath 是相同的。

如果保持原來的配置,那麼所有的路由都會帶上多餘的前綴,如:/static/home

修改方式也很簡單,如下:

Vue.use(Router)
export default new Router({
  mode: 'history',
  // base: process.env.BASE_URL,
  base: '/',
  scrollBehavior: () => ({ y: 0 }),
  routes: constantRouterMap.concat(asyncRouterMap)
})

將base屬性重置為/即可 

Vue項目url中的<%= BASE_URL %>

vue-cli 創建的一個項目中執行命令 vue inspect > output.js 將 vue-cli 中 webpack 的配置信息導出到 output.js 文件,會有一段代碼:

 new DefinePlugin(
     {
       'process.env': {
         NODE_ENV: '"development"',
         BASE_URL: '"/"'
       }
     }
   ),

在 webpack 中全局聲明瞭 BASE_URL 這個變量為項目根目錄。 

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。 

推薦閱讀: