Next.js如何將你的應用程序代碼分成不同的捆綁包,以及它們包含了什麼。
當你查看Next.js應用程序的頁面源碼時,你會看到一堆JavaScript文件正在被加載。
讓我們首先將代碼放入一個HTML格式化器中,這樣我們人類可以更好地理解它。
<!DOCTYPE html>
<html>
<head>
<meta charSet="utf-8" />
<meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1" />
<meta name="next-head-count" content="2" />
<link rel="preload" href="/_next/static/development/pages/index.js?ts=1572863116051" as="script" />
<link rel="preload" href="/_next/static/development/pages/_app.js?ts=1572863116051" as="script" />
<link rel="preload" href="/_next/static/runtime/webpack.js?ts=1572863116051" as="script" />
<link rel="preload" href="/_next/static/runtime/main.js?ts=1572863116051" as="script" />
</head>
<body>
<div id="__next">
<div>
<h1>Home page</h1></div>
</div>
<script src="/_next/static/development/dll/dll_01ec57fc9b90d43b98a8.js?ts=1572863116051"></script>
<script id="__NEXT_DATA__" type="application/json">{"dataManager":"[]","props":{"pageProps":{}},"page":"/","query":{},"buildId":"development","nextExport":true,"autoExport":true}</script>
<script async="" data-next-page="/" src="/_next/static/development/pages/index.js?ts=1572863116051"></script>
<script async="" data-next-page="/_app" src="/_next/static/development/pages/_app.js?ts=1572863116051"></script>
<script src="/_next/static/runtime/webpack.js?ts=1572863116051" async=""></script>
<script src="/_next/static/runtime/main.js?ts=1572863116051" async=""></script>
</body>
</html>
我們有4個JavaScript文件被聲明在head
中進行預加載,使用rel="preload" as="script"
:
/_next/static/development/pages/index.js
(96行代碼)/_next/static/development/pages/_app.js
(5900行代碼)/_next/static/runtime/webpack.js
(939行代碼)/_next/static/runtime/main.js
(12k行代碼)
這告訴瀏覽器在正常渲染流程開始之前盡快開始加載這些文件。沒有這些文件,腳本將會有額外的延遲加載,這將提高頁面的加載性能。
然後這4個文件與/_next/static/development/dll/dll_01ec57fc9b90d43b98a8.js
(31k行代碼)一起在body
的末尾加載,還有一個JSON片段,用於設置頁面數據的一些默認值:
<script id="__NEXT_DATA__" type="application/json">
{
"dataManager": "[]",
"props": {
"pageProps": {}
},
"page": "/",
"query": {},
"buildId": "development",
"nextExport": true,
"autoExport": true
}
</script>
加載的這4個捆綁包文件已經實現了一個名為代碼拆分的功能。index.js
文件提供了index
組件所需的代碼,它服務於/
路由,如果我們有更多的頁面,我們將為每個頁面有更多的捆綁包,只有在需要時才會加載,以提供更高效的頁面加載時間。