Which library you choose to use depends on what your needs are. Need functional reactive programming to handle events and dynamic values? Use the Bacon.js
library. Only need infinite streams and nothing else? Use the stream.js
library. Want to complement jQuery with functional helpers? Try the underscore.js
library. Need a structured environment for serious ad hoc polymorphism? Check out the bilby.js
library. Need a well-rounded tool for functional programming? Use the Lazy.js
library. Not happy with any of these options? Write your own!
Any library is only as good as the way it's used. Although a few of the libraries outlined in this chapter have a few flaws, most faults occur somewhere between the keyboard and the chair. It's up to you to use the libraries correctly and to suit your needs.
And if we're importing code libraries into our JavaScript environment, then maybe we can import ideas and principles too. Maybe we can channel The Zen of Python, by Tim Peter:
Beautiful is better than ugly
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one—and preferably only one—obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than "right" now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea—let's do more of those!