首页 web前端 js教程 es-toolkit,Lodash 的替代品

es-toolkit,Lodash 的替代品

Nov 15, 2024 am 04:55 AM

作者:Rishi Purwar✏️

如果您构建 JavaScript 应用程序已经有一段时间了,您可能使用过 Lodash 等实用程序库。这些库包含有用的函数,使 JavaScript 编码变得更容易、更高效。但随着您的项目的增长并且您开始使用更多的实用函数,您可能会注意到您的包大小也开始增加。

当您依赖像 Lodash 这样的重型库时尤其如此,这让您想知道是否有更好的替代方案。

这就是 es-toolkit 的用武之地 - 一个现代的、高性能的 JavaScript 实用程序库,它是轻量级的,并且具有可靠的 TypeScript 支持,使其成为 Lodash 等流行库的绝佳替代品。

以下是 es-toolkit 和 Lodash 之间的主要比较:

  • es-toolkit 提供与 Lodash 类似的关键实用函数,涵盖函数、数组、对象、字符串、数学、谓词和 Promise 等领域
  • es-toolkit 的函数通常比 Lodash 的函数更快,因为它们在实现中使用现代 JavaScript API 并使用 TypeScript 进行类型检查,从而减少了对额外防御代码的需求。
  • 性能基准测试表明,es-toolkit 函数的性能优于 Lodash 等效项,有时甚至明显领先
  • 与 Lodash 的同类函数相比,es-toolkit 的函数包大小明显更小,从而实现更快的加载时间和更好的性能
  • es-toolkit 通过利用现代 JavaScript 功能并避免 Lodash 中的相互依赖性来解决性能和包大小挑战
  • es-toolkit 函数大多是独立的,可以防止无意中包含不必要的代码,这与 Lodash 不同,实用函数通常是相互依赖的

让我们深入了解这些差异的本质,看看如何在 JavaScript 项目中使用 es-toolkit。

es-toolkit的主要特点

以下是 es-toolkit 带来的快速浏览:

  • 功能包括用于缓存函数结果的 memoize 和用于限制函数调用频率的 debounce
  • 像uniq这样的数组可以过滤掉重复项和差异来找出数组之间的不同之处
  • 用于处理JavaScript对象的工具,例如用于深度克隆的cloneDeep和用于将嵌套对象转换为平面结构的flattenObject
  • 字符串操作工具,包括 kebabCase 将字符串转换为 kebab-case
  • 数学助手,例如 random 来生成随机数,round 来四舍五入
  • 类型保护函数(如 isNil)可轻松检查 null 或未定义值
  • 用于处理异步代码的实用程序,例如延迟暂停执行一段时间

性能和捆绑包大小比较

为了真正了解 es-toolkit 的优势,让我们将其性能和捆绑包大小与 Lodash 进行比较。

表现

es-toolkit 的函数通常比 Lodash 的函数更快,因为它们在实现中使用现代 JavaScript API。例如,es-toolkit的omit函数比lodash的omit函数快约11.8倍。

下表比较了 es-toolkit 和 lodash-es 对于各种功能的性能:

Function es-toolkit@0.0.1 lodash-es@4.17.21 Difference
omit 4,767,360 times 403,624 times 11.8×
pick 9,121,839 times 2,663,072 times 3.43×
differenceWith 9,291,897 times 4,275,222 times 2.17×
difference 10,436,101 times 5,155,631 times 2.02×
intersectionWith 8,074,722 times 3,814,479 times 2.12×
intersection 9,999,571 times 4,630,316 times 2.15×
unionBy 6,435,983 times 3,794,899 times 1.69×
union 5,059,209 times 4,771,400 times 1.06×
dropRightWhile 7,529,559 times 5,606,439 times 1.34×
groupBy 5,000,235 times 5,206,286 times 0.96×

捆绑尺寸

当谈到捆绑包大小时,es-toolkit 确实很出色。较小的捆绑包大小意味着您的 Web 应用程序加载速度更快且性能更好,尤其是在较慢的网络上。

以下是 es-toolkit 和 lodash-es 中一些常见函数的包大小比较:

Function es-toolkit@0.0.1 lodash-es@4.17.21 Difference
sample 88 bytes 2,000 bytes -95.6 percent
difference 91 bytes 3,190 bytes -97.2 percent
sum 152 bytes 413 bytes -63.2 percent
debounce 144 bytes 1,400 bytes -89.7 percent
throttle 110 bytes 1,460 bytes -92.5 percent
pick 657 bytes 3,860 bytes -83.0 percent
zip 797 bytes 1,790 bytes -55.5 percent

es-toolkit 的功能比 Lodash 的功能要小得多。例如,es-toolkit 中的示例函数只有 88 字节,而 Lodash 中的相同函数有 2,000 字节——小了近 96%!

在 JavaScript 应用程序中使用 es-toolkit

让我们看一些示例,看看在 JavaScript 应用程序中使用 es-toolkit 是多么容易。在本节中,我们将探讨 es-toolkit 如何处理常见任务,例如去抖动、限制、从对象中选取特定属性以及从数组中删除重复项。

你猜怎么着?为了让事情变得更加简单,我在 GitHub 上整理了一个入门代码存储库,您可以立即克隆并开始试验。您将找到我们将介绍的所有示例的 HTML 和 CSS 代码,以及入门所需的一切。查看此处的存储库并继续操作。

去抖动示例

假设您正在为一个网站构建一个搜索功能,用户可以在其中查找有关不同主题的信息。

您希望在用户键入时获取数据,但不想为每次击键发送请求;否则,您可能会因过多的调用而淹没 API。这就是 es-toolkit 的去抖动功能派上用场的地方。

工作原理如下:

import { debounce } from "es-toolkit";

// a function that simulates an API call
function fetchData(query) {
  console.log(`Fetching data for: ${query}`);
}

// Using es-toolkit debounce function
const debouncedFetchData = debounce(fetchData, 1000);

document.getElementById("search-input").addEventListener("input", (event) => {
    const query = event.target.value;
    debouncedSearch(query);
});
登录后复制
登录后复制

在下面的演示中,尽管我输入了五个字母,但 fetchData 函数只有在我停止输入一秒钟后才会被调用。

这样,我们就可以避免使用 debounce 函数在每次按键时发出不必要的 API 请求。
es-toolkit, a Lodash alternative  

油门示例

假设您的网页上有一个按钮,单击该按钮会加载更多帖子。为了防止点击按钮太快而导致多次 API 调用,您可以使用 es-toolkit 中的throttle 功能。它确保 API 调用仅在设定的时间间隔内发生,即使按钮被单击多次也是如此。

使用方法如下:

// Throttle Example
import { throttle } from "es-toolkit";

// Function to fetch posts from an API
async function fetchPosts() {
  console.log("Fetching new posts...");
  const response = await fetch("https://jsonplaceholder.typicode.com/posts");
  const posts = await response.json();
  console.log("Posts fetched:", posts);
}
// Create a throttled version of fetchPosts
const throttledFetchPosts = throttle(fetchPosts, 2000);

// Set up an event listener on the button
document.getElementById("fetch-more-posts").addEventListener("click", () => {
  console.log("button clicked");
  throttledFetchPosts();
});
登录后复制
登录后复制

在这个例子中,即使用户快速点击“Fetch More Posts”按钮,fetchPosts 函数也只会每两秒触发一次,如下面的演示所示。
es-toolkit, a Lodash alternative  

选取示例

假设您有详细的用户个人资料数据,但您只想在用户摘要组件中显示特定属性,例如用户名、电子邮件和年龄。选择功能可以帮助您轻松提取这些属性。

以下是其工作原理的演示:

// Pick Example
import { pick } from "es-toolkit";

// dummy user data
const user = {
  id: 1,
  username: "johndoe",
  firstName: "John",
  lastName: "Doe",
  email: "john.doe@example.com",
  age: 30,
  address: {
    street: "123 Main St",
    city: "Anytown",
    country: "USA",
  },
  phoneNumber: "1234-5678",
};

// Use pick to select specific properties
const pickedUser = pick(user, ["username", "email", "age"]);

console.log("pickedUser", pickedUser)
登录后复制
登录后复制

在此示例中,pick 函数从用户对象中提取用户名、电子邮件和年龄属性。控制台日志将输出:

import { debounce } from "es-toolkit";

// a function that simulates an API call
function fetchData(query) {
  console.log(`Fetching data for: ${query}`);
}

// Using es-toolkit debounce function
const debouncedFetchData = debounce(fetchData, 1000);

document.getElementById("search-input").addEventListener("input", (event) => {
    const query = event.target.value;
    debouncedSearch(query);
});
登录后复制
登录后复制

独特的例子

想象一下您正在运行一个博客,用户可以在其中添加标签来对他们的帖子进行分类。您要确保每个标签仅出现一次。这就是 es-toolkit 中的 uniq 函数超级有用的地方。它可以帮助您从数组中过滤掉重复项并获取唯一标签的列表。

这是一个实际示例:

// Throttle Example
import { throttle } from "es-toolkit";

// Function to fetch posts from an API
async function fetchPosts() {
  console.log("Fetching new posts...");
  const response = await fetch("https://jsonplaceholder.typicode.com/posts");
  const posts = await response.json();
  console.log("Posts fetched:", posts);
}
// Create a throttled version of fetchPosts
const throttledFetchPosts = throttle(fetchPosts, 2000);

// Set up an event listener on the button
document.getElementById("fetch-more-posts").addEventListener("click", () => {
  console.log("button clicked");
  throttledFetchPosts();
});
登录后复制
登录后复制

在上面的示例中,uniq 函数从标签数组中删除重复项。控制台日志将输出:

// Pick Example
import { pick } from "es-toolkit";

// dummy user data
const user = {
  id: 1,
  username: "johndoe",
  firstName: "John",
  lastName: "Doe",
  email: "john.doe@example.com",
  age: 30,
  address: {
    street: "123 Main St",
    city: "Anytown",
    country: "USA",
  },
  phoneNumber: "1234-5678",
};

// Use pick to select specific properties
const pickedUser = pick(user, ["username", "email", "age"]);

console.log("pickedUser", pickedUser)
登录后复制
登录后复制

es-toolkit 如何解决性能和捆绑包大小挑战

您可能对 es-toolkit 如何应对这些挑战感到好奇。在底层,es-toolkit 利用现代 JavaScript API 来提供更快的性能和更小的包大小。

最重要的是,es-toolkit 使用 TypeScript,这有助于删除许多通常在运行时检查参数类型的额外防御代码。这不仅使代码运行更有效,而且还最大限度地减少了任何可能减慢速度的不必要的开销。

另一个关键区别是 Lodash 实用函数通常是相互依赖的,这意味着导入一个函数可能会同时引入许多其他函数。相比之下,es-toolkit 功能大多是独立的,这有助于保持包的轻量级。

要真正看到差异,您可以使用 webpack-bundle-analyzer 来可视化包的大小。我已经为您设置好了一切,因此您需要做的就是签出主分支并从克隆存储库的根运行 npm i && npm run build ,它将打开一个页面,其中包含有关您的包的所有详细信息。

下图显示了使用 es-toolkit 时的包大小。您可以看到大多数 es-toolkit 功能都是独立的,这导致包大小更小。

es-toolkit, a Lodash alternative  

现在,让我们将上面示例中的 import 语句中的 es-toolkit 替换为 lodash-es,并再次运行 npm run build 以检查 lodash-es 包的大小。

下图显示 Lodash 函数大多是相互依赖的,仅导入一个函数时就会引入许多其他实用程序:

es-toolkit, a Lodash alternative  

结论

es-toolkit 可以成为 Lodash 等实用程序库的绝佳替代品,尤其是当性能和包大小是关键考虑因素时。它的小包大小、现代 JavaScript 功能的使用以及可靠的 TypeScript 支持使其成为开发人员的绝佳选择。

我希望您发现 es-toolkit 的探索对您的 JavaScript 项目有所帮助,但不要就此停止!我鼓励您在自己的应用程序中尝试 es-toolkit,并在下面的评论中与我们分享您的经验。快乐编码!


您是否添加新的 JS 库来提高性能或构建新功能?如果他们反其道而行怎么办?

毫无疑问,前端变得越来越复杂。当您向应用程序添加新的 JavaScript 库和其他依赖项时,您需要更多的可见性以确保您的用户不会遇到未知问题。

LogRocket 是一个前端应用程序监控解决方案,可让您重放 JavaScript 错误,就像它们发生在您自己的浏览器中一样,以便您可以更有效地对错误做出反应。

es-toolkit, a Lodash alternative

LogRocket 可以与任何应用程序完美配合,无论框架如何,并且具有用于记录来自 Redux、Vuex 和 @ngrx/store 的其他上下文的插件。您无需猜测问题发生的原因,而是可以汇总并报告问题发生时应用程序所处的状态。 LogRocket 还监控您的应用程序的性能,报告客户端 CPU 负载、客户端内存使用情况等指标。

自信地构建 — 开始免费监控。

以上是es-toolkit,Lodash 的替代品的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1657
14
CakePHP 教程
1415
52
Laravel 教程
1309
25
PHP教程
1257
29
C# 教程
1229
24
神秘的JavaScript:它的作用以及为什么重要 神秘的JavaScript:它的作用以及为什么重要 Apr 09, 2025 am 12:07 AM

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

JavaScript的演变:当前的趋势和未来前景 JavaScript的演变:当前的趋势和未来前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

JavaScript引擎:比较实施 JavaScript引擎:比较实施 Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

JavaScript:探索网络语言的多功能性 JavaScript:探索网络语言的多功能性 Apr 11, 2025 am 12:01 AM

JavaScript是现代Web开发的核心语言,因其多样性和灵活性而广泛应用。1)前端开发:通过DOM操作和现代框架(如React、Vue.js、Angular)构建动态网页和单页面应用。2)服务器端开发:Node.js利用非阻塞I/O模型处理高并发和实时应用。3)移动和桌面应用开发:通过ReactNative和Electron实现跨平台开发,提高开发效率。

Python vs. JavaScript:学习曲线和易用性 Python vs. JavaScript:学习曲线和易用性 Apr 16, 2025 am 12:12 AM

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

如何使用Next.js(前端集成)构建多租户SaaS应用程序 如何使用Next.js(前端集成)构建多租户SaaS应用程序 Apr 11, 2025 am 08:22 AM

本文展示了与许可证确保的后端的前端集成,并使用Next.js构建功能性Edtech SaaS应用程序。 前端获取用户权限以控制UI的可见性并确保API要求遵守角色库

从C/C到JavaScript:所有工作方式 从C/C到JavaScript:所有工作方式 Apr 14, 2025 am 12:05 AM

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

如何安装JavaScript? 如何安装JavaScript? Apr 05, 2025 am 12:16 AM

JavaScript不需要安装,因为它已内置于现代浏览器中。你只需文本编辑器和浏览器即可开始使用。1)在浏览器环境中,通过标签嵌入HTML文件中运行。2)在Node.js环境中,下载并安装Node.js后,通过命令行运行JavaScript文件。

See all articles