1. 程式人生 > >從壹開始前後端分離 [.netCore 填坑 ] 三十三║ ⅖ 種方法實現完美跨域

從壹開始前後端分離 [.netCore 填坑 ] 三十三║ ⅖ 種方法實現完美跨域

緣起

哈嘍大家週四好,趁著大家在團建的時候花一個下午學點兒東西,也是督促大家學習喲,希望大家看到老張的文章,可以有一丟丟的學習動力。不過話說過來,該吃的團建還是要去的,不能學我呀 [ /(ㄒoㄒ)/~~ ],昨天開始搭建公司的前後端分離專案,糾結是 Iview 還是 ElementUI ,百思不得其解,都說處女座糾結,我一個巨蟹為何如此,歡迎大佬們給出意見和建議~~~

開發 Vue 的時候,哪一種前端樣式框架更好?

鑑於群裡小夥伴問得最多的問題,這裡找到Top3的其中之一,就是跨域問題(下次說說EFCore),當然這個問題是老生常談的問題了,而且在之前的時候也已經說過了,不知道大家在使用的時候怎麼樣——坑來自於文章《

框架之十二 || 三種跨域方式比較》。當然,大家會問了,既然都說過了,為何還要說呢,特別是使用 CORS 來實現跨域,很輕鬆,短短的幾行程式碼就搞定了,但是或多或少會遇到這樣的問題,1、把Http和 Https 搞混了,失敗;2、如果是前端埠號不固定,會經常要後端配置埠號,麻煩;3、最重要的一點就是把我們的介面地址暴漏出去了,不爽;如果你不信,可以看看我之前自己的一個線上版本  http://vue.blog.azlinli.com/#/

雖然介面資料很正常被獲取,但是介面地址還是不想暴露出去,欸?!那咋辦,這就是說到了今天說的內容了,大家看我寫的標題應該也能明白,⅖ 種方法—— 前邊的三種方法已經說了,這裡再重溫下:

0、不跨域 —— 前後端寫在一起,別笑,還真的有人已經把Vue 和 .net 整合到一起了,不說明

1、JsonP —— 在JQ中挺好,弊端也有,淺嘗輒止

2、新增請求頭 —— 需要後端來設計,不推薦

3、CORS —— 這個是我在跨域中遇到的神器,優缺點上邊也說了,還是很不錯的,推薦使用

4、webpack 本地代理 —— dev 環境的一大神器,只需在 webpack 中三行配置,即可代理到本地,只能在本地,大弊端,不過仍推薦使用

5、Nginx 反向代理 —— 完美解決 Build 後生產環境中的跨域問題,配合以後的負載均衡,強烈推薦

因為前三種跨域方法,已經在之前的文章中提到了《

框架之十二 || 三種跨域方式比較》 ,這裡就不多說了,今天主要說說 Webpack 的本地代理,和Nginx反向代理實現跨域,完全不用對後端進行操作;

 最終我們的 部落格專案一 的呈現的效果 http://123.206.33.109:8077/:發現以及成功代理到本地了,並且是釋出到伺服器版本

 

一、基於webpack 的 proxy 代理——開發環境很方便

1、Vue-Cli 3.0 新增全域性配置檔案 vue.config.js

 vue專案搭建的時候,會有一個全域性config配置檔案,在 vue-cli 2.0 腳手架中,很明顯的把它放到了 config 的一個資料夾中,是這樣的,我們在 index.js 中可以埠號的配置,打包之後路徑的配置,圖片的配置 等等

但是 vue-cli 3.0 腳手架中,去掉了 config 這個資料夾,那我們如何配置呢,我們可以在專案根目錄新建一個 vue.config.js 檔案,像之前的很多繁瑣配置,都可以在這個檔案裡配置啦。官方說明,vue.config.js 是一個可選的配置檔案,如果專案的 (和 package.json 同級的) 根目錄中存在這個檔案,那麼它會被 @vue/cli-service 自動載入。你也可以使用 package.json 中的 vue 欄位,但是注意這種寫法需要你嚴格遵照 JSON 的格式來寫。

 我們就在根目錄下新建該檔案,然後新增內容:

module.exports = {
  // 基本路徑
  baseUrl: "/",
  // 輸出檔案目錄
  outputDir: "dist",
  // eslint-loader 是否在儲存的時候檢查
  lintOnSave: true,
  // webpack配置
  // see https://github.com/vuejs/vue-cli/blob/dev/docs/webpack.md
  chainWebpack: () => {},
  configureWebpack: () => {},
  // 生產環境是否生成 sourceMap 檔案
  productionSourceMap: true,
  // css相關配置
  css: {
    // 是否使用css分離外掛 ExtractTextPlugin
    extract: true,
    // 開啟 CSS source maps?
    sourceMap: false,
    // css預設器配置項
    loaderOptions: {},
    // 啟用 CSS modules for all css / pre-processor files.
    modules: false
  },
  // use thread-loader for babel & TS in production build
  // enabled by default if the machine has more than 1 cores
  parallel: require("os").cpus().length > 1,
  // PWA 外掛相關配置
  // see https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-pwa
  pwa: {},
  // webpack-dev-server 相關配置
  devServer: {
    open: true, //配置自動啟動瀏覽器
    host: "127.0.0.1",//主機
    port: 6688, // 埠號自定義
    https: false,//是否開啟https安全協議
    hotOnly: false, // https:{type:Boolean}
    proxy: null, // 設定代理

    before: app => {}
  },
  // 第三方外掛配置
  pluginOptions: {
    // ...
  }
};

相應的註釋都有,主要是配置 devServer ,從名字上也能看出來,這個是 dev 開發環境的服務配置,常用來配置我們的埠號 port ,還有一個就是 proxy 的設定代理。

2、配置 proxy 本地代理

 將上邊的 proxy: null 註釋掉,然後修改代理設定:

     proxy: {
       // 配置多個代理
       "/apb": {//定義代理名稱,為了和我們介面中的api搞混,我故意設定為apb
         target: "http://123.206.33.109:8081",//我們的介面域名地址
         ws: true,
         changeOrigin: true,//允許跨域
         pathRewrite: {
           // 路徑重寫,
           "^/apb": "" // 替換target中的請求地址
         }
       }
     },

這樣,我們就把介面地址代理到了本地,那代理到本地,如何呼叫呢,請往下看。

3、修改介面api地址,http.js檔案

還記得我們在 src 資料夾下有一個 api/http.js 檔案麼,這個就是配置我們的 http 請求相關的,其他的都不變,我們只需要把域名去掉即可,或者寫上本專案的域名:

// 配置API介面地址
var root1 = "http://localhost:58427/api";//沒有代理的本地api地址
var root2 = "http://123.206.33.109:8081/api/";//沒有代理的伺服器api地址
var root = "/apb/api/";//配置 proxy 代理的api地址,也可以寫成http://localhost:6688/apb/api

其實說白了,就是在專案啟動的時候,在node伺服器中,把  http://123.206.33.109:8081 == /abp == http://localhost:6688/apb

其他任何都不需要變,介面的使用還是原來的使用方法,這樣,我們在本地開發的時候,就可以獲取到後端api資料了,不用再去 .net core 中設定跨域CORS了,是不是很方便。

4、本地瀏覽效果

 記得我們修改 vue.config.js 後要重啟下服務,然後就可以看到專案成功獲取資料,並代理到本地:

可以看到,我們已經把遠端介面資料 123.206.33.109 成功的代理到了本地 localhost:6688 ,是不是很簡單!

5、build 打包釋出 IIS

 那我們本地開發好了,是不是一切都穩妥了呢,我們可以試一試,通過 build 打包,生成 dist 資料夾,然後將資料夾拷貝到伺服器,並配置 IIS ,這個很簡單,就和配置普通靜態頁面是一樣的,

我們發現雖然頁面可以瀏覽(可以渲染,證明我們的 vue 已經生效),但是卻獲取不到資料,這證明我們上邊的 proxy 代理,只是適用本地dev開發環境中:

截圖

雖然這個本地代理的方法很簡單,特別適合我們獨立開發,在跨域這一塊,完全不用和後端做處理,但是如何解決釋出狀態的呢,請繼續往下看。

二、基於Nginx 的反向代理——打包釋出一鍵搞定

這篇文章僅僅是如何使用 Nginx 作為一個反向代理伺服器,具體的深入原理以及負載均衡器等等,我會在以後的微服務系列中說到(不知不覺又給自己玩了一個坑