global変数を使用しないようにするには、どのようにしたらよろしいのでしょうか?
require越しに値を受け渡しする仕組みを作りましょう。
reuqire('./xxx.js');
で他のJSファイルを呼び出した場合、
まず呼び出し先のコードを上から下まで一度全て実行します。
その後、module.exports
の値をキャッシュとして保管するような設計になっています。
js
1// classes/Appli.js
2class Appli extends Base {
3 constructor(system) {
4 this._setUp(system);
5 // 状態を宣言
6 this.state = {};
7 }
8
9 _setUp(system) {
10 this.state.system = (system === CONST.Code) ? code : issue;
11 }
12
13 getPort() {
14 // 三項演算子の多重利用は多くのコーディング規約で禁止されている
15 // 下記のような早期リターンが綺麗な実装になりやすくおすすめ
16 if (this.state.system === CONST.Code) return env.PORT;
17 if (this.state.system === CONST.Issue) return env.PORT_ISSUE;
18 return null;
19 }
20}
21
22// クラスはインスタンスにした雛形かを問い合わせる目的としても使うので、
23// 関数に包まずそのままmodule.exportsに代入した方が良い。
24module.exports = Appli;
しかしAppliは単なるクラス(雛形)であり、
newでインスタンスを生成する度に新しいstateが作られてしまいます。
特定のstateを常に使いまわしたい場合、
インスタンスをmodule.exports
にキャッシュします。
これはオブジェクト指向プログラミングに置けるシングルトンのような使い方になります。
こんな感じでAppliクラスをnewして保存する専用のJSファイルも用意しておきましょう。
js
1// modules/appli.js
2const Appli = require('../class/Appli.js');
3
4// 引数を作ってmodule.exportsに保管しておく
5const arg = {};
6module.exports = new Appli(arg);
使いたい場面がきたらrequire('modules/appli.js')
という感じで呼び出すと、
生成したstateを内包したAppliのインスタンスをいつでも呼び出せます。