Node.jsのモジュール化を使って、別ファイルにあるプログラムをコールする
Node.jsではモジュール化(exports)を使ってファイルを分割することができます。使い方についてメモ。
なお、本記事のサンプルは全てindex.js
からモジュール化したファイルを利用する方法になります。
単一の関数
単一の関数の場合にはmodule.exports
を使います。
"use strict";
module.exports = () => {
console.log("exec print1");
}
"use strict";
const export_function = require('./exports.js');
export_function(); // exec print1
単一のクラス
単一のクラスの場合もmodule.exports
を使います。
"use strict";
class ExportClass {
constructor() {
console.log("ExportClass");
}
}
module.exports = ExportClass;
"use strict";
const Exports = require('./exports.js');
const exportClass = new Exports(); // ExportClass
複数のエクスポート
複数の関数・複数のクラス・関数+クラスなどをモジュール化する場合にはexports
を使います。
"use strict";
// 複数の関数.
exports.export_print = () => {
console.log("exec print1");
}
exports.export_print2 = () => {
console.log("exec print2");
}
class ExportClassOne {
constructor() {
console.log("ExportClassOne");
}
}
class ExportClassTwo {
constructor() {
console.log("ExportClassTwo");
}
}
// 複数のクラス.
exports.ExportClassOne = ExportClassOne;
exports.ExportClassTwo = ExportClassTwo;
"use strict";
const export_function = require('./exports.js');
export_function.export_print(); // exec print1
export_function.export_print2(); // exec print2
const exportClass1 = new export_function.ExportClassOne(); // ExportClassOne
const exportClass2 = new export_function.ExportClassTwo(); // ExportClassTwo
分割代入
複数のプロパティがある場合は分割代入を使って直接プロパティ名で利用可能です。
"use strict";
const { export_print, export_print2, ExportClassOne, ExportClassTwo } = require('./exports.js');
export_print(); // exec print1
export_print2(); // exec print2
const exportClass1 = new ExportClassOne(); // ExportClassOne
const exportClass2 = new ExportClassTwo(); // ExportClassTwo
exportsを使った単一の指定
exports
を使って単一の関数やクラスをモジュール化することも可能です。その場合module.exports
のように代入による利用はできません。
下記は単一のクラスを指定した場合の例ですが、関数でも同様です。
"use strict";
class ExportClassOne {
constructor() {
console.log("ExportClassOne");
}
}
exports.ExportClassOne = ExportClassOne;
エラーとなる記述
"use strict";
const ExportClassOne = require('./exports.js');
const exportClass1 = new ExportClassOne(); // TypeError: ExportClassOne is not a constructor
正しい記述
次のいづれかで記述します。
"use strict";
const ExportClassOne = require('./exports.js');
const exportClass1 = new ExportClassOne.ExportClassOne(); // ExportClassOne
"use strict";
const { ExportClassOne } = require('./exports.js');
const exportClass1 = new ExportClassOne(); // ExportClassOne
module.exports について
直接定義は1つしか設定できません。また呼び出し側は分割代入できません。
関数の場合
"use strict";
function putLog(no) {
console.log(`no is ${no}`);
}
function putLog2() {
putLog(2)
}
module.exports = putLog;
module.exports = putLog2;
"use strict";
const putLog = require('./putlogs.js');
putLog(1); // no is 2
あとから設定したputLog2
が有効になっています。
複数定義したい場合
module.exports
を使って複数定義したい場合は次のようにします。
なお、複数定義の場合はmodule.exports
よりexports.プロパティ名
を利用する方が一般的なようです。
"use strict";
function putLog(no) {
console.log(`no is ${no}`);
}
function putLog2() {
putLog(2)
}
module.exports = {
putLog: putLog,
putLog2: putLog2,
}
"use strict";
const putLog = require('./putlogs.js');
putLog.putLog(1); // no is 1
putLog.putLog2(); // no is 2
この場合は分割代入も可能です。
"use strict";
const { putLog, putLog2 } = require('./putlogs.js');
putLog(1); // no is 1
putLog2(); // no is 2
クラスの場合
"use strict";
class LogClassOne {
constructor() {
console.log("LogClassOne");
}
}
class LogClassTwo {
constructor() {
console.log("LogClassTwo");
}
}
module.exports = LogClassOne;
module.exports = LogClassTwo;
"use strict";
const LogClass = require('./putlogs.js');
const logClass = new LogClass(); // LogClassTwo
複数定義したい場合
関数定義の場合と同じように複数定義することも可能です。分割代入も可能になります。
"use strict";
class LogClassOne {
constructor() {
console.log("LogClassOne");
}
}
class LogClassTwo {
constructor() {
console.log("LogClassTwo");
}
}
module.exports = {
ClassOne: LogClassOne,
ClassTwo: LogClassTwo,
}
"use strict";
const putLog = require('./putlogs.js');
const logClass1 = new putLog.ClassOne(); // LogClassOne
const logClass2 = new putLog.ClassTwo(); // LogClassTwo
分割代入
"use strict";
const { ClassOne, ClassTwo } = require('./putlogs.js');
const logClass1 = new ClassOne(); // LogClassOne
const logClass2 = new ClassTwo(); // LogClassTwo