CommonJSモジュール
CoddyのNode.jsジャーニー「Node.jsの基礎」セクションの一部。レッスン 10/33。
npm パッケージや古いチュートリアルで目にする Node のコードの多くは、別のモジュールシステムを使用しています。
CommonJS では、module.exports でエクスポートし、require でインポートします。.cjs で終わるファイルは、プロジェクトのほかの部分で何が使われていても、常に CommonJS です。そのようなファイルを import すると、その module.exports オブジェクトがデフォルトとして渡されます。
// greet.cjs
function hello(name) {
return 'Hello, ' + name;
}
module.exports = { hello };
// app.js
import greet from './greet.cjs';
console.log(greet.hello('Ada'));exports は、最初は module.exports と同じオブジェクトを指しています。exports.hello = hello はそのオブジェクトに追加しますが、exports = { hello } は変数を置き換えるため、インポートする側には空のオブジェクトが渡されます。
チャレンジ
簡単古いファイル legacy/stats.cjs は、module.exports を使う CommonJS 方式で書かれています。notes.js からこれを使って、stats コマンドを追加しましょう。
legacy/stats.cjsで、countWords(notes)を完成させましょう。メモの配列を受け取り、すべてのメモに含まれる単語の合計数を返します。単語はスペースで区切られています。最初の3つのメモ、Buy milk、Call Ada、Water the plantsに対しては、7を返します。空の配列に対しては、0を返します。notes.jsで、import stats from './legacy/stats.cjs'を使ってファイルをインポートします。これは CommonJS ファイルなので、statsはそのmodule.exportsオブジェクトであり、関数はstats.countWordsです。- 最後の
elseの前に、処理の連鎖にstatsコマンドを追加します。1行で、メモの数に続けて単語数を表示します。3 notes, 7 wordswhereやほかのコマンドも引き続き動作します。
試してみましょう: $ node notes.js の後の入力欄に stats と入力し、Enter キーを押します。3 notes, 7 words と表示されます。次に add Buy bread と入力し、もう一度 stats と入力します。それでも 3 notes, 7 words と表示されます。プログラムが終了すると、ストアが新しいメモを忘れてしまうためです。
自分で試してみよう
// CommonJS方式で書かれた古いモジュール。
function countWords(notes) {
// すべてのnotesに含まれる単語の合計数を返す。
return 0;
}
module.exports = { countWords };
Node.jsの基礎のすべてのレッスン
自分で練習してみよう: Expressプレイグラウンド