热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Next.js包大小因动态组件查找而爆炸,如何解决?

域名:检查repo-common.js包含所有依赖项,即使在相应页面上只使用了一个。http://localhost:3000/co

域名:

检查repo - common.js 包含所有依赖项,即使在相应页面上只使用了一个。


  • http://localhost:3000/components/ComponentOne

  • http://localhost:3000/components/ComponentTwo

现场演示:点击这里

更多细节:

我有一个应用程序(找到一个非常简化的版本),其中根据用户输入呈现不同的组件。通过组件映射找到要渲染的组件。common.js 包含切换器页面的所有依赖项是有道理的,其中两个组件都必须可访问(以及它们的依赖项)。但是单个页面包含各自的其他依赖项是没有意义的。

总结一下:


  • 我希望能够拥有大量组件,这些组件可以根据用户的输入进行呈现。我的用例对它们进行序列化和反序列化(如此处所示)是不可行的,因为组件非常不同并且需要不同的依赖项

  • 我还想将每个组件呈现到它自己的静态生成页面,在那里我从数据库中检索其他 SEO 信息。但是,在这种情况下,我只想为手头的特定组件加载所需的依赖项。


http://localhost:3000


Selecting ComponentOne results in:

使用 recharts.js

Selecting ComponentTwo results in:

使用victory.js

回答


问题

TLDR:Next 的 Webpack 配置将动态加载的组件分块作为自己的块,这可能会创建重复或组合的块依赖项。

在您的示例中,我将组件 1 和 2 分别复制为组件 3 和 4。但是,对于组件 4(它是组件 2 的副本),我添加了一个额外的moment-timezone依赖项。结果是一个具有重复victory-pie依赖项的分离块(它还为包和包导入了整个库):

victorymoment-timezone

解释

即使两个 3rd 方图表包之间存在相当多的依赖共享(主要是两者共享d3依赖),如果组件正在重用恰好具有共享依赖并跨多个路由动态加载的 3rd 方库,Webpack 可能会尝试将这些 3rd 方块组合成一个组合块:

而不是预期的两个或更多块:

但是,正如您在上面的块截图中注意到的那样,即使第 3 方包没有在多个路由中重用/重新导入,您仍然有重复的依赖项(例如,大桃子和柠檬绿色块在上面的屏幕截图包含重复的d3-scaled3-timed3-path等依赖块)。

不幸的是,这是通过next/dynamic(也适用于使用 Webpack 的动态import语句)导入的组件的必要和预期行为,因为它必须遍历整个每个动态导入的组件的依赖关系图,并(可能)将它们添加为自己的块——换句话说,在动态加载组件的情况下,Webpack 不知道运行时正在加载什么组件,因此它必须创建一个整个块以便能够根据请求加载(即使其他组件可能共享相同的依赖项,它也不会知道)。不仅如此,因为它不知道动态组件中正在导入/使用什么,所以它不能摇树依赖!因此,当您添加更多动态加载的组件时,这会创建非常大且重复的块。

解决方案

不幸的是,真的没有办法解决。即使我尝试手动将这些依赖项分离和分组为它们自己单独的块(以减少冗余/构建大小),组件也将不再呈现。这是有道理的,当每个组件都以某种方式在主应用程序中成为自己独立的“应用程序”时。

在这种情况下,最简单的解决方案是渲染静态图像而不是动态加载的 React 组件(如视频的缩略图)。

其他想法

我查看了 Next 的 Webpack 配置,并取得了一些进展。您可以创建自己的 webpack splitChunks规则供 Next 使用,这将有助于减少一些块冗余;但是,即便如此,我仍然收到重复的块(主要来自d3共享依赖项)。你可以试试看。绝对不适合胆小的人,因为您将在一个黑洞中追逐一只兔子,并且您将无法实现块分布的完美。也就是说,它确实有助于减少构建尺寸......

以下是一些可用作next.config.js文件基础的初步工作:

下一个.config.js

module.exports = {
webpack(config, { isServer }) {
/* adds client-side webpack optimization rules for splitting chunks during build-time */
if (!isServer) {
config.optimization.splitChunks.cacheGroups = {
...config.optimization.splitChunks.cacheGroups,
victory: {
test: /[/]node_modules[/](victory-pie|victory-core|victory-pie/es)[/]/,
name: "victory",
priority: 50,
reuseExistingChunk: true,
},
recharts: {
test: /[/]node_modules[/](recharts|recharts-scale)[/]/,
priority: 20,
name: "recharts",
reuseExistingChunk: true,
},
lodash: {
test: /[/]node_modules[/](lodash)[/]/,
name: "lodash",
reuseExistingChunk: true,
priority: 40,
},
};
}
/* return new config to next */
return config;
},
};



  • When building the app for production, Webpack attempts to group/split dependencies into shareable chunks. That way you have a smaller and more optimized build size. Instead, Webpack can’t automatically determine how to chunk these dependencies, so by using Next’s Webpack configuration in combination with custom rules, we can help Webpack optimize the production build. Take a look at the [Webpack documentation](https://webpack.js.org/concepts/) for more information.





推荐阅读
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文介绍了将mysql从5.6.15升级到5.7.15的详细步骤,包括关闭访问、备份旧库、备份权限、配置文件备份、关闭旧数据库、安装二进制、替换配置文件以及启动新数据库等操作。 ... [详细]
  • springboot项目引入jquery浏览器报404错误的解决办法
    本文介绍了在springboot项目中引入jquery时,可能会出现浏览器报404错误的问题,并提供了解决办法。问题可能是由于将jquery.js文件复制粘贴到错误的目录导致的,解决办法是将文件复制粘贴到正确的目录下。如果问题仍然存在,可能是其他原因导致的。 ... [详细]
  • 延迟注入工具(python)的SQL脚本
    本文介绍了一个延迟注入工具(python)的SQL脚本,包括使用urllib2、time、socket、threading、requests等模块实现延迟注入的方法。该工具可以通过构造特定的URL来进行注入测试,并通过延迟时间来判断注入是否成功。 ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文介绍了在MacOS系统上安装MySQL的步骤,并详细说明了如何设置MySQL服务的开机启动和如何修改MySQL的密码。通过下载MySQL的macos版本并按照提示一步一步安装,在系统偏好设置中可以找到MySQL的图标进行设置。同时,还介绍了通过终端命令来修改MySQL的密码的具体操作步骤。 ... [详细]
author-avatar
键盘上的泪g_752
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有