YOS G-specの適当なブログ
ゲームやネットが大好きな人のブログ。毎日更新を目指してました。
2017年10月28日 (土) 01:52 | 編集
意外に探してもそういうモジュールが見つからなかったので自分で書いた。

例えばmod.jsが次のようにあったとする。

module.exports={
x2:x=>x*2
};

そしてmain.jsからこのモジュールを呼ぶときは次のように記述する。

const mod=require("./mod");

console.log(mod.x2(50));
// ->100


これをただくっつけたら不自然なrequireが残る。
アクセスできなくなるとプログラムそのものが動かなくなる。

そこで今回書いたプログラムで変換すると次のようなプログラムとなる。

const mod=((/*./mod*/)=>{var $__module={};
$__module={
x2:x=>x*2
};
return $__module;})();

console.log(mod.x2(50));
// ->100

インデントはぐちゃぐちゃになるけど気にしない。
仕組みはrequire関数の部分をfunctionで包んで対応するソースを置換するだけ。
巨大なプログラムになるとどうなるかわからないけど、ある程度簡単なプログラムなら動いてくれるはず。

以下実装。

"use strict";
const fs=require("fs");
const readFile=path=>new Promise((res,rej)=>fs.readFile(path,"utf8",(e,v)=>e==null? res(v): rej(e)));
const writeFile=(path,text)=>new Promise((res,rej)=>fs.writeFile(path,text,e=>e==null? res(): rej(e)));

(async function(mainPath=process.argv[2]){
var mainMod=await readFile(mainPath);
var mainList=mainMod.split(/[\"\']/);

for(var i=0,n=mainList.length;i if(-1!=mainList[i].indexOf("require")
&& -1!=mainList[i+1].indexOf("/")
){
var reqPath=mainList[i+1];
var reqMod=`((/*${reqPath}*/)=>{var $__module={};
${
(await readFile(-1!=reqPath.indexOf(".js")? reqPath: reqPath+".js"))
.replace(/module\.exports/g,"$__module")
}
return $__module;})()`;
mainMod=mainMod.replace(RegExp(`require\\("${reqPath}"\\)`,"g"),reqMod);
break;
}
}
await writeFile(mainPath.replace(/\.js$/,".min.js"),mainMod);
console.log("module concat done.");
})();

名前はmodule+concat=modcatでいいか。
使う人がいるのかはわからないけど、呼び出しはコマンドラインから

C:\> node modcat.js main.js

で大丈夫なはず。
minしてないけどこの場合名前はmain.min.jsで出力される。
Template by 【投資信託のことなら】投信Web /

Powered by .