npmのあまり知られてない機能 10選

なんか最近Twitterとか職場でも「npmの機能でそんなのあったんだ」って言われること多いので、説明していきます。

ちなみにタイトルにとりあえず10選って書いたけど、あんまりたくさん思いついてないのに、10選って書いてしまったので最後の方は微妙かもしれません。

1. npm installは npm i でも同じことができる

まぁ単純なショートカットですね。isntallとかtypoしてても空気読んでくれるんですが、短いほうがいいよねってことで。

# npm installって書くのも
$ npm install socket.io

#npm i って書くのも同じ
$ npm i socket.io

# ちなみに --saveは -S, --save-devは -D にできる

$ npm i socket.io -S
$ npm i mocha -D

ショートカット小ネタ。

2. npm shrinkwrap

バージョンを固定したい時に使います。Gemfile.lock、carton.lock みたいなものですかね。

semvarでnpmって記述するんですが、 * とか適当に記述するとバージョンが勝手に上がっちゃったり、 ~1.2.3とか書いてると1.2.9とかも入っちゃうので、きちんとバージョンを固定したい場合は事前にnpm shrinkwrapってやった上でそれを実行するといいですね。

$ npm i
$ npm shrinkwrap
# shrinkwrap.jsonができる。その上でnpm installってやってもshrinkwrap.jsonに明示されたバージョンしか入らない。

運用系で使える小ネタですかね。

3. npm version

これはライブラリ作る人は必ず覚えておくと良いコマンドですね。
npm version patchとか npm version minorとかやると以下の事を実行してくれます。

  • package.jsonのversionをpatch, minor, majorにあわせて上げてくれる
  • その上で該当するバージョンのtagを作ってくれる。
$ npm version patch
v0.2.1
$ npm version minor
v0.3.0
$ npm version major
v1.0.0
# package.jsonのversionプロパティが上がっている。
# git tag でみてみると
$ git tag
v0.2.1
v0.3.0
v1.0.0
#という具合にtagが作られてる

バージョンの指定漏れだったり、指定してnpm publish したけどgitのtag付け忘れたりすることあると思うので、そういうのはnpm version使っていると起こしにくいですね。よくやるのは以下の様なフローですね。

$ npm version patch
v0.1.1
# master に push
$ git push origin master
# tagにpush
$ git push origin v0.1.1
# push終わったらnpmにpublish
$ npm publish

4. npm run

僕はすごく好きなんですが、npmって実は簡単なスクリプトなら登録しておけます。
こんな感じにpackage.jsonのscriptsタグの中に書くと

  "scripts": {
    "test": "mocha --require intelli-espower-loader",
    "test-xs": "mocha-phantomjs",
    "build": "jsx lib/useragent.jsx | jsx-linker -t commonjs-lib --stdin -o useragent.js"
  },
# npm runで一覧表示してくれる。  (v1.4.10から)
$ npm run
Available scripts in the useragent.jsx package:
  test
    mocha --require intelli-espower-loader
  test-xs
    mocha-phantomjs
  build
    jsx lib/useragent.jsx | jsx-linker -t commonjs-lib --stdin -o useragent.js

$ npm run build
# これで scriptsに登録したコマンドを実行してくれる。
# ここでは、"jsx lib/useragent.jsx | jsx-linker -t commonjs-lib --stdin -o useragent.js"を実行する

makeとかgruntとかgulpとかいいんですけど、簡単なコマンドならコレでいいかなーって思ってます。

6/11 追記:
sasaplus1 さんのqiitaの記事見てて、環境変数に関しても追記しておいたほうがいいと思ったので追記します。

npm runで実行する際には、node_modules以下のコマンドにはパスが通った状態になります。
なので、npm run の時に mochaとかjsxとか記述してますが、これは何もnpm install mocha jsx -gとかグローバルにインストールする必要はないです。

また、たまに見かけますが、./node_modules/mocha/bin/mochaみたいにパスを明示する必要もありません。node_modules内にインストールされていれば勝手にパスが通った状態になります。

5. npm repo / npm docs

npm repo [packagename]を実行すると リポジトリをブラウザで開いてくれます。githubで管理されてればgithubのページに勝手に行ってくれます。

npm docs [packagename]を実行するとnpmのページをブラウザで開いてくれます。どれくらいDLされてるかなど調べるときには便利。

$ npm repo socket.io
$ npm docs socket.io

6. npm t

npm testは実はnpm tでも同じことに成ります。
これもショートカット小ネタですかね。

$ npm t
# npm testと同様

7. npm dedupe

node.jsでカジュアルにいろんなモジュール入れていると以下の様な依存グラフが出来がちです。

a
+-- b <-- depends on c@1.0.x
| `-- c@1.0.3
`-- d <-- depends on c@~1.0.9
`-- c@1.0.10

つまり、bっていうモジュールがcに依存して、dっていうモジュールもcに依存しているんだけど、お互い参照しているバージョンが違うって事が起きる。まぁこれによってちゃんとbもdも動くようになるのであんまり困ることはないんですが、コードが重複しているっていうのと、aからcを参照しようとした時にバージョンが違うと不整合が起きるのであまり良くないこともあります。

これを解決するのがnpm dedupeです。使うと依存関係を整理して、semvarで上と判断された方に合わせてくれます。

a
+-- b
+-- d
`-- c@1.0.10


kazuhoさんのブログ記事の受け売りですが、覚えておくと良いこともあります。

$ npm dedupe

8. npm outdated

依存モジュールで新しいものが出ているかどうかを確かめたい時に使います。

$ npm outdated

Package     Current  Wanted  Latest  Location
lru-cache     2.2.4   2.2.4   2.5.0  useragent > lru-cache
esprima       1.0.4   1.0.4   1.2.2  jsx-linker > esprima
esprima       1.0.4   1.0.4   1.2.2  jsx > esprima
esmangle     0.0.17  0.0.17   1.0.1  jsx > esmangle
escodegen    0.0.28  0.0.28   1.3.3  jsx > escodegen
source-map   0.1.32  0.1.32  0.1.33  jsx > source-map-support > source-map

こんな感じで表形式で自分の依存ライブラリが古いかどうかを見てくれる。便利。

9. david

もうnpmじゃないんですが、davidnpm outdatedと合わせて使うといいかなーと思ったので記述しておきます。
davidはモジュールの最新安定バージョンを取ってきてくれるツールです。

$ npm install david -g
# こんな風に使う
$ david update

# ちなみに安定じゃない最新バージョンを取るなら
$ david update -u

これで依存モジュールを全て最新にしてくれます。依存モジュールの依存モジュールは最新にしない(あくまで自分が依存しているモジュールだけ最新にする)

10. npm deprecate [package] / npm unpublish [package]

自分でnpmライブラリ書いてて、そのライブラリのとあるバージョンにissueが見つかって、あんまり使ってほしくない時ありますよね。

そういう時はnpm deprecateを使いましょう。

$ npm deprecate useragent.jsx@"< 0.1.1" "CAUTION!! This version has security issue!!"
#こうしておくと、npm installする時に
$ npm install useragent.jsx@0.1.0
npm WARN deprecated useragent.jsx@0.1.0: CAUTION!! This version has security issue!!
# みたいに出るので、npm install時にWARNINGが出て注意喚起することができます。

そうじゃなくてもうinstallをさせたくない時は npm unpublish を使いましょう。

$ npm unpublish useragent.jsx@0.1.0
#こうしておくと npm installでは見つからなくなる

というわけで

npmのtips10選でした。他にもあれば教えて下さい。

スーパー小ネタ系

という報告を頂いたのでお知らせします。

npm は izaacsの悪ノリコマンドが入ってて

npm xmas

f:id:yosuke_furukawa:20140610121038p:plain

xmas気分でいいですね。

npm visnup

f:id:yosuke_furukawa:20140610121113p:plain

npm visnupってやるとこれ誰よ、っていう人が出てくるんですが、
この方ですね。

https://github.com/visnup

node knockoutとかやってるイジられキャラらしいです。

npm substack

substackの名言が出てきます。

$ npm substack
c/,,\
$ npm substack
SEPARATE ALL THE CONCERNS!
$ npm substack
\o/
$ npm substack
MODULE ALL THE THINGS!
$ npm substack
Replace your configs with services

substackがどこで言ってたのか分かりませんが、言いそうな事ではあります。

引き続き小ネタも募集中

追加枠

npm config set init.license

npmって npm init で作る時に LICENSEのデフォルトをISCにするんですが、これは変更可能です。

$ npm config set init.license MIT
#これで、npm initの時のライセンスがMITになる。