學習一下webpack中devServer.proxy的配置


在實際開發過程中,我們經常遇到跨域的問題,一般我們都會讓后端設置一下允許跨域就可以了,但其實我們自己也是可以弄的。

現在的項目用vue寫的多一點,vue-cli腳手架搭建也比較方便,腳手架搭建的項目其實已經融入了webpack。更多時候我們會在項目根目錄下面建一個vue.config.js文件,用來做webpack的一些配置。

最近使用的配置大概是這樣的:

module.exports = {
  /* 部署生產環境和開發環境下的URL:可對當前環境進行區分,baseUrl 從 Vue CLI 3.3 起已棄用,要使用publicPath */
  /* baseUrl: process.env.NODE_ENV === 'production' ? './' : '/' */
  // publicPath: process.env.NODE_ENV === "production" ? "/public/" : "./",
  publicPath: './',
  /* 輸出文件目錄:在npm run build時,生成文件的目錄名稱 */
  outputDir: 'dist',
  /* 放置生成的靜態資源 (js、css、img、fonts) 的 (相對於 outputDir 的) 目錄 */
  assetsDir: 'assets',
  /* 是否在構建生產包時生成 sourceMap 文件,false將提高構建速度 */
  productionSourceMap: false,
  /* 默認情況下,生成的靜態資源在它們的文件名中包含了 hash 以便更好的控制緩存,你可以通過將這個選項設為 false 來關閉文件名哈希。(false的時候就是讓原來的文件名不改變) */
  filenameHashing: true,
  /* 代碼保存時進行eslint檢測 */
  lintOnSave: true,
  /* webpack-dev-server 相關配置 */
  devServer: {
    /* 自動打開瀏覽器 */
    open: true,
    /* 設置為0.0.0.0則所有的地址均能訪問 */
    host: '0.0.0.0',
    port: 8085,
    https: false,
    hotOnly: false
  }
}

devServer中其實還有一個proxy屬性,可以用做代理,簡單來說,配好了他,就可以用來實現跨域

因為dev-server使用了http-proxy-middleware包。

例如你在localhost:3000上有后端服務的話,可以這樣啟動代理

proxy: {
  "/api": "http://localhost:3000"
}

請求到/api/users現在會被代理到請求http://localhost:3000/api/user

如果不想始終傳遞/api,可以重寫路徑:

proxy: {
  "/api": {
    target: "http://localhost:3000",
    pathRewrite: {"^/api" : ""}
  }
}

默認情況下,不接受運行在https上,且使用了無效證書的后端服務器,如果你想要接收,修改配置如下:

proxy: {
  "/api": {
    target: "https://other-server.example.com",
    secure: false
  }
}

有時你不想代理所有的請求。可以基於一個函數的返回值繞過代理。

在函數中你可以訪問請求體、響應體和代理選項。必須返回false或路徑,來跳過代理請求。

例如:對於瀏覽器請求,你想要提供一個HTML頁面,但是對於API請求則保持代理。你可以這樣做:

proxy: {
  "/api": {
    target: "http://localhost:3000",
    bypass: function(req, res, proxyOptions) {
      if (req.headers.accept.indexOf("html") !== -1) {
        console.log("Skipping proxy for browser request.");
        return "/index.html";
      }
    }
  }
}

如果要將多個特定路徑代理到統一目標,可以使用一個或多個具有上下文屬性的對象數組:

proxy: [{
  context: ["/auth", "/api"],
  target: "http://localhost:3000",
}]

還可以同時代理多個

module.exports = {
  devServer: {
    proxy: {
      '/api': {
        target: '<url>',
        ws: true,
        changeOrigin: true
      },
      '/foo': {
        target: '<other_url>'
      }
    }
  }
}

各種騷操作,等待你去發掘應用。


免責聲明!

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



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