instant.page:提高網站頁面載入速度
能提高網頁的載入速度,主要原理是當用戶滑鼠停留在連結上時,會通過html預載入這個連結。
在使用者點選連結之前,他們將滑鼠懸停在該連結上。當用戶停留65毫秒時,他們將有一半的機會點選該連結,因此此時開始預載入,平均超過300毫秒,以便頁面預載入。
在移動裝置上,使用者在釋放之前開始觸控他們的顯示器,平均花費90毫秒來預載入頁面。
也可以到https://instant.page/頁面將一段js加入自己的網站,不過其伺服器是在國外。點選標題下載原始碼放入自己的伺服器上。
原始碼:
<font><i>/*! instant.page v1.0.0 - (C) 2019 Alexandre Dieulot - https://instant.page/license */</i></font><font> let urlToPreload let mouseoverTimer let lastTouchTimestamp <b>const</b> prefetcher = document.createElement('link') <b>const</b> isSupported = prefetcher.relList && prefetcher.relList.supports && prefetcher.relList.supports('prefetch') <b>const</b> allowQueryString = 'instantAllowQueryString' in document.body.dataset <b>if</b> (isSupported) { prefetcher.rel = 'prefetch' document.head.appendChild(prefetcher) <b>const</b> eventListenersOptions = { capture: <b>true</b>, passive: <b>true</b>, } document.addEventListener('touchstart', touchstartListener, eventListenersOptions) document.addEventListener('mouseover', mouseoverListener, eventListenersOptions) } function touchstartListener(event) { </font><font><i>/* Chrome on Android calls mouseover before touchcancel so `lastTouchTimestamp` * must be assigned on touchstart to be measured on mouseover. */</i></font><font> lastTouchTimestamp = performance.now() <b>const</b> linkElement = event.target.closest('a') <b>if</b> (!linkElement) { <b>return</b> } <b>if</b> (!isPreloadable(linkElement)) { <b>return</b> } linkElement.addEventListener('touchcancel', touchendAndTouchcancelListener, {passive: <b>true</b>}) linkElement.addEventListener('touchend', touchendAndTouchcancelListener, {passive: <b>true</b>}) urlToPreload = linkElement.href preload(linkElement.href) } function touchendAndTouchcancelListener() { urlToPreload = undefined stopPreloading() } function mouseoverListener(event) { <b>if</b> (performance.now() - lastTouchTimestamp < 1100) { <b>return</b> } <b>const</b> linkElement = event.target.closest('a') <b>if</b> (!linkElement) { <b>return</b> } <b>if</b> (!isPreloadable(linkElement)) { <b>return</b> } linkElement.addEventListener('mouseout', mouseoutListener, {passive: <b>true</b>}) urlToPreload = linkElement.href mouseoverTimer = setTimeout(() => { preload(linkElement.href) mouseoverTimer = undefined }, 65) } function mouseoutListener(event) { <b>if</b> (event.relatedTarget && event.target.closest('a') == event.relatedTarget.closest('a')) { <b>return</b> } <b>if</b> (mouseoverTimer) { clearTimeout(mouseoverTimer) mouseoverTimer = undefined } <b>else</b> { urlToPreload = undefined stopPreloading() } } function isPreloadable(linkElement) { <b>if</b> (urlToPreload == linkElement.href) { <b>return</b> } <b>const</b> urlObject = <b>new</b> URL(linkElement.href) <b>if</b> (urlObject.origin != location.origin) { <b>return</b> } <b>if</b> (!allowQueryString && urlObject.search) { <b>return</b> } <b>if</b> (urlObject.pathname + urlObject.search == location.pathname + location.search && urlObject.hash) { <b>return</b> } <b>if</b> ('noInstant' in linkElement.dataset) { <b>return</b> } <b>return</b> <b>true</b> } function preload(url) { prefetcher.href = url } function stopPreloading() { </font><font><i>/* The spec says an empty string should abort the prefetching * but Firefox 64 interprets it as a relative URL to prefetch. */</i></font><font> prefetcher.removeAttribute('href') } </font>
在頁面加入:
<script src="instant.js" type="module" integrity="sha384-6w2SekMzCkuMQ9sEbq0cLviD/yR2HfA/+ekmKiBnFlsoSvb/VmQFSi/umVShadQI"></script>