ReactiveX / rxjs

A reactive programming library for JavaScript
https://rxjs.dev
Apache License 2.0
30.72k stars 3k forks source link

esbuild is unable to tree-shake rxjs under node platform #6856

Open benlesh opened 2 years ago

benlesh commented 2 years ago

Discussed in https://github.com/ReactiveX/rxjs/discussions/6785

Originally posted by **Conaclos** January 28, 2022 Hi! I discovered that **esbuild** is not able to tree-shake **rxjs** package when bundling under node platform. [**esbuild** priorizes exports condition 'node' over main-fields](https://esbuild.github.io/api/#how-conditions-work). # Demonstration ```sh $ cat index.js export { Subject } from 'rxjs' $ esbuild --bundle index.js --platform=node | wc -l 9654 $ # Specifying main-fields does not change the output $ esbuild --bundle index.js --platform=node --main-fields=es2015,module,main | wc -l 9654 $ # browser bundle is lighter $ esbuild --bundle index.js --platform=browser | wc -l 1161 ``` Note that we need to bundle for node since our project and most of our dependencies imports node-specific modules. # How to solve the issue? **rxjs** should not use the condition "node". It should use the condition "require": ```json ... "exports": { ".": { "require": "./dist/cjs/index.js", "es2015": ..., "default": ... }, .... ``` instead of: ```json ... "exports": { ".": { "node": "./dist/cjs/index.js", "es2015": ..., "default": ... }, .... ```
akanass commented 2 years ago

I guess it's related to my one year issue

benlesh commented 2 years ago

@akanass Yes. I know that's a "one year issue". Unfortunately, RxJS is so widely used that if we pushed out breaking changes and published new majors too often it would cause a lot of churn for everyone. That will be fixed in 8.x

akanass commented 2 years ago

@benlesh yes I know that :) but when I saw your issue I have remembered my issue that's why I mentioned it to be sure to cover all points