rxjs icon indicating copy to clipboard operation
rxjs copied to clipboard

esbuild is unable to tree-shake rxjs under node platform

Open benlesh opened this issue 2 years ago • 3 comments

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.

Demonstration

$ 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":

  ...
  "exports": {
    ".": {
      "require": "./dist/cjs/index.js",
      "es2015": ...,
      "default": ...
    },
    ....

instead of:

  ...
  "exports": {
    ".": {
      "node": "./dist/cjs/index.js",
      "es2015": ...,
      "default": ...
    },
    ....
```</div>

benlesh avatar Mar 03 '22 22:03 benlesh

I guess it's related to my one year issue

akanass avatar Mar 07 '22 14:03 akanass

@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

benlesh avatar Mar 07 '22 15:03 benlesh

@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

akanass avatar Mar 07 '22 15:03 akanass