crowdin-api-client-js
crowdin-api-client-js copied to clipboard
Proposal: switch from axios to undici
Node.js has recently implemented the fetch API into it as an experimental flag (ref: https://github.com/nodejs/node/pull/41749) which makes use of node's undici package and sets fetch and other features from it as global variables. As this is expected to come out officially in node 18 later this year, I recommend that we switch from axios to undici for all fetch requests. If the maintainers agree with this change I would be willing to open the PR that introduces that.
I am not fully sure how safe it would be to switch to fetch in Node. It seems like it's still experimental feature. At least I do see in PR that in order to have fetch globally you need to add --experimental-fetch. And also we already have an option to use fetch. https://github.com/crowdin/crowdin-api-client-js#list-of-projects-with-fetch-api . So maybe let's just keep eye on it and eventually we can fully remove axios and only use fetch.
@yevheniyJ just to clarify, my proposal was to first switch to undici, and then remove the dep altogether and use node's implementation when that comes to stable node. I have noticed, however, that even the undici package uses experimental modules within node that, despite not needing a flag to be activated, they still have a warning saying they can change at any time, so I agree that it's best to keep this here and revisit once node 18 comes around.
Also, since you mentioned the ability to use fetch in the client, I'm pretty sure that's for DOM users only, right? Seeing as there is no other dependency that would only make sense
@ImRodry fetch was introduced to work in plugin-based environment where axios was not suitable. But actually the API signature of fetch in Node is equivalent to the fetch that is currently implemented in the client. So it means that you already can use fetch in Node if fetch is globally declared. And we just need to remove later on axios and leave only fetch.
At the moment, without any experimental flags, fetch is only available in a browser environment, not in Node, so I'd assume that's only usable there, right?
Yes or if you really want to use fetch in Node you then need to turn on that feature on you end and configure client to use fetch.
Node v18 has now been released and fetch is declared globally without any flags. Can we switch to node's version of fetch now and release a new major version along with #137?
Node v18 has now been released and fetch is declared globally without any flags. Can we switch to node's version of fetch now and release a new major version along with #137?
We'll think about this possibility.
May I know why this was closed @andrii-bodnar? Undici’s fetch is noow stable on the latest version of Node 18.
@ImRodry we've recently updated Axios to the latest version and improved Error handling. #226. It's based on the Axios exceptions.
We definitely not going to migrate from Axios in the nearest future. When something changes we will reopen this issue.
That does not answer my question nor does it satisfy the original issue here. The goal here is to remove the dependency in favor of the built-in library that we’re all using already. Of course this would require a major version bump but it’s still something you should be doing.