NodeSchoolに入学しよう!

モジュールの作成

全334コースを10日間無料で

ぜひご覧ください。

無料で視聴する すべての加入プランを見る
または
module.exportsプロパティを使用して、Node.js用のモジュールを作成する方法について学びます。
講師:
13:10

字幕

このレッスンでは node.jsで モジュールを作成する方法について 説明します。 それでは ワークショッパーを起動してください。 learnyounode(打鍵音) 今回はこちらの 6番目の問題を解きます。 MAKE IT MODULAR という問題です。 (打鍵音) 続きがあります。 ま、この三つのパラメーターを取る関数ですね 一番目はディレクトリの名前 ディレクトリのパスですね それから二番目はフィルターする対象の 拡張子の文字列 そして三番目は 結果を返すcallback関数です。 えー、node.jsのコールバックですので 一番目のパラメーターとして必ず エラーオブジェクトを返します。 そして、二番目のパラメーターとして フィルターされた結果の アイテムのリストを配列の形で返します。 それから、えー、そのモジュールは 次の様な、制約にも従う必要があります。 この様にですね 例えばそのモジュールが グローバル変数という すべてのモジュールで共有されている状態を 勝手に変更したり あるいは勝手に えー、やって欲しくもないのに コンソールに何かを出力したり といったことをされたりすると 非常にそのモジュール自体が 使用しづらくなってしまいます。 また、モジュールの中で エラーが発生した場合には必ずその 使用している側にエラーを通知してやることで その使用している側のプログラムがエラーを 適切にハンドリングすることができますので こういう事も必要です。 ここに挙げた三つのような規則は モジュールを作成する際に 一般的に守るべき事です。 それではモジュールの作成方法 なんですが えー、まずモジュールを作成するためには そのモジュールのために 別個のソースコードですね javaスクリプトのソースコードを 作成する必要があります。 ここでは module.js というファイル名で モジュールを作ってみましょう。 そしてそのモジュールの中で えー、グローバルのモジュールオブジェクト というのがあります。 そこの、えー、Exports というプロパティに対して 一つのやり方としてその関数を 割り当ててやる事で その割り当てた関数をモジュールの えー、エクスポートする つまりモジュールが外側に公開する関数として 定義することができます。 例えば今は 三つのパラメーターをとって ABCという三つのパラメーターをとって それを足し算して 返す様なモジュールを作ってみます。 それからモジュールを使用する側では (打鍵音) これは例えばFSやパスネームといった 標準のモジュールと同じ様に requireメソッドを使います。 requireに この場合はカレントディレクトリにある 自分のモジュールですので ./ という文字を先頭に付加して それからmodule.js というファイル名を渡してやります。 また、この.jsという拡張子は 省略してもOKです。 省略した場合には node.jsが勝手に拡張子を 付与して読み込んでくてます。 これはどちらでもOKです。 そして 今自分が作成したモジュールを これは関数としてエクスポートしましたので 関数として、呼び出してみます。 パラメーターは三つでした。 1、2、3というパラメーターを えー、渡してみます。 そしてそれをコンソールに、コンソールログに そのまま出力してみましょう。 これを実行すると nodeのprogram.js 1、2、3が足されて 6という結果が出力されました。 さて、それでは えー、皆さんのほうでここで一旦動画を止めて えー、プログラムを書いてみてください。 さて、皆さん正解はできましたでしょうか? それでは、答え合わせです。 私の方で 正解のプログラムを 書いていきたいと思います。 まずは、 モジュールの方を書いて行きましょう。 えー、モジュールのmodule.jsを テキストエディタで開きます。 そして、今回の、えー、問題の仕様は モジュールを書いてそのモジュールの 一番目のパラメーターとしてディレクトリ名 dirname 二番目に、フィルターする対象の 拡張子の名前 ext, そして三番目のパラメーターとして 結果を受け取るためのコールバックを受け取る という仕様でした。 callback そしてその中では ディレクトリを読み出すために fsモジュールをロードします。 require fs この様に、えー、モジュールのロードは ソースコードの中の どの部分に書いて頂いても構いません。 requireと言うのはただの関数です。 ですので、必ずしも ファイルの先頭に書く と言う事は必要はありません。 それからもう一つ パスモジュールも今回使用します。 また、このrequireで 読み出されたモジュールというのは 初回の呼び出し時に 結果がキャッシュされますので 2回目以降の呼び出しでは えー、呼び出しは軽くなります。 毎回毎回モジュールを 全部ロードしている訳ではありません。 そして実際に fsモジュールを使ってreaddirで えー、ディレクトリの内容の読み出しですね readdirの一番目のパラメーターは ディレクトリパスです。 与えられたdirnameというのを そのまま渡しましょう。 そして二番目が 結果を受け取るコールバック コールバックの 一番目のパラメーターは必ずerrです。 そして 二番目のパラメーターとして ディレクトリの中身が配列で返ってきます。 (打鍵音) そして、与えられたディレクトリのリストを フィルターして行くのですが、例えば えー、リストは配列なのでforEachの (打鍵音) この様にforEachで 各アイテムを取得してそのアイテムに対して 拡張子でフィルターをかける というやり方をやってもいいのですが 今回ちょっと別のやり方を します。 その別のやり方というのは リストのフィルターメソッドを使用します。 フィルターメソッドを使用する事によって ある条件に一致する えー、配列の部分配列というのを 作成する事ができます。 フィルターメソッドの 一番目のパラメーターは関数です。 その関数の中に えー、条件 そのアイテムが条件に一致するかどうか という式を記述します。 えー、フルターメソッドに与える関数には この様に配列の各要素が渡されます。 それを使用して 今回ですとpath.extnameで まずアイテムの、ファイル名の 拡張子部分を取得した上で その拡張子が extに一致するかどうか extには ドットが含まれていない拡張子が 返ってくるので ドット部分は自分で足してやって これでいいですね(打鍵音) で、さらにこれ この関数、フィルター関数が部分配列を 返り値として返してくれるのでそれを そのままコールバックに渡してやりましょう。 callbackの えー、一番目のパラメーターは errなので、今回エラーは発生してない、 えー、状況なのでnull (打鍵音) これでいいですね nullを渡してやることによって このモジュールの使用側に モジュールの中でエラーが発生しなかったよ ということを伝える事ができます。 それからもう一つ大事な事として readdirというのはI/Oです。 I/Oというのは必ず 何かしらエラーが発生する可能性があります。 ですので、もしエラーが発生した場合には そのエラーを 適切にハンドリングしてやる必要があります。 エラーが発生したかどうかというのは このコールバックのエラーオブジェクト がtrueかどうかによって判定できます。 (打鍵音)エラーがtrueだった場合には 今回の場合は この関数自身が そのモジュールでコールバックを受け取ります ので受け取ったコールバックに対して callback(打鍵音)の err一番目のパラメーターに 発生したエラーをそのまま渡してやります。 そしてreturnをすることによって その場で処理を終了です。 さて、これでモジュールの記述は完了です。 モジュールの、えー、 コールバックの呼び出しは必ず一度で 一度になっていますね。 それから えー、グローバルの変数を 変更してみたりあるいはコンソールに 出力したりと言った事もしていません。 またエラーがもし発生した場合には コールバックにきちんとエラーを渡しています 従って、問題で要求されていた 条件をすべて満たしていますね。 では、えー、これを使用する側の プログラムを書きましょう。 program.jsです。 モジュールのロード部分は先ほど書いたので 後はこのモジュールを使用して (打鍵音) えー、今自分が 書いたモジュールを使用します。 一番目のパラメーターはディレクトリ名ですね ディレクトリ名は コマンドライン引数として渡されてきます。 コマンドライン引数は processのargv配列の中に 入っています。 (打鍵音)そして二番目の パラメーターは拡張子 拡張子も、えー、 コマンドライン引数で渡されます。 そして三番目はコールバック コールバック関数は 一番目に エラーオブジェクトを取り 二番目にフィルターされた要素 の配列を取ります。 そしてこれを使って えー、listのforEach (打鍵音) で、えー、 コンソールログに出力してやります。 (打鍵音)アイテムを console.logで出力 これで完成ですね。それから今回特に 仕様では要求されていませんが 例えばコールバックが、えー、もし モジュールの呼び出しで エラーが発生した場合には (打鍵音)consoleの errというメソッドを使ってエラーを 標準エラー、あー失礼しました、エラー出力に えー、エラーの内容を出力そしてその場で プログラムを終了 このerrというメソッドは エラー出力 という部分に コンソールログですと 通常、標準出力 というものに その結果が出力されるのですが、こちらの errを使ってエラー出力に出力する事 によってプログラムを使用した人が エラーが発生したという事を 判別できるようになります。 ですので何かプログラムの中でエラーが 発生したような場合にはこのように エラーメソッドを使って えー、エラー出力に テキストを出力するといいです。 それではこれでプログラムが出来たはずなので 検証してみましょう。 learnyounodeの えー、verifyの program.js この様に 結果は、通りました。 このレッスンではnode.jsで モジュールを作成する方法について 説明しました。

NodeSchoolに入学しよう!

NodeSchoolワークショッパーとは、オープンソースで開発されているNode.jsやJava Scriptについて学ぶためのクイズ形式のアプリケーションです。このコースでは、learnyounodeとexpressworksという2つのワークショッパーを通じてNode.jsとExpress.jsの基本的な使い方を学びます。

3時間13分 (24 ビデオ)
現在、カスタマーレビューはありません…
 
ソフトウェア・トピック
Node.js Node.js 0.10.24
価格: 3,990
発売日:2015年04月07日

このコースは、「オンデマンド」でご利用可能であり、ダウンロードすることもオンラインで見ることもできます。

ダウンロードすると、オフラインでコースを使用し、豊富なインターフェースをフルに活用できます。複数のデバイスを使用したり、 一度に全コースをダウンロードしたくない場合は、アカントにログインして、ストリーミング・ビデオとしてコースのレッスンを視聴してください。

ビデオトレーニングをお楽しみいただけますように! お問い合わせは、cs-jp@lynda.com宛までご連絡ください。