The blog of dlaa.me
Archive: November, 2017
  • It depends... [A look at the footprint of popular Node.js command-line parsing packages]
    Tuesday, November 28th 2017

    In a recent discussion of the Node.js ecosystem, I opined that packages with a large number of dependencies contribute to excessive disk space use by apps that reference them.

    But I didn't have data to back that claim up, so I made some measurements to find out. Command-line argument parsing is a common need and there are a variety of packages to make it easier. I found nine of the most popular and installed each into a new, blank project as a standard dependency item in package.json via npm install. Then I counted the number of direct dependencies for that package, the total (transitive) number of packages that end up being installed, and the size (in bytes) of disk space consumed (on Windows). I tabulated the results below and follow with a few observations.

    Important: I made no attempt to assess the quality or usefulness of these packages. They are all popular and each offers a different approach to the problem. Some are feature-rich, while others offer a simple API. I am not promoting or critiquing any of them; rather, I am using the aggregate as a source of data.

    Package Popularity Direct Dependencies Transitive Dependencies Size on Disk
    argparse 494 1 2 152,661
    commander 18865 0 1 48,328
    command-line-args 677 3 5 237,789
    dashdash 156 1 2 94,377
    meow 2344 10 43 455,525
    minimatch 2335 1 4 57,803
    minimist 8490 0 1 31,151
    nomnom 549 2 6 119,237
    yargs 7516 12 44 576,724

    These metrics were captured on 2017-11-25 and may have changed by the time you read this.

    Notes:

    • The two most popular packages are the smallest on disk and have no dependencies; the third and fourth most popular are the biggest and have the most dependencies.
    • Packages with fewer dependencies tend to have the smallest size; those with the most dependencies have the largest.
    • The difference between the extremes of direct dependency count is about 10x.
    • The difference between extremes for transitive dependency count is about 40x.
    • The difference between disk space extremes is about 20x.

    While this was a simple experiment that doesn't represent the whole Node ecosystem, it seems reasonable to conclude that:

    Similar packages can exhibit differences of an order of magnitude (or more) in dependency count and size. If that matters for your scenario, measure before you choose!

    For my part, I tend to resist taking on additional dependencies when possible and prefer using dependencies that adhere to the same principle. Reinventing the wheel is wasteful, of course - but sometimes less is more and it's good to keep complexity to a minimum.

    Tags: Node.js Technical