npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

pxnpminstall

v3.0.1

Published

Make npm install fast and handy.

Downloads

38

Readme

npminstall

NPM version build status appveyor build status Test coverage David deps Known Vulnerabilities npm download

Let npm install fast and easy.

Use as Cli

Install

$ npm install npminstall -g

Usage

In cnpm

It is integrated in cnpm.

$ npm install cnpm -g
$ cnpm install  // will use npminstall

npminstall

Usage:

  npminstall
  npminstall <pkg>
  npminstall <pkg>@<tag>
  npminstall <pkg>@<version>
  npminstall <pkg>@<version range>
  npminstall <folder>
  npminstall <tarball file>
  npminstall <tarball url>
  npminstall <git:// url>
  npminstall <github username>/<github project>

Can specify one or more: npm install ./foo.tgz bar@stable /some/folder
If no argument is supplied, installs dependencies from ./package.json.

Options:

  --production: won't install devDependencies
  --save, --save-dev, --save-optional: save installed dependencies into package.json
  -g, --global: install devDependencies to global directory which specified in `$ npm config get prefix`
  -r, --registry: specify custom registry
  -c, --china: specify in china, will automatically using chinese npm registry and other binary's mirrors
  -d, --detail: show detail log of installation
  --trace: show memory and cpu usages traces of installation
  --ignore-scripts: ignore all preinstall / install and postinstall scripts during the installation
  --no-optional: ignore optionalDependencies during the installation
  --forbidden-licenses: forbit install packages which used these licenses
  --engine-strict: refuse to install (or even consider installing) any package that claims to not be compatible with the current Node.js version.
  --flatten: flatten dependencies by matching ancestors dependencies
  --registry-only: make sure all packages install from registry. Any package is installed from remote(e.g.: git, remote url) cause install fail.
  --cache-strict: use disk cache even on production env

npmuninstall

Usage:

  npmuninstall <pkg>
  npmuninstall <pkg>@<version>
  npmuninstall <pkg>@<version> [<pkg>@<version>]

npmlink

Usage:

  npmlink <folder>

Use as Lib

Install

$ npm install npminstall --save

Usage

const co = require('co');
const npminstall = require('npminstall');

co(function* () {
  yield npminstall({
    // install root dir
    root: process.cwd(),
    // optional packages need to install, default is package.json's dependencies and devDependencies
    // pkgs: [
    //   { name: 'foo', version: '~1.0.0' },
    // ],
    // install to specific directory, default to root
    // targetDir: '/home/admin/.global/lib',
    // link bin to specific directory (for global install)
    // binDir: '/home/admin/.global/bin',
    // registry, default is https://registry.npmjs.org
    // registry: 'https://registry.npmjs.org',
    // debug: false,
    // storeDir: root + 'node_modules',
    // ignoreScripts: true, // ignore pre/post install scripts, default is `false`
    // forbiddenLicenses: forbit install packages which used these licenses
  });
}).catch(err => {
  console.error(err.stack);
});

Support Features

  • [x] all types of npm package
    • [x] a) a folder containing a program described by a package.json file (npm install file:eslint-rule)
    • [x] b) a gzipped tarball containing (a) (npm install ./rule.tgz)
    • [x] c) a url that resolves to (b) (npm install https://github.com/indexzero/forever/tarball/v0.5.6)
    • [x] d) a @ that is published on the registry with (c)
    • [x] e) a @ (see npm-dist-tag) that points to (d)
    • [x] f) a that has a "latest" tag satisfying (e)
    • [x] g) a that resolves to (a) (npm install git://github.com/timaschew/cogent#fix-redirects)
  • [x] All platform support
  • [x] global install (-g, --global)
  • [x] preinstall, install, postinstall scripts
  • [x] node-gyp
    • [x] node-pre-gyp
  • [x] bin ([email protected], [email protected])
  • [x] scoped package
  • [x] bundleDependencies / bundledDependencies ([email protected], [email protected])
  • [x] optionalDependencies ([email protected])
  • [x] peerDependencies ([email protected], [email protected], [email protected])
  • [x] deprecate message
  • [x] --production mode
  • [x] save, save-dev, save-optional
  • [x] support ignore-scripts
  • [x] uninstall
  • [x] resolutions

Different with NPM

This project is inspired by pnpm, and has a similar store structure like pnpm. You can read pnpm vs npm to see the different with npm.

Limitations

  • You can't install from shrinkwrap(and don't want to support for now).
  • Peer dependencies are a little trickier to deal with(see rule 1 below).
  • You can't publish npm modules with bundleDependencies managed by npminstall(because of rule 2 below).
  • npminstall will collect all postinstall scripts, and execute them until all dependencies installed.
  • If last install failed, better to cleanup node_modules directory before retry.

node_modules directory

Two rules:

  1. The latest version of modules will link at options.storeDir's node_modules.
  2. Module's dependencies will link at module's node_modules.

e.g.:

  • app: { "dependencies": { "debug": "2.2.0" } } (root)
  • [email protected]: { "dependencies": { "ms": "0.7.1" } }
app/
├── package.json
└── node_modules
    ├── [email protected]@debug
    │   ├── node_modules
    │   │   └── ms -> ../../[email protected]@ms
    ├── _ms0.7.1@ms
    ├── debug -> [email protected]@debug
    └── ms -> [email protected]@ms # for peerDependencies

flattened vs nested

npminstall will always try to install the maximal matched version of semver:

root/
  [email protected]
  mod/
    koa@~1.1.0
# will install two different version of koa when use npminstall.

you can enable flatten mode by --flatten flag, in this mod, npminstall will try to use ancestors' dependencies to minimize the dependence-tree.

root/
  [email protected]
  mod/
    koa@~1.1.0

root/
  [email protected]
  mod/
    koa@^1.1.0
# both the same version: 1.1.0

root/
  koa@~1.1.0
  mod/
    koa@^1.1.0
# both the same version: 1.1.2

root/
  mod/
    koa@^1.1.0
  moe/
    koa@~1.1.0
# two different versions

npminstall will always treat n.x and n.m.x as flattened

root/
  [email protected]
  mod/
    [email protected]
both the same version: 1.1.0

root/
  koa@~1.1.0
  mod/
    [email protected]
both the same version: 1.1.2

Resolutions

support selective version resolutions like yarn. which lets you define custom package versions inside your dependencies through the resolutions field in your package.json file.

Benchmarks

cnpmjs.org install

cli | real | user | sys --- | --- | --- | --- npminstall | 0m10.908s | 0m8.733s | 0m4.282s npminstall with cache | 0m8.815s | 0m7.492s | 0m3.644s npminstall --no-cache | 0m10.279s | 0m8.255s | 0m3.932s pnpm | 0m13.509s | 0m11.650s | 0m4.443s npm | 0m28.171s | 0m26.085s | 0m8.219s npm with cache | 0m20.939s | 0m19.415s | 0m6.302s

pnpm benchmark

see https://github.com/pnpm/pnpm#benchmark

npminstall babel-preset-es2015 browserify chalk debug minimist mkdirp
    real	0m8.929s       user	0m5.606s       sys	0m2.913s
pnpm i babel-preset-es2015 browserify chalk debug minimist mkdirp
    real	0m12.998s      user	0m8.653s       sys	0m3.362s
npm i babel-preset-es2015 browserify chalk debug minimist mkdirp
    real	1m4.729s       user	0m55.589s      sys	0m23.135s

License

MIT