Pada tahun 2021, tim Chrome Aurora memperkenalkan Skrip komponen untuk meningkatkan memuat performa skrip pihak ketiga di Next.js. Sejak diluncurkan, kami telah memperluas kemampuannya untuk mempermudah pemuatan sumber daya pihak ketiga dan dengan lebih cepat bagi pengembang.
Posting blog ini memberikan ikhtisar tentang berbagai fitur baru yang telah kami rilis, terutama @next/third-parties serta garis besar inisiatif mendatang dalam rencana kami.
Implikasi performa skrip pihak ketiga
41% dari semua permintaan pihak ketiga di situs Next.js adalah skrip. Tidak seperti konten lain {i>script<i}, skrip dapat memakan banyak waktu untuk diunduh dan dijalankan, yang dapat memblokir rendering dan menunda interaktivitas pengguna. Data dari Chrome Laporan Pengalaman Pengguna (CrUX) menunjukkan bahwa situs Next.js yang memuat lebih banyak situs skrip memiliki Interaction to Next Paint yang lebih rendah (INP) dan Largest Contentful Paint (LCP) (LCP).
Korelasi yang diamati dalam diagram ini tidak menyiratkan kausalitas. Namun, model lokal memberikan bukti tambahan bahwa skrip pihak ketiga memengaruhi performa halaman. Misalnya, diagram di bawah ini membandingkan berbagai lab metrik saat penampung Google Tag Manager—terdiri dari 18 kolom yang dipilih secara acak tag—ditambahkan ke Taksonomi, contoh Next.js yang populer .
Dokumentasi WebPageTest memberikan detail tentang cara pengukuran waktu ini. Secara sekilas, ini memahami bahwa semua metrik lab ini dipengaruhi oleh penampung GTM. Sebagai contoh, Total Blocking Time (TBT)—lab yang berguna yang mendekati INP—mengalami peningkatan hampir 20 kali lipat.
Komponen skrip
Saat mengirimkan komponen <Script>
di Next.js, kami memastikan untuk memperkenalkan
melalui API yang mudah digunakan dan sangat mirip dengan <script>
. Dengan menggunakannya, developer dapat menempatkan skrip pihak ketiga
dalam aplikasi mereka, dan Next.js akan menangani pengurutan
skrip setelah resource penting dimuat.
<!-- By default, script will load after page becomes interactive -->
<Script src="https://example.com/sample.js" />
<!-- Script is injected server-side and fetched before any page hydration occurs -->
<Script strategy=”beforeInteractive” src="https://example.com/sample.js" />
<!-- Script is fetched later during browser idle time -->
<Script strategy=”lazyOnload” src="https://example.com/sample.js" />
Puluhan ribu aplikasi Next.js—termasuk situs populer seperti
Patreon, Target, dan
Notion—gunakan komponen <Script>
. Meskipun
efektifitasnya, beberapa developer telah menyampaikan kekhawatirannya
hal:
- Lokasi untuk menempatkan komponen
<Script>
di aplikasi Next.js dengan mematuhi berbagai petunjuk penginstalan dari berbagai penyedia pihak ketiga (pengalaman developer). - Strategi pemuatan mana yang paling optimal digunakan untuk berbagai skrip pihak ketiga (pengalaman pengguna).
Untuk mengatasi kedua masalah tersebut, kami meluncurkan @next/third-parties
—
library khusus yang menawarkan seperangkat komponen dan utilitas yang dioptimalkan
yang disesuaikan untuk pihak ketiga yang populer.
Pengalaman developer: mempermudah pengelolaan library pihak ketiga
Banyak skrip pihak ketiga digunakan dalam sebagian besar situs Next.js, dengan
Google Tag Manager menjadi yang
paling populer, yang digunakan oleh
66% situs secara berurutan.
@next/third-parties
di-build di atas <Script>
dengan memperkenalkan wrapper tingkat lebih tinggi yang
dirancang untuk menyederhanakan penggunaan
kasus penggunaan umum ini.
import { GoogleAnalytics } from "@next/third-parties/google";
export default function RootLayout({ children }) {
return (
<html lang="en">
<body>{children}</body>
<GoogleTagManager gtmId="GTM-XYZ" />
</html>
);
}
Google Analytics—skrip pihak ketiga lain yang banyak digunakan (52% situs Next.js)—juga memiliki komponen khusus sendiri.
import { GoogleAnalytics } from "@next/third-parties/google";
export default function RootLayout({ children }) {
return (
<html lang="en">
<body>{children}</body>
<GoogleAnalytics gaId="G-XYZ" />
</html>
);
}
@next/third-parties
menyederhanakan proses pemuatan skrip yang umum digunakan,
tetapi juga memperluas kemampuan kami untuk mengembangkan utilitas bagi pihak ketiga
kategori, seperti sematan. Misalnya, sematan Google Maps dan YouTube
digunakan di
8%
dan
4%
situs Next.js, dan kami juga telah mengirimkan komponen untuk membuatnya
lebih mudah dimuat.
import { GoogleMapsEmbed } from "@next/third-parties/google";
import { YouTubeEmbed } from "@next/third-parties/google";
export default function Page() {
return (
<>
<GoogleMapsEmbed
apiKey="XYZ"
height={200}
width="100%"
mode="place"
q="Brooklyn+Bridge,New+York,NY"
/>
<YouTubeEmbed videoid="ogfYd705cRs" height={400} params="controls=0" />
</>
);
}
Pengalaman pengguna: membuat library pihak ketiga dimuat lebih cepat
Sempurna, setiap pustaka pihak ketiga yang diadopsi secara luas akan dioptimalkan, sehingga abstraksi yang meningkatkan kinerja mereka tidak diperlukan. Namun, hingga hal itu diwujudkan, kita dapat mencoba meningkatkan kualitas saat diintegrasikan melalui framework populer seperti Next.js. Kita dapat bereksperimen dengan teknik pemuatan yang berbeda, pastikan bahwa skrip diurutkan dengan cara yang benar, dan pada akhirnya membagikan masukan kami kepada pihak ketiga penyedia layanan untuk mendorong perubahan upstream.
Contohnya, sematan YouTube. Di mana beberapa implementasi
alternatif memiliki
jauh lebih baik daripada sematan bawaan. Saat ini, <YouTubeEmbed>
komponen yang diekspor oleh @next/third-parties
menggunakan
lite-youtube-embed, yang akan
ketika didemonstrasikan dalam "Hello, World" (Halo Dunia) Perbandingan Next.js, yang dimuat secara signifikan
dengan lebih cepat.
Demikian pula, untuk Google Maps, kami menyertakan loading="lazy"
sebagai atribut default untuk
sematan untuk memastikan bahwa peta hanya
dimuat pada jarak tertentu dari
area pandang. Ini mungkin tampak seperti atribut yang jelas untuk disertakan—terutama
karena Google Maps
dokumentasi
menyertakannya dalam cuplikan kode contoh—tetapi hanya
45% situs Next.js yang menyematkan Google Maps menggunakan loading="lazy"
.
Menjalankan skrip pihak ketiga di pekerja web
Salah satu teknik tingkat lanjut yang kami eksplorasi di @next/third-parties
adalah membuatnya
lebih mudah untuk mengalihkan skrip pihak
ketiga ke pekerja web. Dipopulerkan oleh
seperti Partytown, hal ini dapat mengurangi
pengaruh skrip pihak ketiga terhadap performa halaman secara signifikan dengan
atau merelokasinya sepenuhnya dari thread utama.
GIF animasi berikut menunjukkan variasi dalam tugas yang panjang dan thread utama
waktu pemblokiran saat menerapkan strategi <Script>
yang berbeda ke penampung GTM
dalam situs Next.js. Perhatikan bahwa saat beralih di antara beberapa opsi strategi saja
menunda waktu eksekusi skrip, dan memindahkannya ke pekerja web
menghilangkan waktu mereka
di thread utama.
Dalam contoh khusus ini, memindahkan eksekusi penampung GTM dan skrip tag terkait ke pekerja web mengurangi TBT sebesar 92%.
Perlu dicatat bahwa, jika tidak dikelola dengan
hati, teknik ini dapat secara perlahan
merusak banyak skrip pihak ketiga, membuat proses debug menjadi sulit. Dalam
bulan, kami akan memvalidasi jika ada komponen
pihak ketiga yang ditawarkan oleh
@next/third-parties
berfungsi dengan benar saat dijalankan di pekerja web. Jika ya, kita akan
berupaya menyediakan cara yang mudah dan bersifat opsional bagi developer untuk menggunakan
standar.
Langkah berikutnya
Dalam proses pengembangan paket ini, menjadi jelas bahwa ada
perlu memusatkan rekomendasi pemuatan pihak ketiga sehingga kerangka kerja lain
juga bisa mendapatkan manfaat dari teknik dasar
yang sama dengan yang digunakan. Hal ini mengarahkan kami untuk
membangun Pihak Ketiga
Modal, perpustakaan
yang menggunakan JSON untuk menjelaskan teknik pemuatan pihak ketiga, yang saat ini
berfungsi sebagai dasar untuk @next/third-parties
.
Sebagai langkah selanjutnya, kami akan terus berfokus pada peningkatan komponen yang disediakan untuk Next.js serta memperluas upaya kami untuk menyertakan utilitas serupa di framework dan platform CMS populer. Saat ini kami sedang bekerja sama dengan Nuxt pengelola, dan berencana merilis utilitas pihak ketiga serupa yang disesuaikan bagi ekosistem mereka dalam waktu dekat.
Jika salah satu pihak ketiga yang Anda gunakan di aplikasi Next.js didukung oleh
@next/third-parties
,
instal paketnya
dan cobalah! Kami ingin mendengar masukan Anda tentang
GitHub.