Home Web Front-end JS Tutorial Cleaning & speeding up the JS ecosystem - Journey so far

Cleaning & speeding up the JS ecosystem - Journey so far

Sep 04, 2024 am 09:33 AM

Cleaning & speeding up the JS ecosystem - Journey so far

For some time now, I have been hard at work at increasing performance across the ecosystem. Usually through cleaning up aged dependency trees, reducing install footprints, and improving CPU/memory performance of commonly used dependencies.

This blog post is just my brief attempt at explaining some of the journey that lead to e18e and the ecosystem cleanup.

Thoughts on micro-utilities

Micro-utilities are a major contributor to the install size and, more, the dependency tree complexity of many projects.

Packages such as is-number and is-nan fit into this category.

Importantly, many of these packages do have a use in some situations but certainly not in the common use case.

Usually they can be replaced in these situations:

  • They were written in a time when equivalent native functionality didn't exist, but now does
  • They do more than what the consumer needs

Example: is-number

For example, is-number determines if a value is a number or a number-like string which is not NaN or +/-Infinity.

In some projects, this is a repeated piece of validation which may be better extracted into its own module or package.

However, in the common case, many consumers never needed the NaN and Infinity validation, or even to support number-like strings.

This opens up some possible improvements in various projects. We can replace the use of this package in those projects with much simpler inline logic (e.g. in many real-world projects, we safely switched to typeof n === 'number' since those projects later assumed and relied on the value being an actual number anyway).

Another example: is-regexp

You can test that something is a regular expression using instanceof: v instanceof RegExp.

However, in some situations (e.g. using virtual contexts), this won't work since RegExp isn't the same class which v originated from. In those cases, we need to use something like this:

Object.prototype.toString.call(obj) === '[object RegExp]'
Copy after login

If you don't want to inline such code, and need to support virtual contexts or similar, maybe a library makes sense.

However, in many cases, the projects did not support virtual contexts anyway (and did not want to). That opens us up to opportunities to simplify again to a simple instanceof.

Supporting older runtimes

Another potential area of improvement is that of older runtime support.

Quite a lot of very popular packages have very deep dependency trees of various polyfill-like modules. These generally exist for one or both of the following reasons:

  • To protect against global namespace tampering
  • To maintain support in runtimes which lack this functionality

Many of us do not need this level of backwards compatibility and could get large performance gains if we could trim it away.

It is important to note, of course, there are still people who do need to work in those constraints. This is why in this area, we often have been providing forks or alternatives rather than trying to change the existing packages (which wouldn't be open to such changes anyway).

Starting to improve things

I started to think about these particular areas back in 2018 or so, after seeing how large and deeply nested my node_modules were for even the smallest projects.

My first few attempts at change were to create some kind of ESLint plugin which can detect these packages and suggest they be removed. Every several months, I would have this same idea and try again but never really got where I wanted to be.

Through this time, I was at least contributing to various large projects to clean up and improve what I could (e.g. one i've contributed to for a long time is storybook).

Ecosystem cleanup

I then created the ecosystem cleanup, a repository for raising possible performance improvements across the ecosystem (basically an issue tracker). Again, this was basically me and my own personal issue tracker for some time, but at least it was visible in the open.

Soon after, I started to see people turning up in the issues and contributing to upstream projects. I was so happy to see this as I'd spent many years chipping away at this by myself, and wondering if I'm even making a difference. To see others joining in helped so much in knowing someone else cares.

Module replacements

While the cleanup project was and still is incredibly useful, we didn't really have anywhere to share with the rest of the community what good alternatives exist.

To solve this, I created the module replacements project.

This project basically holds some JSON lists of modules which can possibly be replaced and their suggested alternatives. These are currently split into three levels of "strictness" or "opinionatedness": native (modules which can be replaced with native functionality), micro-utilities (modules which may be replaceable by simple inline code), and preferred (modules which we think should be replaced with more performant alternatives).

Codemods

The next step of the replacements project was to create a set of codemods so we can automate the replacement of some of these modules.

Driven by @passle, this project quickly received a huge amount of contributions in the form of various codemods.

The codemod team have also done some good work porting these to the codemod platform. In future, we also want to provide them through some kind of CLI or auto fix rules.

e18e

The turning point where I feel all of us who care about this stuff found each other was e18e.

Bjorn was doing some great work improving the performance of astro, and Marvin had been similarly writing about speeding up the ecosystem. Eventually, our paths crossed and we had some great discussions on the side.

A small group of us worked together to see if we're all on the same page and if there's a community to be built out of this. Then came e18e!

Built to be a community space for people to collaborate on improving ecosystem performance, this has shown us how many people care about these things. So many have joined and have contributed massive amounts already. We're seeing speed ups and size reductions almost every day across the ecosystem.

Some thanks

The community is growing quickly and has too many people to thank for the contributions. However, I'd like to thank these people in particular for helping make this community possible:

  • @patak
  • @antfu7
  • @bluwyoo
  • @passle_

Similarly, the people who were already working on projects contributing to the same goals in parallel:

  • @asleMammadam through tinylibs
  • pi0 through unjs

The above is the detailed content of Cleaning & speeding up the JS ecosystem - Journey so far. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

Java Tutorial
1664
14
PHP Tutorial
1267
29
C# Tutorial
1239
24
Demystifying JavaScript: What It Does and Why It Matters Demystifying JavaScript: What It Does and Why It Matters Apr 09, 2025 am 12:07 AM

JavaScript is the cornerstone of modern web development, and its main functions include event-driven programming, dynamic content generation and asynchronous programming. 1) Event-driven programming allows web pages to change dynamically according to user operations. 2) Dynamic content generation allows page content to be adjusted according to conditions. 3) Asynchronous programming ensures that the user interface is not blocked. JavaScript is widely used in web interaction, single-page application and server-side development, greatly improving the flexibility of user experience and cross-platform development.

The Evolution of JavaScript: Current Trends and Future Prospects The Evolution of JavaScript: Current Trends and Future Prospects Apr 10, 2025 am 09:33 AM

The latest trends in JavaScript include the rise of TypeScript, the popularity of modern frameworks and libraries, and the application of WebAssembly. Future prospects cover more powerful type systems, the development of server-side JavaScript, the expansion of artificial intelligence and machine learning, and the potential of IoT and edge computing.

JavaScript Engines: Comparing Implementations JavaScript Engines: Comparing Implementations Apr 13, 2025 am 12:05 AM

Different JavaScript engines have different effects when parsing and executing JavaScript code, because the implementation principles and optimization strategies of each engine differ. 1. Lexical analysis: convert source code into lexical unit. 2. Grammar analysis: Generate an abstract syntax tree. 3. Optimization and compilation: Generate machine code through the JIT compiler. 4. Execute: Run the machine code. V8 engine optimizes through instant compilation and hidden class, SpiderMonkey uses a type inference system, resulting in different performance performance on the same code.

Python vs. JavaScript: The Learning Curve and Ease of Use Python vs. JavaScript: The Learning Curve and Ease of Use Apr 16, 2025 am 12:12 AM

Python is more suitable for beginners, with a smooth learning curve and concise syntax; JavaScript is suitable for front-end development, with a steep learning curve and flexible syntax. 1. Python syntax is intuitive and suitable for data science and back-end development. 2. JavaScript is flexible and widely used in front-end and server-side programming.

JavaScript: Exploring the Versatility of a Web Language JavaScript: Exploring the Versatility of a Web Language Apr 11, 2025 am 12:01 AM

JavaScript is the core language of modern web development and is widely used for its diversity and flexibility. 1) Front-end development: build dynamic web pages and single-page applications through DOM operations and modern frameworks (such as React, Vue.js, Angular). 2) Server-side development: Node.js uses a non-blocking I/O model to handle high concurrency and real-time applications. 3) Mobile and desktop application development: cross-platform development is realized through ReactNative and Electron to improve development efficiency.

How to Build a Multi-Tenant SaaS Application with Next.js (Frontend Integration) How to Build a Multi-Tenant SaaS Application with Next.js (Frontend Integration) Apr 11, 2025 am 08:22 AM

This article demonstrates frontend integration with a backend secured by Permit, building a functional EdTech SaaS application using Next.js. The frontend fetches user permissions to control UI visibility and ensures API requests adhere to role-base

Building a Multi-Tenant SaaS Application with Next.js (Backend Integration) Building a Multi-Tenant SaaS Application with Next.js (Backend Integration) Apr 11, 2025 am 08:23 AM

I built a functional multi-tenant SaaS application (an EdTech app) with your everyday tech tool and you can do the same. First, what’s a multi-tenant SaaS application? Multi-tenant SaaS applications let you serve multiple customers from a sing

From C/C   to JavaScript: How It All Works From C/C to JavaScript: How It All Works Apr 14, 2025 am 12:05 AM

The shift from C/C to JavaScript requires adapting to dynamic typing, garbage collection and asynchronous programming. 1) C/C is a statically typed language that requires manual memory management, while JavaScript is dynamically typed and garbage collection is automatically processed. 2) C/C needs to be compiled into machine code, while JavaScript is an interpreted language. 3) JavaScript introduces concepts such as closures, prototype chains and Promise, which enhances flexibility and asynchronous programming capabilities.

See all articles