toss

es-toolkit: How a Small Internal Library Became a Global Project (opens in new tab)

es-toolkit began at Toss as a modern alternative to lodash, addressing its outdated architecture, legacy-browser code, lack of native ECMAScript Module support, and inefficient implementations. By removing unnecessary logic and relying on modern browser APIs, es-toolkit achieved 2–10× performance improvements and, in some cases, reduced bundle sizes by more than 30×. Its open-source momentum attracted global contributors, eventually helping it become widely adopted.

The Beginning of es-toolkit

  • Toss developers needed dependable utilities such as throttle, debounce, and uniq.
  • Although lodash was widely used, it had several limitations:
    • Outdated code structure and implementations.
    • Defensive logic for legacy browsers such as Internet Explorer.
    • Little use of native APIs like Array#map.
    • No ECMAScript Modules, making tree-shaking difficult.
  • lodash-es added ESM support but retained much of lodash’s older and inefficient implementation.
  • Toss’s internal @toss/utils library required significant effort to maintain and handle edge cases.
  • es-toolkit was created to provide a modern, efficient utility library for current web development.
  • Initial results showed:
    • At least 2× and sometimes over 10× faster execution.
    • Bundle-size reductions of more than 30× in some cases.

Open-Source Adoption and Community Growth

  • Toss initially announced es-toolkit through its frontend social media channels.
  • Developers contributed missing functions, bug fixes, and performance improvements.
  • After gaining attention in Korea, the project was shared on Reddit and received over 100 upvotes and tens of thousands of repository visitors.
  • International discussions led to coverage in blogs and newsletters.
  • Community members created bundler plugins and migrated dependencies in established libraries from lodash to es-toolkit.

From Contributor to Toss Developer

  • Dayong Lee discovered es-toolkit through Toss’s announcement and began contributing despite not being a Toss employee.
  • Starting with small pull requests, he gradually became the project’s second-largest contributor.
  • Code reviews helped him develop stronger skills in:
    • JavaScript language features.
    • API and interface design.
    • Open-source collaboration.
  • His involvement with es-toolkit eventually contributed to his joining Toss Bank.

Making Migration Easier with es-toolkit/compat

  • Although the library was becoming more complete, adoption remained slow because many projects depended heavily on older utility libraries.
  • Migrating individual lodash functions across a large codebase would be tedious and risky.
  • es-toolkit therefore introduced es-toolkit/compat, a drop-in replacement designed to preserve lodash’s interfaces and behavior while modernizing its internal implementation.
  • This compatibility layer reduced migration effort and allowed projects to gain performance improvements by changing imports rather than rewriting utility usage.
  • The layer was particularly important because es-toolkit’s streamlined behavior could otherwise differ from lodash in edge cases and cause runtime errors.

es-toolkit’s story demonstrates how a focused modernization effort can replace entrenched legacy dependencies. Providing both a faster native-style library and a compatibility layer made adoption more practical while enabling broad open-source participation.