當您的頁面鏈接至使用 target="_blank" 的另一個頁面時,新頁面將與您的頁面在同一個進程上運行。 如果新頁面正在執行開銷極大的 JavaScript,您的頁面性能可能會受影響。
此外,target="_blank" 也是一個安全漏洞。新的頁面可以通過 window.opener 訪問您的窗口對象,並且它可以使用 window.opener.location = newURL 將您的頁面導航至不同的網址。
單擊下面的一個鏈接,打開一個需要大量JavaScript計算的頁面(以下並非鏈接,請參見原文——譯者注):
<a target="_blank">
<a target="_blank" rel="noopener">
沒有rel="noopener",隨機數會被新打開頁面中的JavaScript阻斷。不僅如此,所有主線程活動也會被阻塞,試試選擇頁面中的文本。但加了rel="noopener"之后,隨機數生成一直保持在60fps。當然,是在Chrome或Opera中。
大多數瀏覽器都是多進程的,除了Firefox(他們正在改)。每個進程包含多個線程,包括我們常說的“主”線程。解析、樣式計算、布局、繪制和非worker的JavaScript都在主線程里執行。就是說,一個域中的JavaScript與另一個標簽頁或窗口中的域中的JavaScript在不同的線程里。
然而,由於我們可以通過window.opener同步跨窗口地訪問DOM,因此通過target="_blank"啟動的窗口還在同一個進程(線程)中。通過window.open打開的iframe和窗口也一樣。
rel="noopener"會阻止window.opener,因此不存在跨窗口訪問。Chromium瀏覽器為此做過優化,會在獨立的進程中打開新頁面。