Node.jsのモジュール化を使って、別ファイルにあるプログラムをコールする

Node.jsではモジュール化(exports)を使ってファイルを分割することができます。使い方についてメモ。
なお、本記事のサンプルは全てindex.jsからモジュール化したファイルを利用する方法になります。

単一の関数

単一の関数の場合にはmodule.exportsを使います。

exports.js
"use strict";

module.exports = () => {
    console.log("exec print1");
}
index.js
"use strict";

const export_function = require('./exports.js');
export_function(); // exec print1

単一のクラス

単一のクラスの場合もmodule.exportsを使います。

exports.js
"use strict";

class ExportClass {
    constructor() {
        console.log("ExportClass");
    }
}

module.exports = ExportClass;
index.js
"use strict";

const Exports = require('./exports.js');
const exportClass = new Exports(); // ExportClass

複数のエクスポート

複数の関数・複数のクラス・関数+クラスなどをモジュール化する場合にはexportsを使います。

exports.js
"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;
index.js
"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

分割代入

複数のプロパティがある場合は分割代入を使って直接プロパティ名で利用可能です。

index.js
"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のように代入による利用はできません。
下記は単一のクラスを指定した場合の例ですが、関数でも同様です。

exports.js
"use strict";

class ExportClassOne {
    constructor() {
        console.log("ExportClassOne");
    }
}

exports.ExportClassOne = ExportClassOne;
index.js

エラーとなる記述

"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つしか設定できません。また呼び出し側は分割代入できません。

関数の場合

putlogs.js
"use strict";

function putLog(no) {
    console.log(`no is ${no}`);
}

function putLog2() {
    putLog(2)
}

module.exports = putLog;
module.exports = putLog2;
index.js
"use strict";

const putLog = require('./putlogs.js');
putLog(1);  // no is 2

あとから設定したputLog2が有効になっています。

複数定義したい場合

module.exportsを使って複数定義したい場合は次のようにします。
なお、複数定義の場合はmodule.exportsよりexports.プロパティ名を利用する方が一般的なようです。

putlogs.js
"use strict";

function putLog(no) {
    console.log(`no is ${no}`);
}

function putLog2() {
    putLog(2)
}

module.exports = {
    putLog: putLog,
    putLog2: putLog2,
}
index.js
"use strict";

const putLog = require('./putlogs.js');
putLog.putLog(1);  // no is 1
putLog.putLog2();  // no is 2

この場合は分割代入も可能です。

index.js
"use strict";

const { putLog, putLog2 } = require('./putlogs.js');
putLog(1);  // no is 1
putLog2();  // no is 2

クラスの場合

putlogs.js
"use strict";

class LogClassOne {
    constructor() {
        console.log("LogClassOne");
    }
}

class LogClassTwo {
    constructor() {
        console.log("LogClassTwo");
    }
}

module.exports = LogClassOne;
module.exports = LogClassTwo;
index.js
"use strict";

const LogClass = require('./putlogs.js');
const logClass = new LogClass(); // LogClassTwo

複数定義したい場合

関数定義の場合と同じように複数定義することも可能です。分割代入も可能になります。

putlogs.js
"use strict";

class LogClassOne {
    constructor() {
        console.log("LogClassOne");
    }
}

class LogClassTwo {
    constructor() {
        console.log("LogClassTwo");
    }
}

module.exports = {
    ClassOne: LogClassOne,
    ClassTwo: LogClassTwo,
}
index.js
"use strict";

const putLog = require('./putlogs.js');
const logClass1 = new putLog.ClassOne(); // LogClassOne
const logClass2 = new putLog.ClassTwo(); // LogClassTwo
分割代入
index.js
"use strict";

const { ClassOne, ClassTwo } = require('./putlogs.js');
const logClass1 = new ClassOne(); // LogClassOne
const logClass2 = new ClassTwo(); // LogClassTwo
このエントリーをはてなブックマークに追加
にほんブログ村 IT技術ブログへ

コメント

メールアドレスが公開されることはありません。 が付いている欄は必須項目です