国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

quicklink解析

Steve_Wang_ / 1136人閱讀

摘要:等待瀏覽器空閑后執(zhí)行。使用方式參考鏈接源碼解析的入口函數(shù)接受傳入的配置參數(shù),通過函數(shù)和默認(rèn)的配置選項(xiàng)合并。然后在回調(diào)中便利傳入的數(shù)組,如果數(shù)組中的元素包含在對象中,則取消對該元素的監(jiān)視,并對該標(biāo)簽元素所對應(yīng)的資源進(jìn)行預(yù)加載。

簡介

quicklink是一個(gè)js庫,可以預(yù)加載出現(xiàn)在視口的網(wǎng)頁鏈接,提高用戶體驗(yàn)。它的加載過程如下:
1.檢測網(wǎng)頁中的鏈接是否出現(xiàn)在視口中,等待鏈接出現(xiàn)在視口,執(zhí)行步驟2。
2.等待瀏覽器空閑后執(zhí)行3。
3.判斷當(dāng)前的網(wǎng)絡(luò)連接是否是2G,如果是則停止執(zhí)行,如果不是2G網(wǎng)絡(luò),執(zhí)行步驟4。
4.預(yù)加載鏈接指向資源。

使用方式

參考鏈接https://github.com/GoogleChro...

quicklink源碼解析

quicklink的入口函數(shù)接受傳入的配置參數(shù),通過Object.assign函數(shù)和默認(rèn)的配置選項(xiàng)合并。接著執(zhí)行timeoutFn異步方法,該方法接收一個(gè)回調(diào)函數(shù),在回調(diào)中主要邏輯如下:
如果傳入的options參數(shù)中有urls屬性,則直接執(zhí)行預(yù)加載,否則通過document.querySelectorAll方法獲取所有a標(biāo)簽元素的NodeList,然后便利該元素節(jié)點(diǎn)列表,并監(jiān)視該元素節(jié)點(diǎn)

</>復(fù)制代碼

  1. observer.observe(link);

然后判斷該a元素對象的href屬性值所屬的域名是否被允許訪問,如果被允許訪問,繼續(xù)判斷該鏈接是否應(yīng)該被忽略,判斷邏輯如下:

</>復(fù)制代碼

  1. if (!allowed.length || allowed.includes(link.hostname)) {
  2. // If there are any filters, the link must not match any of them
  3. isIgnored(link, ignores) || toPrefetch.add(link.href);
  4. }

如果鏈接沒有被忽略,則將該節(jié)點(diǎn)的href屬性值加入到toPrefetch中

</>復(fù)制代碼

  1. const toPrefetch = new Set();
  2. toPrefetch.add(link.href);

總的代碼邏輯如下

</>復(fù)制代碼

  1. export default function (options) {
  2. options = Object.assign({
  3. timeout: 2e3,
  4. priority: false,
  5. timeoutFn: requestIdleCallback,
  6. el: document,
  7. }, options);
  8. observer.priority = options.priority;
  9. const allowed = options.origins || [location.hostname];
  10. const ignores = options.ignores || [];
  11. options.timeoutFn(() => {
  12. // If URLs are given, prefetch them.
  13. if (options.urls) {
  14. options.urls.forEach(prefetcher);
  15. } else {
  16. // If not, find all links and use IntersectionObserver.
  17. Array.from(options.el.querySelectorAll("a"), link => {
  18. observer.observe(link);
  19. // If the anchor matches a permitted origin
  20. // ~> A `[]` or `true` means everything is allowed
  21. if (!allowed.length || allowed.includes(link.hostname)) {
  22. // If there are any filters, the link must not match any of them
  23. isIgnored(link, ignores) || toPrefetch.add(link.href);
  24. }
  25. });
  26. }
  27. }, {timeout: options.timeout});
  28. }
檢測link出現(xiàn)在視口

上面通過observer.observe(link)監(jiān)視節(jié)點(diǎn)元素,其中observer是IntersectionObserver對象的實(shí)例,被監(jiān)聽的節(jié)點(diǎn)對象出現(xiàn)在視口時(shí),會執(zhí)行new操作時(shí)傳入的回調(diào)函數(shù),并將出現(xiàn)在視口的節(jié)點(diǎn)對象通過數(shù)組的形式傳給該回調(diào)。然后在回調(diào)中便利傳入的數(shù)組,如果數(shù)組中的元素包含在toPrefetch對象中,則取消對該元素的監(jiān)視,并對該a標(biāo)簽元素所對應(yīng)的資源進(jìn)行預(yù)加載。

</>復(fù)制代碼

  1. const observer = new IntersectionObserver(entries => {
  2. entries.forEach(entry => {
  3. if (entry.isIntersecting) {
  4. const link = entry.target;
  5. if (toPrefetch.has(link.href)) {
  6. observer.unobserve(link);
  7. prefetcher(link.href);
  8. }
  9. }
  10. });
  11. });
異步函數(shù)實(shí)現(xiàn)

如果瀏覽器支持requestIdleCallback,則使用原生的函數(shù),如果不支持,則使用setTimeout函數(shù)做ployfill。

</>復(fù)制代碼

  1. const requestIdleCallback = requestIdleCallback ||
  2. function (cb) {
  3. const start = Date.now();
  4. return setTimeout(function () {
  5. cb({
  6. didTimeout: false,
  7. timeRemaining: function () {
  8. return Math.max(0, 50 - (Date.now() - start));
  9. },
  10. });
  11. }, 1);
  12. };
  13. export default requestIdleCallback;
資源請求函數(shù)實(shí)現(xiàn)

預(yù)加載策略主要有三種

1. prefetch

</>復(fù)制代碼

  1. function linkPrefetchStrategy(url) {
  2. return new Promise((resolve, reject) => {
  3. const link = document.createElement(`link`);
  4. link.rel = `prefetch`;
  5. link.href = url;
  6. link.onload = resolve;
  7. link.onerror = reject;
  8. document.head.appendChild(link);
  9. });
  10. };

2.ajax加載

</>復(fù)制代碼

  1. function xhrPrefetchStrategy(url) {
  2. return new Promise((resolve, reject) => {
  3. const req = new XMLHttpRequest();
  4. req.open(`GET`, url, req.withCredentials=true);
  5. req.onload = () => {
  6. (req.status === 200) ? resolve() : reject();
  7. };
  8. req.send();
  9. });
  10. }

3.Fetch請求加載

</>復(fù)制代碼

  1. function highPriFetchStrategy(url) {
  2. // TODO: Investigate using preload for high-priority
  3. // fetches. May have to sniff file-extension to provide
  4. // valid "as" values. In the future, we may be able to
  5. // use Priority Hints here.
  6. //
  7. // As of 2018, fetch() is high-priority in Chrome
  8. // and medium-priority in Safari.
  9. return self.fetch == null
  10. ? xhrPrefetchStrategy(url)
  11. : fetch(url, {credentials: `include`});
  12. }
網(wǎng)絡(luò)類型判斷

</>復(fù)制代碼

  1. if (conn = navigator.connection) {
  2. // Don"t prefetch if the user is on 2G. or if Save-Data is enabled..
  3. if ((conn.effectiveType || "").includes("2g") || conn.saveData) return;
  4. }

將上面三種預(yù)加載方法封裝成函數(shù),暴露給外部使用

</>復(fù)制代碼

  1. const supportedPrefetchStrategy = support("prefetch")
  2. ? linkPrefetchStrategy
  3. : xhrPrefetchStrategy;
  4. function prefetcher(url, isPriority, conn) {
  5. if (preFetched[url]) {
  6. return;
  7. }
  8. if (conn = navigator.connection) {
  9. // Don"t prefetch if the user is on 2G. or if Save-Data is enabled..
  10. if ((conn.effectiveType || "").includes("2g") || conn.saveData) return;
  11. }
  12. // Wanna do something on catch()?
  13. return (isPriority ? highPriFetchStrategy : supportedPrefetchStrategy)(url).then(() => {
  14. preFetched[url] = true;
  15. });
  16. };
  17. export default prefetcher;

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/100770.html

相關(guān)文章

  • quicklink解析

    摘要:等待瀏覽器空閑后執(zhí)行。使用方式參考鏈接源碼解析的入口函數(shù)接受傳入的配置參數(shù),通過函數(shù)和默認(rèn)的配置選項(xiàng)合并。然后在回調(diào)中便利傳入的數(shù)組,如果數(shù)組中的元素包含在對象中,則取消對該元素的監(jiān)視,并對該標(biāo)簽元素所對應(yīng)的資源進(jìn)行預(yù)加載。 簡介 quicklink是一個(gè)js庫,可以預(yù)加載出現(xiàn)在視口的網(wǎng)頁鏈接,提高用戶體驗(yàn)。它的加載過程如下:1.檢測網(wǎng)頁中的鏈接是否出現(xiàn)在視口中,等待鏈接出現(xiàn)在視口,執(zhí)...

    silvertheo 評論0 收藏0
  • 結(jié)合 Google quicklink,react 項(xiàng)目實(shí)現(xiàn)頁面秒開

    摘要:最后,狀態(tài)管理與同構(gòu)實(shí)戰(zhàn)這本書由我和前端知名技術(shù)大佬顏海鏡合力打磨,凝結(jié)了我們在學(xué)習(xí)實(shí)踐框架過程中的積累和心得。 對于前端資訊比較敏感的同學(xué),可能這兩天已經(jīng)聽說了 GoogleChromeLabs/quicklink這個(gè)項(xiàng)目:它由 Google 公司著名開發(fā)者 Addy Osmani 發(fā)起,實(shí)現(xiàn)了:在空閑時(shí)間預(yù)獲取頁面可視區(qū)域內(nèi)的鏈接,加快后續(xù)加載速度。如果你沒有聽說過 Addy Os...

    warkiz 評論0 收藏0
  • 《阿里云前端技術(shù)周刊》第二期

    摘要:作者也樹校對染陌素材也樹英布阿里云前端技術(shù)周刊由阿里云智能商業(yè)中臺體驗(yàn)技術(shù)團(tuán)隊(duì)整理編寫。如何在工作中快速成長致工程師的個(gè)簡單技巧工程師成長干貨,全文提綱如下,圖片來自阿里技術(shù)公眾號關(guān)于我們我們是阿里云智能中臺體驗(yàn)技術(shù)團(tuán)隊(duì)。 作者:@也樹 校對:@染陌 素材:@也樹、@英布 《阿里云前端技術(shù)周刊》由阿里云智能商業(yè)中臺體驗(yàn)技術(shù)團(tuán)隊(duì)整理編寫。 知乎:阿里云中臺前端/全棧團(tuán)隊(duì)專欄 Github...

    kyanag 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<