Node.js: ライブラリに分割
ライブラリに分割
ある程度プログラムを作ると 似たような処理を繰り返し書くことがあります。 このような処理は汎用化してライブラリファイルに分割することで、 他のプログラムでも利用することができます。
サブディレクトリの再帰探索の例
Node.js: コールバック処理 のサンプルをライブラリに分割してみる。
ライブラリ LibSample1.js
function recurseDir() をライブラリのソースファイルに移します。 最後に exports.recurseDir = recurseDir; を記述して、 関数 recurseDir() を公開し、外部から利用できるようにします。 exports がないと recurseDir() は外部から見えない関数になります。
const FS = require("fs"); const PATH = require("path"); /* サブディレクトリを再帰探索 @callback find(path, stat) ファイルやディレクトリが見つかったときの処理 {string} path : パス {Object} stat : fs.Stats のオブジェクト @callback error(path, e) 省略可。例外が発生したときの処理 {string} path : パス {Object} e : 例外オブジェクト */ function recurseDir(dir, find, error){ const list = FS.readdirSync(dir); for (const filename of list){ const path = PATH.join(dir, filename); try{ const st = FS.statSync(path); find(path, st); if (st.isDirectory()){ recurseDir(path, find); //再帰探索 } } catch(e){ if (error){ error(path, e); } } } } //exports で外部に公開する //ソースの順序依存があるので function recurseDir() より後に書く。 exports.recurseDir = recurseDir;
プログラム本体 TestNodejs_fs_subdir3.js
require(パス名) で LibSample1.js をインポートします。 LibSample1.js が TestNodejs_fs_subdir3.js と同じディレクトリに ある場合は、パス名は "./LibSample1.js" になります。
/* 再帰でサブディレクトリを探索 node TestNodejs_fs_subdir3.js node TestNodejs_fs_subdir3.js (開始ディレクトリ) 実行例: node TestNodejs_fs_subdir3.js C:\ C:\ から探索 */ const FS = require("fs"); const PATH = require("path"); const LIB = require("./LibSample1.js"); let startdir = process.argv[2]; //コマンドパラメータで指定 if (!startdir){ startdir = "."; //パラメータがない場合は現在のディレクトリから } LIB.recurseDir(startdir, //ファイルやディレクトリが見つかったときの処理 function(path, stat){ if (stat.isDirectory()){ //ディレクトリの場合 console.log(path); } }, //例外が発生したときの処理 function(path, e){ console.log("エラー:" + path); throw e; //例外を投げると処理終了。この行をコメントにすると処理を継続。 });
いろいろ
本格的にモジュール化
プログラムをライブラリに分割する話が本格的になると モジュール化の話になります。 こちらは \node_modules にモジュールファイルを置きます。 こちらは細かい話があるので省略。