悟空H5專題采用的是前后端分離方案,服務器域名和專題域名不一致,會受到瀏覽器同源策略影響。
我們發現數據主接口會發起兩次,其中第一個請求為預檢請求。
一般來說使用 application/json 的 post 請求是必然會帶入 OPTION 請求,何為 OPTION 預檢:
用於獲取目的資源所支持的通信選項。客戶端可以對特定的 URL 使用 OPTIONS 方法,也可以對整站(通過將 URL 設置為“*”)使用該方法。
在 CORS 中,可以使用 OPTIONS 方法發起一個預檢請求,以檢測實際請求是否可以被服務器所接受。預檢請求報文中的 Access-Control-Request-Method 首部字段告知服務器實際請求所使用的 HTTP 方法;Access-Control-Request-Headers 首部字段告知服務器實際請求所攜帶的自定義首部字段。服務器基於從預檢請求獲得的信息來判斷,是否接受接下來的實際請求。
有趣的是專題詳情為 GET 接口,為何 GET 請求也會發起 option 預檢?
這個原因得從簡單請求和復雜請求說起,跨域請求分為簡單和復雜兩種:
簡單請求:
請求方式為如下之一:
HEAD
GET
POST
HTTP 請求頭只能包含如下信息:
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type,但僅能是下列之一
application/x-www-form-urlencoded
multipart/form-data
text/plain
任何一個不滿足上述要求的請求,即被認為是復雜請求。一個復雜請求不僅有包含通信內容的請求,同時也包含預檢信息。

專題配置接口請求頭中帶有自定義 header,瀏覽器會認定為非簡單請求,需要向服務器發出檢查,判斷該域名是否允許跨域。
經過分析發現,自定義 header 其實在此業務場景中非必傳自帶,發出預檢請求至少會有 100ms 的耗時,無形中延長頁面繪制時間。
最終解決方案:去除自定義header,修改為簡單請求,避免該請求發出預檢。
