Thursday, 5 October, 2017 UTC


Summary

The desire to automate everything is pretty common, especially with developers: why should I waste my time doing the same operation countless times?
That desire is at the base of the process that led to the making of our Atom plugin: an autocomplete that allows importing packages from NPM quickly, with a few keystrokes. On top of this, the plugin will prompt the user to save the selected package as a project dependency if a `package.json` is present.
The problem we sought to solve
Many of us use JavaScript and Node daily for a variety of different tasks: scraping data, slackbots, contacting APIs, indexing content… you name it. Luckily, there are plenty of open source libraries on NPM which we can leverage to perform any task in the simplest and fastest way.
We really wanted to solve two main productivity issues in the process of building tools:
  • Looking up packages on NPM or Yarn, either via CLI or on the web
  • Installing the package in our `node_modules` folder (normally via CLI)
Let’s make a contrived example: let’s say we’re writing a small terminal script which needs to add padding to a string, and we don’t want to re-implement this functionality from scratch.
We would normally start by researching the library on NPM or Yarn’s Website, querying for “pad” and evaluating each library by looking at the number of downloads and GitHub stars, and checking if it’s maintained or not.

After selecting our library, we need to explicitly require it in our project dependencies using the command line:
 
 
 
Finally, we can get back to our text editor to actually require the package:
 
 
 
 
 
The number of required steps in order to install a simple library is definitely high and requires to hop from your text editor of choice to a browser and to the terminal – all that for just one library.
Context Matters
While installing a one-shot library is not a problem, doing this operation frequently can lead to a frustrating experience. We didn’t want to waste time researching libraries or running the same instructions again and again. We rather wanted to spend our time focusing on solving our functional problems and creating product features.
One of the first pain points we wanted to solve with our extension was to reduce the need to switch to a browser in order to search for a library. On top of that, we wanted to contextually provide useful information for exploring different options.
In order to provide a selection of the most relevant packages, we’re using an Algolia index with custom ranking which takes into account the number of downloads from NPM in the last 30 days, in conjunction with a Boolean attribute `popular` computed at indexing time, which sorts the most popular results to appear first.
In short, having contextual help (in this case, importing JS modules) is tremendously helpful compared to using 3-4 separate tools.
Let me do that for you
After researching and finding the best suited package for our task, we still need to install it locally on our laptops and track in our project that we’re using that dependency.
Normally, this is automatically handled by NPM or Yarn by using their CLI; that said, the Atom extension will detect if the package is missing and will prompt the user to save it:
The different options come down to different types of dependencies handled by NPM and Yarn, `dependencies` and `devDependencies` being the most used ones for developing a project.
Proof of concept in the time it takes to brew a double shot
The idea for Algolia Atom autocomplete was born in front of a coffee machine on a rainy Parisian morning. My colleague Raymond (the author of Vue InstantSearch, amongst other things) and I discussed how we could leverage Algolia to build something that may prove useful to other developers.
We remembered that Haroen, another fellow Algolian, built a really nice search UI for Yarn:
https://t.co/BdkV4mw8Vg check out the new search available everywhere pic.twitter.com/IvorEaCzN1
— ${HARO_ENV} (@haroenv) February 25, 2017
As this implementation is using indexed packages from NPM, most of the job was already done: we just needed to display results where it made sense the most. Chatting by the steaming cup of coffee for 10 minutes, we figured out that we could use a package autocomplete inside a text editor to automagically require packages, the lazy way.
After moving the project to our desks, we choose to go with Atom because its simple JavaScript API layer allowed us to go very fast: from the concept to the first working prototype it took less than a couple hours (also thanks to Ray’s superhuman developer skills). The idea of also saving the dependency came the day after, in a pair-programming session on our lovely couch.
By the end of the day we published the extension on the Atom Package Registry and open-sourced the code on GitHub.
Since it was a fun hack project we didn’t do any promotion of it at the time. Until today, the only proof that we actually released it was this rather embarrassing tweet.
Lessons learned
Building something quick but useful that could also be useful to other developers feels great. I had a fun time building this project, and I also had an insight or two in the process:
  • Validate your ideas with the people around you as soon as possible. If the people around your are non-technical, try to see if you can explain the problem clearly without them fainting from exhaustion.
  • Re-use existing tools and existing knowledge as much as possible. This will help remove the noise and focus on the actual problem to solve.
  • As soon as you have defined the problem and have a rough idea how to solve it, don’t wait any longer, just do it!
So long and thanks for all the fish
If there’s enough interest around our Atom Plugin, we will consider porting it to other text editors (DEVisual Studio Code, Sublime Text and all the rest), and work a little bit more on cross-platform support (Windows, I’m looking at you).
If you have any feedback about this project or want to share something you built using Algolia feel free to leave a comment here, join us on Discourse or ping @algolia, @proudlygeek & @rayrutjes on Twitter.
The post We Built an Atom Plugin to Find and Install Any NPM Module appeared first on Milliseconds Matter.