در این لبه کد، واکشی اولیه را به دو صورت پیاده سازی خواهید کرد: با <link rel="prefetch">
و با هدر Link
HTTP.
اپلیکیشن نمونه وب سایتی است که دارای صفحه فرود تبلیغاتی با تخفیف ویژه برای پرفروش ترین تی شرت فروشگاه است. از آنجایی که صفحه فرود به یک محصول پیوند دارد، میتوان فرض کرد که درصد بالایی از کاربران به صفحه جزئیات محصول میروند. این باعث میشود صفحه محصول به یک کاندید عالی برای واکشی اولیه در صفحه فرود تبدیل شود.
عملکرد را اندازه گیری کنید
ابتدا عملکرد پایه را تعیین کنید:
- روی Remix to Edit کلیک کنید تا پروژه قابل ویرایش باشد.
- برای پیش نمایش سایت، View App را فشار دهید. سپس تمام صفحه را فشار دهید .
- «Control+Shift+J» (یا «Command+Option+J» در Mac) را فشار دهید تا DevTools باز شود.
روی تب Network کلیک کنید.
در لیست کشویی Throttling ، Fast 3G را انتخاب کنید تا نوع اتصال کند را شبیه سازی کنید.
برای بارگیری صفحه محصول، روی خرید در حال حاضر در برنامه نمونه کلیک کنید.
بارگیری صفحه product-details.html
حدود 600 میلیثانیه طول میکشد:
صفحه محصول را با <link rel="prefetch">
از قبل واکشی کنید
برای بهبود پیمایش، یک تگ prefetch
در صفحه فرود وارد کنید تا صفحه product-details.html
از قبل واکشی شود:
- عنصر
<link>
زیر را به سر فایلviews/index.html
اضافه کنید:
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet">
<link rel="prefetch" href="/product-details.html" as="document">
...
</head>
ویژگی as
اختیاری است اما توصیه می شود. این به مرورگر کمک می کند تا سرصفحه های مناسب را تنظیم کند و تعیین کند که آیا منبع از قبل در حافظه پنهان است یا خیر. مقادیر نمونه برای این ویژگی عبارتند از: document
، script
، style
، font
، image
و موارد دیگر .
برای تأیید اینکه واکشی اولیه کار می کند:
- برای پیش نمایش سایت، View App را فشار دهید. سپس تمام صفحه را فشار دهید .
- «Control+Shift+J» (یا «Command+Option+J» در Mac) را فشار دهید تا DevTools باز شود.
روی تب Network کلیک کنید.
در لیست کشویی Throttling ، Fast 3G را انتخاب کنید تا نوع اتصال کند را شبیه سازی کنید.
چک باکس Disable cache را پاک کنید.
بارگیری مجدد برنامه
اکنون وقتی صفحه فرود بارگیری می شود، صفحه product-details.html
نیز بارگیری می شود، اما با کمترین اولویت:
صفحه به مدت پنج دقیقه در حافظه پنهان HTTP نگهداری می شود و پس از آن قوانین عادی Cache-Control
برای سند اعمال می شود. در این مورد، product-details.html
یک هدر cache-control
با مقدار public, max-age=0
دارد، به این معنی که صفحه در مجموع پنج دقیقه نگه داشته می شود.
ارزیابی مجدد عملکرد
- برنامه را دوباره بارگیری کنید.
- برای بارگیری صفحه محصول، روی خرید در حال حاضر در برنامه نمونه کلیک کنید.
به پنل شبکه نگاهی بیندازید. در مقایسه با ردیابی اولیه شبکه دو تفاوت وجود دارد:
- ستون Size "cache prefetch" را نشان می دهد، به این معنی که این منبع به جای شبکه، از حافظه پنهان مرورگر بازیابی شده است.
- ستون Time نشان می دهد که زمان بارگذاری سند اکنون حدود 10 میلی ثانیه است.
این تقریباً 98٪ کاهش نسبت به نسخه قبلی است که حدود 600 میلی ثانیه طول کشید.
اعتبار اضافی: از prefetch
به عنوان یک بهبود پیشرونده استفاده کنید
واکشی اولیه به بهترین وجه به عنوان یک پیشرفت پیشرونده برای کاربرانی که در اتصالات سریع مرور میکنند، اجرا میشود. میتوانید از Network Information API برای بررسی شرایط شبکه استفاده کنید و بر اساس آن تگهای واکشی اولیه را به صورت پویا تزریق کنید. به این ترتیب، می توانید مصرف داده را به حداقل برسانید و در هزینه های کاربران در برنامه های داده کند یا گران قیمت صرفه جویی کنید.
برای اجرای پیش واکشی تطبیقی، ابتدا تگ <link rel="prefetch">
را از views/index.html
حذف کنید:
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet">
<link rel="prefetch" href="/product-details.html" as="document">
...
</head>
سپس کد زیر را به public/script.js
اضافه کنید تا تابعی را اعلام کنید که به صورت پویا تگ prefetch
را زمانی که کاربر در یک اتصال سریع است، تزریق می کند:
function injectLinkPrefetchIn4g(url) {
if (window.navigator.connection.effectiveType === '4g') {
//generate link prefetch tag
const linkTag = document.createElement('link');
linkTag.rel = 'prefetch';
linkTag.href = url;
linkTag.as = 'document';
//inject tag in the head of the document
document.head.appendChild(linkTag);
}
}
عملکرد به صورت زیر عمل می کند:
- ویژگی effectType API اطلاعات شبکه را بررسی میکند تا مشخص کند کاربر از اتصال 4G (یا سریعتر) استفاده میکند.
- اگر این شرط برآورده شود، یک تگ
<link>
باprefetch
به عنوان نوع اشاره ایجاد می کند، URL را که در ویژگیhref
از پیش واکشی می شود ارسال می کند و نشان می دهد که منبع یکdocument
HTML در ویژگیas
است. - در نهایت اسکریپت را به صورت پویا در
head
صفحه تزریق می کند.
سپس script.js
به views/index.html
، درست قبل از بسته شدن تگ </body>
اضافه کنید:
<body>
...
<script src="/script.js"></script>
</body>
درخواست script.js
در انتهای صفحه تضمین می کند که پس از تجزیه و بارگذاری صفحه بارگذاری و اجرا می شود.
برای اطمینان از اینکه واکشی اولیه با منابع حیاتی صفحه فعلی تداخل ندارد، قطعه کد زیر را برای فراخوانی injectLinkPrefetchIn4g()
در رویداد window.load
اضافه کنید:
<body>
...
<script src="/script.js"></script>
<script>
window.addEventListener('load', () => {
injectLinkPrefetchIn4g('/product-details.html');
});
</script>
</body>
صفحه فرود اکنون product-details.html
را فقط در اتصالات سریع واکشی می کند. برای تأیید اینکه:
- برای پیش نمایش سایت، View App را فشار دهید. سپس تمام صفحه را فشار دهید .
- «Control+Shift+J» (یا «Command+Option+J» در Mac) را فشار دهید تا DevTools باز شود.
- روی تب Network کلیک کنید.
- در لیست کشویی Throttling ، Online را انتخاب کنید.
- برنامه را دوباره بارگیری کنید.
باید product-details.html
را در پنل Network ببینید:
برای تأیید اینکه صفحه محصول در اتصالات کند واکشی نشده است:
- در لیست کشویی Throttling، Slow 3G را انتخاب کنید.
- برنامه را دوباره بارگیری کنید.
پانل شبکه باید فقط شامل منابع صفحه فرود بدون product-details.html
.html :
برگه سبک صفحه محصول را با سرصفحه Link
HTTP واکشی کنید
هدر Link
HTTP می تواند برای واکشی اولیه همان نوع منابعی که تگ link
است استفاده شود. تصمیم گیری در مورد زمان استفاده از یکی یا دیگری بیشتر به ترجیح شما بستگی دارد، زیرا تفاوت در عملکرد ناچیز است. در این مورد، شما از آن برای واکشی اولیه CSS اصلی صفحه محصول استفاده خواهید کرد تا رندر آن را بهبود ببخشید.
یک هدر Link
HTTP برای style-product.css
در پاسخ سرور برای صفحه فرود اضافه کنید:
- فایل
server.js
را باز کنید و به دنبال handlerget()
برای آدرس ریشه بگردید:/
. - خط زیر را در ابتدای کنترل کننده اضافه کنید:
app.get('/', function(request, response) {
response.set('Link', '</style-product.css>; rel=prefetch');
response.sendFile(__dirname + '/views/index.html');
});
- برای پیش نمایش سایت، View App را فشار دهید. سپس تمام صفحه را فشار دهید .
- «Control+Shift+J» (یا «Command+Option+J» در Mac) را فشار دهید تا DevTools باز شود.
- روی تب Network کلیک کنید.
- برنامه را دوباره بارگیری کنید.
پس از بارگیری صفحه فرود style-product.css
اکنون در کمترین اولویت از قبل واکشی می شود:
برای رفتن به صفحه محصول، اکنون خرید را کلیک کنید. به پنل شبکه نگاهی بیندازید:
فایل style-product.css
از "کش پیش واکشی" بازیابی شده است و بارگیری آن تنها 12 میلی ثانیه طول کشید.