热门标签 | 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.





推荐阅读
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 通过利用代码自动生成技术,旨在减轻软件开发的复杂性,缩短项目周期,减少冗余代码的编写,从而显著提升开发效率。该方法不仅能够降低开发人员的工作强度,还能确保代码的一致性和质量。 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • Unity与MySQL连接过程中出现的新挑战及解决方案探析 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 在 Axublog 1.1.0 版本的 `c_login.php` 文件中发现了一个严重的 SQL 注入漏洞。该漏洞允许攻击者通过操纵登录请求中的参数,注入恶意 SQL 代码,从而可能获取敏感信息或对数据库进行未授权操作。建议用户尽快更新到最新版本并采取相应的安全措施以防止潜在的风险。 ... [详细]
  • Nginx 反向代理配置与应用指南
    本文详细介绍了 Nginx 反向代理的配置与应用方法。首先,用户可以从官方下载页面(http://nginx.org/en/download.html)获取最新稳定版 Nginx,推荐使用 1.14.2 版本。下载并解压后,通过双击 `nginx.exe` 文件启动 Nginx 服务。文章进一步探讨了反向代理的基本原理及其在实际应用场景中的配置技巧,包括负载均衡、缓存管理和安全设置等,为用户提供了一套全面的实践指南。 ... [详细]
  • 在iOS开发中,基于HTTPS协议的安全网络请求实现至关重要。HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer)是一种旨在提供安全通信的HTTP扩展,通过SSL/TLS加密技术确保数据传输的安全性和隐私性。本文将详细介绍如何在iOS应用中实现安全的HTTPS网络请求,包括证书验证、SSL握手过程以及常见安全问题的解决方法。 ... [详细]
  • CSS3 @font-face 字体应用技术解析与实践
    在Web前端开发中,HTML教程和CSS3的结合使得网页设计更加多样化。长期以来,Web设计师受限于“web-safe”字体的选择。然而,CSS3中的`@font-face`规则允许从服务器端加载自定义字体,极大地丰富了网页的视觉效果。通过这一技术,设计师可以自由选择和使用各种字体,提升用户体验和页面美观度。本文将深入解析`@font-face`的实现原理,并提供实际应用案例,帮助开发者更好地掌握这一强大工具。 ... [详细]
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社区 版权所有