ブラウザ向けに書かれたJavaScriptだと、windowに対してexportしていて、nodeから使いにくくて困ることがある。 nodeでも動くようなpatchを書けばいいという話ではあるが、githubにコードが上がっていないとやりにくくてつらい。
そこで、適当なObjectをcontextにして、vmでぶん回すことで、雑に解決することができた。
以下はGeoHexというライブラリのJavaScriptの実装がwindow.GEOHEX
にエクスポートする実装であったために困ったので雑に解決した例。
"use strict"; var http = require('http'); var co = require('co'); var get = function (url) { return new Promise(function (resolve, error) { http.get(url, function (res) { res.setEncoding('utf8'); var buf = ""; res.on('data', function (chunk) { buf += chunk; }); res.on('end', function (chunk) { resolve(buf); }); }).on('error', error); }); }; var getGeoHex = co(function *() { var window = {}; var vm = require('vm'); vm.createContext(window); var body = yield get("http://geohex.net/src/script/hex_v3.2_core.js"); vm.runInContext(body, window); return window.GEOHEX; });
getGeoHexを、以下のようにyieldしてやるといいかんじにwindow.GEOHEXが取得できていることがわかる。
co(function *() { var GEOHEX = yield getGeoHex; cosole.log(GEOHEX); });
雑だけど問題は解決できた。べんり。
このへんで使った: c-geohex3/dump.js at master · karupanerura/c-geohex3 · GitHub