bitcoinjs / bitcoinjs-lib

A javascript Bitcoin library for node.js and browsers.
MIT License
5.65k stars 2.09k forks source link

ES modules #1380

Open lastmjs opened 5 years ago

lastmjs commented 5 years ago

It would be great if the library could support ES modules. It would be nice to use an ES module build directly in the browser without a bundler, or use the TypeScript code directly. The use of requires in the source code precludes this

junderw commented 5 years ago

Pull requests are welcome.

If you can get rid of the requires and support ES modules I wouldn't see why that wouldn't be a good thing.

Currently it's not really on any of our radars. Could you maybe explain what the use case is a little bit more?

Thanks.

junderw commented 5 years ago

Asking a friend, he recommended we wait for NodeJS to support ES modules.

Since a lot of our dependencies are NodeJS and don't have typescript support, it is difficult at this time.

lastmjs commented 5 years ago

Sounds reasonable, thanks!

On Tue, Apr 9, 2019, 3:24 AM Jonathan Underwood notifications@github.com wrote:

Asking a friend, he recommended we wait for NodeJS to support ES modules.

Since a lot of our dependencies are NodeJS and don't have typescript support, it is difficult at this time.

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/bitcoinjs/bitcoinjs-lib/issues/1380#issuecomment-481174005, or mute the thread https://github.com/notifications/unsubscribe-auth/AGrSjyxpQM_hggHXXfjddIjZzOZE-zQGks5vfFxBgaJpZM4cjmCG .

zone117x commented 5 years ago

package.json has a de facto standard module field that when specified is used by most common web bundler tools (like webpack, rollup, browserify w/ a plugin, etc).

This allows the npm package to add a new directory next to src that contains the ES module js files, and a corresponding entry in package.json (for example: "module": "./module/index.js").

The existing src output and "main": "./src/index.js" entry can be left as is, and regular Node projects will be unaffected.

junderw commented 5 months ago

This should be revisited since ES Modules have had time to cook and get more adoption. It seems like we'd need to migrate a lot of things (like Buffer) to get full browser support though. Supporting Web Crypto (which iirc is now supported in NodeJS) would also change a lot of the APIs to use async.

Thoughts on whether a full ESM library would be better than some sort of hybrid thing? I publish hybrid packages for tiny-secp256k1 and uint8array-tools... but a lot of bundlers still have trouble with them apparently.