時計を壊せ

駆け出してからそこそこ経ったWebプログラマーの雑記

npmに上がっていないブラウザ向けに書かれたJavaScriptをnode.jsから雑に使うの術

ブラウザ向けに書かれた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