コメントありがとうございます。 サービス終了した今なら、安く中古が手に入りそ…
JavaScriptでモジュール化してみた
JavaScriptのファイルが500行を超えてきて
見るのすら嫌になってきたのでモジュール化してみた。
今回重要視したのはこれ
- HTMLのHEADで読み込むのではなく、JavaScript内で外部ファイルを指定したい
- 後から読み込んだJavaScriptが全て読み込まれるまで待ってから処理したい
- 即時関数を使用してローカルスコープにする
本来なら匿名関数に放りこんでいるが、今回は変数に代入した
/************************************************************ * 外部JavaScriptを非同期に読み込む * すべてのファイルを読み込み終えてからCALLBACKが実行される * * 使い方 * _import(URLS, CALLBACK); * * パラメーター * URLS * (文字列)|(配列)外部JavaScriptのパス * CALLBACK * (関数)読み込んだJavaScript * URLSが複数の場合、配列で返ってくる * *************************************************************/ let _import = function(urls, callback){ let promise = function(url){ return new Promise(function(resolve, reject){ fetch(url).then(function(response){ if(!response.ok) throw new Error(); return response.text(); }).then(function(text){ resolve(eval(text)); }).catch(function(reason){ reject(reason); }); }); }; if(typeof(urls) === "string") promise(urls).then(function(result){ callback(result); }); else{ let tasks = []; for(let i=0, len=urls.length; i<len; i++) tasks.push(promise(urls[i])); Promise.all(tasks).then(function(result){ callback(result); }); }; };
読み込みたい外部ファイルの例
module.js
(function(){ return{ 'set' : function(string){ this.var = string; }, 'get' : function(){ console.log(this.var); }, } })();
使い方:読み込みたい外部ファイルが単数の場合
_import('./module.js', function(single){ single.get(); /* undefined */ single.set('hoge'); single.get(); /* hoge */ });
使い方:読み込みたい外部ファイルが複数の場合
_import(['./module.js','./module.js'], function(multi){ let A = multi[0]; let B = multi[1]; A.get(); /* undefined */ A.set('foo'); A.get(); /* foo */ B.get(); /* undefined */ B.set('bar'); B.get(); /* bar */ });
検索
コメントを残す