最終更新日 2024-09-25

jsmode - requireで読み込まれた.jsのパス

読み込まれた側の.js自身のパスを得る

読み込まれた側の.js自身から、その「.js」ファイルの場所を起点に別のファイル(.dllや.JSONや.txt)などを開く場合、
読み込まれた側の.jsファイルは、プログラム実行時に「自分自身のファイルが配置されている場所」を知る必要性があります。

abc.mac から abc.jsを読み込む
execjs macrodir + @"\jsmode_modules\require.js";
js {
    var myabc = require("abc");
}
        
abc.js
hidemaruGlobal.message(__filename);
hidemaruGlobal.message(__dirname);

var jsonobj = require(__dirname + "\\bbb.json"); // 自分自身(=abc.js)と同じディレクトリのbbb.json の読み込み

var dll = loadDll(__dirname + "\\bbb.dll");; // 自分自身(=abc.js)と同じディレクトリのbbb.dll の読み込み

        

requireではなく、execjsで読み込まれている場合

bbb.js
// execjsで読み込まれていたら、{__filename,__dirname}のそれぞれのプロパティに有効な値が入る
function get_including_by_execjs() {
    var cjf = hidemaruGlobal.currentjsfilename();
    var cmf = hidemaruGlobal.currentmacrofilename();
    if (cjf != cmf) {
        var dir = cjf.replace(/[\/\\][^\/\\]+?$/, "");
        return {
            "__filename": cjf,
            "__dirname": dir
        };
    }
    return {};
}

// execjs による読み込み&実行中かどうか
function is_executing_by_execjs() {
    var cjf = hidemaruGlobal.currentjsfilename();
    var cmf = hidemaruGlobal.currentmacrofilename();
    if (cjf != cmf) {
        return true;
    } else {
        return false;
    }
}

debuginfo(2);
var selfpathobj = get_including_by_execjs();
console.log(selfpathobj.__filename);
console.log(selfpathobj.__dirname);

// execjsによる読み込みと実行が終わった後で、このabc()関数が呼ばれたとしても
// この関数内のget_including_by_execjs()はパスを返さないので注意。
function abc() {
    var path = get_including_by_execjs(); // is_executing_by_execjs() が falseならば、get_including_by_execjs()は{}を返す
    debuginfo(2);
    console.log(is_executing_by_execjs());
}

abc(); // これはtrueと表示される。しかし、execjsが終わった後、abc()を実行してもfalseと表示される。
        
abc.mac
jsmode "JScript", 1;

execjs currentmacrodirectory + "\\bbb.js";
js{
    abc(); // これはfalseが表示される
}