Hacker News new | ask | show | jobs
by HNcow 3814 days ago
Not sure if this is a dumb question but I haven't been able to find an answer anywhere.

I currently use underscore 1.8.3. Can I just swap lodash in, or is refactoring involved? I know it's a fork, and I want to move over, but was curious if anyone know off the top of their heads if a lot of work as involved.

5 comments

I haven't looked over the changelog/breaking changes for 4.0.0, so this may not encompass everything there, but there are a few changes you need to be aware of. How hard it is depends on which functions you use currently, but I doubt it would take more than an hour of find-replace work. They are listed here : https://github.com/lodash/lodash/wiki/Migrating The ones that affected me the most were the changes to the overloaded _.first, _.last, etc, but YMMV.
I've done similar refactorings in the past (somehow my fingers only remember `npm install underscore`) and for me it has always been a drop-in replacement. However, as others have pointed out, it does depend on how much functions you are using and from my experience the whole thing should not take long.
I'll put this here just in case no one comments.

https://lodash.com/docs#forEach

http://underscorejs.org/#each

If I'm correct, you're showing this as a counter example to prove that the two have incompatible APIs and are thus LoDash can't be used ad a drop in replacement. However, Lodash does alias it's 'forEach' function with 'each', so this wouldn't be an issue?
underscore.each has an optional 3rd parameter (context). lodash.each does not. If you depend on that 3rd parameter, you will be in a world of pain if you drop-in lodash. In fact you'd be better off if there was no alias because you would catch the problem sooner and have to think about the API differences when fixing it.
To be fair, that context parameter has only just been removed as part of 4.0.0. Instead they recommend you change your code to be of the form:

    _.each(collection, _.bind(function, context))
Which actually seems a lot more correct than some arbitrary context parameter
How is it arbitrary? It's part of the ES spec.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe...

I'm honestly curious why this is being removed?

Ah, I actually didn't realise this was the case, I've always used `.bind(this)` for this kind of thing.
Yeah, each and forEach are aliases in both lodash and underscore.
Lodash v1 was a drop-in Underscore replacement.

Lodash v2 was not but offered an lodash.underscore.js build.

Lodash v3 dropped the compat build in favor of using individual lodash modules until you're able to transition

Lodash v4 continues the view of v3

Well, do you have tests? It would take 10 minutes if you are well-covered. Otherwise, I'd go through each usage.