Next.js如何将你的应用程序代码分离成不同的包

305 阅读1分钟

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 LOC)
  • /_next/static/development/pages/_app.js (5900 LOC)
  • /_next/static/runtime/webpack.js (939 LOC)
  • /_next/static/runtime/main.js (12k LOC)

这告诉浏览器,在正常的渲染流程开始之前,尽快开始加载这些文件。如果没有这些文件,脚本的加载会有一个额外的延迟,这就提高了页面的加载性能。

然后,这4个文件会在body ,以及/_next/static/development/dll/dll_01ec57fc9b90d43b98a8.js (31k LOC),和一个为页面数据设置一些默认值的JSON片段。

<script id="__NEXT_DATA__" type="application/json">
{
  "dataManager": "[]",
  "props": {
    "pageProps":  {}
  },
  "page": "/",
  "query": {},
  "buildId": "development",
  "nextExport": true,
  "autoExport": true
}
</script>

加载的4个捆绑文件已经实现了一个叫做代码分割的功能。index.js 文件提供了index 组件所需的代码,它为/ 路径服务,如果我们有更多的页面,我们将为每个页面提供更多的捆绑文件,然后只有在需要时才会被加载 - 为页面提供一个更高性能的加载时间。