vue-cli4環境變量配置和代理跨域配置


環境變量配置

        .env                # 在所有的環境中被載入
        .env.local          # 在所有的環境中被載入,但會被 git 忽略
        .env.[mode]         # 只在指定的模式中被載入
        .env.[mode].local   # 只在指定的模式中被載入,但會被 git 忽略

  • .env 文件
  • ====> 執行 npm run serve 默認的本地開發環境配置
        // 默認的本地開發環境配置 每行后面不要加結束分號

        NODE_ENV = "development"
        BASE_URL = "./"

        // 打包后文件夾名字;默認dist;要在vue.config.js 中配置
        // 只有以 VUE_APP 開頭的變量會被 webpack.DefinePlugin 靜態嵌入到客戶端的包中,
        // 代碼中可以通過 process.env.VUE_APP_BASE_API 訪問 這樣定義的值
        // 在 vue.config.js 中可以獲取到 outputDir ,但是在客戶端代碼中無法獲取;
        outputDir = "dist"
        VUE_APP_API = "http://v.juhe.cn/joke"

  • .env.production 文件
  • ===>執行 npm run build 默認的環境配置(正式服務器)
        // build 默認的環境配置(正式服務器)每行后面不要加結束分號
        NODE_ENV = "production"
        BASE_RUL = "./"

        // 打包后文件夾名字;要在vue.config.js 中配置
        outputDir = "dist_pro"

        // 自定義的一些在客戶端要獲取的變量要以 VUE_APP_  開頭,不然無法獲取到;
        VUE_APP_OUT_PUTDIR = "dist_pro"
        VUE_APP_API = "http://www.xxxx.com/api"

  • .env.pre 文件
  • ===>執行 npm run pre 自定義 build 環境配置(預發服務器)
    //自定義 build 環境配置(預發服務器)每行后面不要加結束分號
    NODE_ENV = "production"
    BASE_URL = "./"

    // 打包后文件夾名字; 要在vue.config.js 中配置
    outputDir = "dist_pre"

    VUE_APP_API = "http://www.自定義環境.com"  

  • package.json 一個模式有多中變量;
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint":  "vue-cli-service lint",
    "pre":   "vue-cli-service build --mode pre"
  }
  注意模式不同於 NODE_ENV,一個模式可以包含多個環境變量。
  也就是說,每個模式都會將 NODE_ENV 的值設置為模式的名稱
  比如在 development 模式下 NODE_ENV 的值會被設置為 "development"。;

  你可以通過為 .env 文件增加后綴來設置某個模式下特有的環境變量。
  比如,如果你在項目根目錄創建一個名為 .env.development 的文件,
  那么在這個文件里聲明過的變量就只會在 development 模式下被載入。

  你可以通過傳遞 --mode 選項參數為命令行覆寫默認的模式。
  例如,如果你想要在構建命令中使用開發環境變量,請在你的 package.json 腳本中加入;
  "dev-build": "vue-cli-service build --mode development",

  • index.vue
// index.vue  獲取最新的笑話
axios.get("/api/content/text.php",
        {   baseURL:process.env.NODE_ENV=="development"?'/':process.env.VUE_APP_API,
            params:{key:'19a578542216aeb8a23ccf5b05a61449'},
            headers:{'Content-Type':'application/json;charset=UTF-8'}
        })
    .then(res=>{
        console.log('text result',res);
    })
  • http.js
// axios 封裝,(示例demo 所以參數寫死的);
// 本地開發環境的話要使用 devServer 代理來跨域;"development" 時 baseURL 設置為 "/";
// 使用devServer 代理時 baseURL不能設置值;
app.ajax = (url,method)=>{
  return axios({
       url:url,
       baseURL:process.env.NODE_ENV=="development"?'/':process.env.VUE_APP_API,
       method:method,
       params:{
           key:'19a578542216aeb8a23ccf5b05a61449'
       },

       data:{
           sort:'desc',
           page:1,
           pagesize:10,
           time:parseInt( new Date().getTime()/1000),
           key:'19a578542216aeb8a23ccf5b05a61449'
       },
       headers:{'Content-Type':'application/json;charset=UTF-8'},

   })
}

export default app;

跨域代理配置

  • 本地開發時會涉及到跨域問題;至於在服務端 請加跨域請求頭
  • vue.config.js devServer 配置
// 注意使用devServer時 封裝的 http 請求中,baseURL不能設置值;
module.exports  = {
    outputDir:process.env.outputDir || 'dist',

    // 由於瀏覽器有跨域限制,這里cli 工具提供了 啟動本地代理服務器 請求
    devServer:{
        open:false,      // 是否打開瀏覽器;
        hotOnly:true,    // 是否熱更新;

        proxy:{
            '/api':{   // 路徑中有 /api 的請求都會走這個代理 , 可以自己定義一個,下面移除即可
                target:'http://v.juhe.cn/joke',    // 目標代理接口地址,實際跨域要訪問的接口,這個地址會替換掉 axios.defaults.baseURL
                secure:false,
                changeOrigin:true,  // 開啟代理,在本地創建一個虛擬服務端
                ws:true,       // 是否啟用  websockets;
                pathRewrite:{   // 去掉 路徑中的  /api  的這一截
                    '^/api':''
                }
            },

            '/test':{
                target:'http://v.juhe.cn/joke',   // 目標代理接口地址,實際跨域要訪問的接口,這個地址會替換掉 axios.defaults.baseURL
                secure:false,
                changeOrigin:true,
                ws:true,
                pathRewrite:{
                    '^/test':'',
                }
            }
        
        },

    }

}

總結

  1. 代理配置 時 配置的主機地址 (即 baseURL) 應該為 "/"; 參考 http.js
  2. 真時的地址為 在 vue.config.js 中配置; 參考 vue.config.js 中 devServer 配置項
  3. 真時的接口地址為 'http://v.juhe.cn/joke/content/text.php'
  4. 瀏覽器看到的地址是: http://localhost:8080/api/content/text.php?key=19a578542216aeb8a23ccf5b05a61449

參考內容

  1. https://segmentfault.com/q/1010000022185695
  2. https://cli.vuejs.org/zh/guide/mode-and-env.html#模式
  3. https://github.com/chimurai/http-proxy-middleware


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM