在實際開發過程中,我們經常遇到跨域的問題,一般我們都會讓后端設置一下允許跨域就可以了,但其實我們自己也是可以弄的。
現在的項目用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>' } } } }
各種騷操作,等待你去發掘應用。
