nodejsのパッケージマネージャーであるnpmの最新版(まだ安定版でない)であるnpm@3を使ってみました。

地味に嬉しいのが

npm install -g npm

でこけたときにnpm本体が消えなくなったそうです。昔、npm本体が消え去ったときは何が起こったかわかりませんでした。

わかりやすい変更点としては,npmでインストールされるモジュールはそれが依存しているモジュールをそのディレクトリ配下に持ちます。
依存されているモジュールはさらに、そのディレクトリ配下に依存しているモジュールを持ちます。
なので、階層が深くなってしまう上に、同じモジュールを持っていることもあります。
これがnpm@3だと上手い具合に依存関係を整理してくれてnode_modeules配下へ並列に全部配置してくれます。階層が浅くなる上に、ダブっているモジュールもなくなります。バージョンが問題になるときなどは配下に持つようにしたりして上手く管理しているとのことです。

で、実際に使ってみました。下記が自分がとあるところで使っているpackage.jsonです。

[javascript]
{
“name”: “test”,
“version”: “0.0.1”,
“private”: true,
“scripts”: {
“start”: “node ./bin/www”
},
“dependencies”: {
“aws-sdk”: “^2.1.39”,
“body-parser”: “~1.13.2”,
“compression”: “^1.5.1”,
“config”: “^1.15.0”,
“cookie-parser”: “~1.3.5”,
“debug”: “~2.2.0”,
“express”: “~4.13.1”,
“hbs”: “~3.1.0”,
“log4js”: “^0.6.25”,
“morgan”: “~1.6.1”,
“multiparty”: “^4.1.2”,
“request”: “^2.60.0”,
“serve-favicon”: “~2.3.0”
}
}
[/javascript]

これをnpm@3でインストールしてみると。

npm install
ls node_modules/
accepts                  fd-slicer                on-finished
amdefine                 finalhandler             on-headers
ansi-regex               forEachAsync             optimist
ansi-styles              forever-agent            parseurl
array-flatten            form-data                path-to-regexp
asn1                     forwarded                pend
assert-plus              fresh                    process-nextick-args
async                    generate-function        proxy-addr
aws-sdk                  generate-object-property qs
aws-sign2                graceful-readlink        range-parser
basic-auth               handlebars               raw-body
bl                       har-validator            readable-stream
bluebird                 has-ansi                 request
body-parser              hawk                     sax
boom                     hbs                      semver
bytes                    hoek                     send
caseless                 http-errors              sequence
chalk                    http-signature           serve-favicon
combined-stream          iconv-lite               serve-static
commander                inherits                 sntp
compressible             ipaddr.js                source-map
compression              is-my-json-valid         statuses
config                   is-property              string_decoder
content-disposition      isarray                  stringstream
content-type             isstream                 strip-ansi
cookie                   json-stringify-safe      supports-color
cookie-parser            jsonpointer              tough-cookie
cookie-signature         log4js                   tunnel-agent
core-util-is             media-typer              type-is
cryptiles                merge-descriptors        uglify-js
ctype                    methods                  underscore
debug                    mime                     unpipe
delayed-stream           mime-db                  util-deprecate
depd                     mime-types               utils-merge
destroy                  minimist                 vary
ee-first                 morgan                   walk
escape-html              ms                       wordwrap
escape-string-regexp     multiparty               xml2js
etag                     negotiator               xmlbuilder
express                  node-uuid                xtend
extend                   oauth-sign

npm2の方でインストールすると

npm install
ls node_modules/
aws-sdk       compression   debug         hbs
morgan        request       body-parser   cookie-parser
express       log4js        multiparty    serve-favicon

となり全然違います!
node_modulesのサイズはnpm@3の方が

du -s node_modules/
32728   node_modules/

npm2が

du -s node_modules/
36576   node_modules/

どれくらい重複しているかどうかに依存しますが、そこそこサイズが小さくなっています。当然ファイル数も少なくなっているはずですし、なかなかいい感じですね。

※作成から2年前(774日経過)の記事です。内容が古い可能性があります。
東京都東日本橋の株式会社プレスマンPRESSMAN*Tech