• Stars
    star
    442
  • Rank 98,677 (Top 2 %)
  • Language
  • Created about 12 years ago
  • Updated almost 9 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Front-End Package Manager Comparison

Front-End Package Manager Comparison

Why do this?

It is about time for front-end developers to have a decent package manager. Front-end development is serious business and there is no good reason for us to continue with sub-par tools or no tools at all.

I appreciate the effort that has gone into all of these. It is awesome to see really talented developers taking on the task and sharing the result with the rest of us.

Who are you?

  • I am a full-stack software developer
  • I love what I do
  • I love sharing what I've learned
  • Hit me up at @wilmoore, @github, and @linkedin

The contenders

The following tools have caught my attention:

NOTES:

  • component is more of a concept and a framework for building and distributing front-end components. If you'd like to read more on this distinction, check out the issue #1 thread.
  • bower is meant to be consumed by higher-level tools and frameworks. What this means in practice is:
  • (1) bring your own CJS/AMD loader.
  • (2) bring your own build tool.
  • (3) bring your own organization conventions.
  • (4) ultimately, coupled with either make or grunt, bower looks like a viable option

What is a package manager?

A package manager is a tool that allows you to specify a list of dependencies for your library or application. The tools depicted here are similar in scope to Bundler, NPM, or Composer.

How is this thing evaluated?

Since tool choice is extremely subjective, you (and/or your team) should come up with your own weighting system and score each tool accordingly.

Configuration File

The following table provides the name of the "manifest" file where you specify dependencies and/or the details of your package.

Configuration bower component jam volo npm spm
filename bower.json component.json package.json package.json package.json package.json

Sample bower enabled bower.json file:

{
  "name": "my-project",
  "version": "1.0.0",
  "main": "path/to/main.css",
  "ignore": [
    ".jshintrc",
    "**/*.txt"
  ],
  "dependencies": {
    "<name>": "<version>",
    "<name>": "<folder>",
    "<name>": "<package>"
  },
  "devDependencies": {
    "<test-framework-name>": "<version>"
  }
}

Sample component enabled component.json file:

{

  "name":        "tip",
  "repo":        "component/tip",
  "description": "Tip component",
  "version":     "0.0.1",
  "keywords":    ["tooltip", "tip", "ui"],
  "dependencies": {
    "component/emitter": "*",
    "component/jquery":  "*"
  },
  "scripts": ["index.js", "template.js"],
  "styles":  ["tip.css"]

}

Sample jam enabled package.json file:

{

  "name":        "csbp",
  "version":     "0.0.1",
  "description": "A Non-Framework Client-Side JavaScript/HTML5 Project Boilerplate",

  "dependencies": {
    "jamjs":         "*",
    "grunt-contrib": "*"
  },

  "devDependencies": {
    "chai":          "*",
    "mocha":         "*",
    "sinon":         "*",
    "grunt-mocha":   "*"
  },

  "jam": {
    "packageDir": "src/libs/js",
    "baseUrl":    "src/main/js"
  }

}

Sample volo enabled package.json file:

 {

  "name":            "csbp",
  "version":         "0.0.1",
  "description":     "A Non-Framework Client-Side JavaScript/HTML5 Project Boilerplate",

  "dependencies": {
  },

  "devDependencies": {
    "yeti":          "*",
    "docco":         "*",
    "jshint":        "*",
    "chai":          "*",
    "mocha":         "*",
    "sinon":         "*"
  },

  "amd":  {},

  "volo": {
    "baseUrl":       "src/js/lib",

    "dependencies":  {
      "page":        "github:visionmedia/page.js",
      "requirejs":   "*"
    }
  }

}

Sample npm + browserify enabled package.json file:

{
  "name": "{{project}}",
  "version": "1.0.0",
  "description": "{{description}}",

  "repository": "git://github.com/{{author}}/{{project}}.git",
  "main": "index.js",

  "dependencies": {
    "hyperquest": "~0.1.0"
  },
  "devDependencies": {
    "mocha": "*"
  },

  "licenses": "MIT"
}

Sample spm enabled package.json file:

{
  "name": "{{project}}",
  "version": "1.0.0",
  "description": "{{description}}",

  "repository": "git://github.com/{{author}}/{{project}}.git",

  "spm": {
    "main": "index.js",
    "dependencies": {
      "moment": "2.8.1",
      "jquery": "1.11.1"
    }
  },

  "licenses": "MIT"
}

NOTES:

  • There is an interesting discussion regarding some of the reasoning behind bower not supporting the well-known package.json format.
  • When using volo, I would suggest using the flags:
    • -nostamp: mitigates the reformating of your package.json file
    • skipexists: skip existing dependencies without noisy warnings
  • When using npm with browserify you can optionally add a "browser" field to package.json which overrides the "main" field. See the browser spec for more info.

Package Installation Location

The following table details where each tool stores downloaded packages.

Path bower component jam volo npm + browserify spm
default path ./bower_components ./components ./jam ./js, ./scripts, ./ ./node_modules ./spm_modules
custom path .bowerrc --out dir jam.packageDir volo.{baseDir,baseUrl}, amd.baseDir - --outputDirectory dir

NOTES:

volo has a fairly complex algorithm.

If not defined in package.json it:

  • Looks for a ./js directory
  • Looks for a ./scripts directory
  • Otherwise, the current working directory is used

Development Dependencies

The following table details whether each tool allows specifying development dependencies.

Development Dependencies bower component jam volo npm + browserify spm
devDependencies

NOTES:

  • Since jam, volo and npm use package.json, this just works; however, component re-implements this functionality here.

Responsibilities

The following table details the responsibilities the given tool takes on.

Responsibilities bower component jam volo npm + browserify spm
package management ✓ (npm)
project bootstrapping - -
project scaffolding - - - - -
build automation - - - - -
script/module loading - - - -
compile/build - - - ✓ (browserify)

NOTES:

  • Project bootstrapping (i.e. component create mycomponent) is generally very minimal.
  • Project scaffolding (i.e. volo create username/template-repo) can be a bit more involved.
  • An interesting comparison of volo and grunt.

Build/Compile

The following table details which tools require a build/compile step during development.

Build/Compile? bower component jam volo npm + browserify spm
? - ✓ (component build) - - ✓ (browserify) ✓ (spm build)

NOTES:

  • N/A

Central Registry

The following table details which tools expose a central "registry".

Registry? bower component jam volo npm + browserify spm
? -

NOTES:

Package installation sources

The following table details the method by which each tool allows you to specify each dependency (i.e. dependencies).

Source bower component jam volo npm + browserify spm
git / github ✓ (CLI ONLY) -
private repositories ✓ (SEE NOTES BELOW) -
local repositories - -
zip / tarball - ✓ (CLI ONLY) ✓ (ZIPBALL ONLY) -
HTTP/HTTPS URL - - - -
NPM - - - -
registry - - - -

NOTES:

  • I've never been on a serious team where no support for private repositories would be acceptable. If this is important to you, it seems that your best options are currently bower, component, jam and npm.
  • While volo doesn't actually claim to have explicit support for private repositories, you can achieve the notion of private repositories by providing a URL to a single JavaScript source file (github and github:enterprise allow you to link to a raw file) or you can specify a URL to a zipball. There are a few more tricks that you can choose from listed here.
  • You can setup a private jam free repo from garden20. Other details for a private repo can be found here.
  • Jam allows this jam install gh:visionmedia/page.js but only via the command-line (no package.json support).

Speed

The following table details the speed of each tool.

Registry? bower component jam volo npm spm
~85 components ~80s ~10s ~80s ~80s ~40s ~20s

NOTES:

  • For most projects, speed won't be an issue; however, YMMV.
  • These benchmarks were taken from the component documentation; thus depending on your setup and dependencies, YMMV.

Supported JavaScript Module formats

The following table details the JavaScript format each tool expects/handles.

Format bower component jam volo npm + browserify spm
Global Script ✓ (--standalone) - -
AMD ✓ (format agnostic) ✓ (--standalone) - -
CommonJS/NodeJS ✓ (format agnostic) ✓ (uses CJS style) - -
CommonJS (WRAPPED) ✓ (format agnostic) ✓ (--standalone) - -

NOTES:

There are several JavaScript formatting methodologies:

  • Global Script

      <script src="todo.js"></script>
      <script>
         var todo = new Todo({description: '', done: false});
      </script>
    
  • AMD

      define(['todo'], function(Todo){
         var todo = new Todo({description: '', done: false});
      });
    
  • CommonJS/NodeJS

      var Todo = require('todo');
      var todo = new Todo({description: '', done: false});
    
  • CommonJS (wrapped in an AMD-style define)

      define(function(require){
         var Todo = require('todo');
         var todo = new Todo({description: '', done: false});
      });
    

NOTES:

  • browserify supports transformations, which would make it simple to support other module formats

Module / Script Loader

The following table details the module/script loader supported by each tool.

Source bower component jam volo npm + browserify spm
Bring your own loader - - ✓ (can create multiple bundles) -
Includes a Loader - ✓ (custom require) ✓ (RequireJS) - ✓ (Sea.js)

NOTES:

Loaders that you might be interested in:

Package Contents

The following table details the the types of source files that can be contained in each package per tool.

Source bower component jam volo npm + browserify spm
JavaScript
HTML - -
CSS - -

NOTES:

  • npm lets you install any arbitrary files (much like bower) so you could bring your own loader for CSS and HTML.
  • browserify can facilitate loading static assets via brfs which analyzes the AST for fs.readFileSync() calls and inlines file contents. See comment by @substack for more details.

Final thoughts

Each package manager is built by talented, responsive, and friendly developers. Ultimately, to evaluate for your team, you will have to put a weight on each category and score per your needs.

Library and component authors may want to consider:

  • Using a UMD wrapper.
  • Authoring both a {component,package}.json for front-end and npm (where appropriate).
  • Adhering to these Library best practices or something similar.

Complementary Resources

Below is a list of resources that will likely be useful to you if you found this comparison useful:

Contributing

I am sure I've made a few grammatical and spelling errors. I've probably even made comparison errors in a few spots. Please feel free to speak up or submit a pull request.

Symbols Used

More Repositories

1

php-version

stupid simple PHP version management
Shell
679
star
2

selectn.js

Curried property accessor function that resolves deeply-nested object properties via dot/bracket-notation string path while mitigating TypeErrors via friendly and composable API.
JavaScript
193
star
3

require-grunt-configs

Load a directory of grunt configurations.
JavaScript
45
star
4

attributes.php

A minimal trait to decrease getter/setter boilerplate.
PHP
22
star
5

node-supertest-koa-agent

Converts a Koa app into a supertest compatible agent instance.
JavaScript
15
star
6

request-id.js

Allows you to identify client requests within non-sequential logs such as Syslog by adding a response header of X-Request-Id. Allows setting value via query parameter or request header. For Koa and Express.
JavaScript
14
star
7

homebrew-home

An alternative Homebrew installation script that eliminates annoying `brew doctor` notices by putting Homebrew into `~/.homebrew` instead of `/usr/local`.
13
star
8

node-homedir

Platform agnostic user home directory path resolution for Node.js.
JavaScript
10
star
9

ruby-version

stupid simple RUBY version management
Shell
10
star
10

basic-auth-token.js

Token generated by concatenating username and password with : character within a base64 encoded string.
JavaScript
7
star
11

to-array.js

Converts primitives and objects (plain or array-like) to a sensible array representation for Node.js and the browser.
JavaScript
7
star
12

browserify-standalone

Browserify standalone (UMD) build based on values in your package.json (name and main).
JavaScript
5
star
13

sprout-commonjs-lib

Sprout based Node/CommonJS package generator.
JavaScript
5
star
14

filemanager-php-s3-plugin

Core Five FileManager PHP connector S3 plugin
PHP
5
star
15

macbook

Mac OS X setup for software developers.
5
star
16

mocha-chai-coffee

Minimal Node.js module example with production code written in pure JavaScript and unit tests written in CoffeeScript. Tests written against the Mocha and Chai libraries. Continuous integration via Travis.
CoffeeScript
5
star
17

nodejs-install

Installs pre-compiled NodeJS binaries while avoiding sudo or chown.
Shell
5
star
18

mocha-chai-livescript

Minimal Node.js module example with production code written in pure JavaScript and unit tests written in LiveScript. Tests written against the Mocha and Chai libraries. Continuous integration via Travis.
LiveScript
5
star
19

git-hub

Git extension for automating your github.com (or enterprise) workflow from the command-line.
Shell
4
star
20

brackets2dots.js

Convert string with bracket notation to dot property notation for Node.js and the browser.
JavaScript
4
star
21

sinon-browser-only

SinonJS browser build.
JavaScript
4
star
22

array-groupby.js

Curried function that returns a map (object) with keys derived by applying each array element to the given identity function. The value(s) at each key will be an array of elements whose identity matches the given key.
JavaScript
4
star
23

ontap

Declare and install homebrew formulae and taps via ~/.ontaprc (deprecated in favor of brew bundle and brew bundle-dir)
Shell
4
star
24

node-env-newrelic

Load newrelic in a 12-factor environment with sane defaults.
JavaScript
4
star
25

uuid-regexp.js

RegExp for finding an RFC4122 compliant UUID in a string.
JavaScript
4
star
26

rerun-script

Via package.json, configure glob patterns to watch and invoke an npm run script on change.
JavaScript
3
star
27

node-assert-env

Assert that specific environment variables exist.
JavaScript
3
star
28

basic-authorization-header.js

RFC2617 basic authorization header from username and password.
JavaScript
3
star
29

regexp-map.js

Curried function which takes a map of `RegExp` string keys which when successfully matched given string, resolves to mapped value.
JavaScript
3
star
30

almon

Asterisk Log Monitor
PHP
3
star
31

node-env-accessors

process.env accessor functions.
JavaScript
3
star
32

provision-servers

Minimal server provisioning/deployment via SSH.
Shell
2
star
33

dotsplit.js

Transform dot delimited strings to array of strings for Node.js and the browser.
JavaScript
2
star
34

curry2.js

Curry a binary function.
JavaScript
2
star
35

orderby-time.js

Curried function returning a new array sorted by time without mutating the original array.
JavaScript
2
star
36

react-native-expo-turtle-build-and-upload

A set of GNU Make targets for building and uploading React Native application releases for iOS and Android.
Makefile
2
star
37

active-activity-search.js

Active.com Activity Search v2 HTTP API client.
JavaScript
2
star
38

function-accessor.js

Higher-Order accessor functions.
JavaScript
2
star
39

greater-than.js

Whether given value or value within an object property is greater than X.
JavaScript
2
star
40

node-env-docker

Run a docker command with environment variables populated via .env.
JavaScript
2
star
41

node-tape-runner

A tape runner API allowing you to create custom test runners.
JavaScript
2
star
42

life

Proverbs 27:17 - As iron sharpens iron, so a friend sharpens a friend.
1
star
43

json-parse.js

Curried function that calls `JSON.parse` on provided input returning either the parsed JSON or the specified default value if the data fails to parse as valid JSON instead of throwing a `SyntaxError`.
JavaScript
1
star
44

node-envc-assert

A drop-in replacement for envc that also verifies specific environment variables are set.
JavaScript
1
star
45

reactq

A minimalist DSL for pub/sub in PHP
PHP
1
star
46

ifstring.erl

Erlang string predicates.
Erlang
1
star
47

pg-array

Convert arrays and delimited strings to PostgreSQL array representation.
JavaScript
1
star
48

cometd-jquery

JavaScript CometD Bayeux implementation with jQuery bindings packaged for npm.
JavaScript
1
star
49

string-split.js

A curried `String.prototype.split` with support for splitting by String, RegExp, or Function.
JavaScript
1
star
50

javascript-gotchas

JavaScript
1
star
51

node-authorized-keys

Platform agnostic path resolution to a user's authorized_keys file Node.js.
JavaScript
1
star
52

slidedecks

Slide Decks
Java
1
star
53

transfer

A convenient shell wrapper for http://transfer.sh.
Shell
1
star
54

node-git-origin-url

Retrieve the git remote origin URL of the current repo for Node.js.
JavaScript
1
star
55

function-pipeline.js

Similar to the Unix `|` operator; returns a function that invokes the given series of functions whose output is subsequently passed to the next function in the series.
JavaScript
1
star
56

take-last.js

Returns a new shallow copy of the last n elements taken from the end of the given array. When list.length < n the list returned contain list.length elements.
JavaScript
1
star
57

git-jenkins-status

Git extension to quickly check Jenkins build status.
Shell
1
star
58

array-mapcat.js

Curried function deriving new array values by applying provided function to each item/index of provided array then applying `concat` to the results. Fast and compatible with modern or old browsers.
JavaScript
1
star
59

knex-mysql-middleware

Set a MySQL flavored Knex connection that can be accessed via Koa or Express middleware.
JavaScript
1
star
60

wonlogo.svg

wonlogo.svg is the reference implementation for scalable unicode wordmark IDs. It promotes togetherness and inclusively while also celebrating one's individuality.
Shell
1
star
61

sum.js

Sum a list of number literals, nested object property values, or values returned from a custom function for Node.js and the browser.
JavaScript
1
star
62

array.filter.js

Curried function deriving a new array containing items from given array for which predicate returns true. Supports unary function, RegExp, dot/bracket-notation string path, and compound query object as predicate
JavaScript
1
star