Как я могу использовать библиотеку javascript на стороне сервера приложения NodeJS, если оно предназначено для работы на клиенте?

Я погружаюсь в NodeJS и Express (это ооочень сложно для меня), чтобы создать веб-приложение в реальном времени. На данный момент я пытаюсь понять, как я могу использовать существующую библиотеку javascript на стороне сервера. Проблема в том, что библиотека предназначена для работы на стороне клиента, и в результате инструкции только показывают, как использовать ее на стороне клиента. Библиотеку, о которой я говорю, можно найти здесь...

https://github.com/replit/jsrepl

Вопросы:

  1. Поскольку веб-приложение NodeJS построено на javascript, справедливо ли сказать, что я могу запустить любую библиотеку javascript, не связанную с графическим интерфейсом, на стороне сервера?
  2. Может ли кто-нибудь предложить некоторые рекомендации о том, как я могу добавить эту библиотеку jsrepl в свое приложение Express 3.0 таким образом, чтобы я мог использовать ее так же, как я использовал бы ее на стороне клиента в браузере? Должен ли я изменить код jsrepl и добавить «экспорт». к методам, которые я хочу использовать?

Это означает, что на стороне сервера я могу выполнить следующий код...

var jsrepl = new JSREPL({  
  input: inputCallback,  
  output: outputCallback,  
  result: resultCallback,  
  error: errorCallback,  
  progress: progressCallback,  
  timeout: {  
    time: 30000,  
    callback: timeoutCallback  
  }  
});  

Заранее спасибо за всю вашу мудрость! Я делаю все возможное, чтобы понять все это.


person BeachRunnerFred    schedule 11.05.2013    source источник
comment
+1 вопрос. Интересная библиотека - чистый javascript python, интерпретатор схемы и lua. Эта библиотека просто кричит, чтобы ее портировали на node.js.   -  person slebetman    schedule 25.10.2013


Ответы (3)


Так что это возможно, но вам нужен серьезный хакер, чтобы заставить его работать. Поскольку это не модуль узла и записывается из браузера, как отмечали другие, вам нужен DOM внутри узла для его выполнения. К счастью, у нас есть замечательный проект jsdom, который позволяет нам это сделать. Итак, давайте настроим эту штуку.

  • cd в свой проект узла (создайте его, если его еще нет)
  • клонировать репозиторий jsrepl git clone git://github.com/replit/jsrepl.git
  • cd в jsrepl и инициализировать подмодули git submodule update --init --recursive
  • все еще в папке, запустите npm install coffee-script и npm install uglify-js, зависимости, которые нигде не упоминаются в репо (тьфу).
  • убедитесь, что установлена ​​Java, и запустите cake bake. После длительного процесса компиляции java-файлов команда завершится, и jsrepl будет собран и готов к работе.
  • запустить npm install jsdom, тогда мы можем начать писать пример файла

Вот минимальный пример:

var jsdom = require('jsdom'),
    fs = require('fs'),
    jsrepl = fs.readFileSync('./jsrepl/repl.js', 'utf8');

jsdom.env({
  html: "<script src='jsrepl.js' id='jsrepl-script'></script> ",
  src: [jsrepl],
  done: function(err, window){
    if (err) return console.error(err);
    run_jsrepl.call(window);
  }
});

function run_jsrepl(){
  console.log(this.JSREPL)
}

Вот минимальный объем кода, необходимый для того, чтобы JSREPL заработало. Все, что мы здесь делаем, это требуем jsdom и создаем его экземпляр, считывая исходный код jsrepl прямо из файла. Если вы запустите этот файл с node filename, он выйдет из вашего объекта JSREPL, который можно использовать так же, как в браузере :)

person Jeff Escalante    schedule 25.10.2013

Вы можете запустить phantomjs в Node, который представляет собой безголовый веб-браузер. Затем запустите jsrepl внутри phantomjs.

person Dan Kohn    schedule 22.10.2013

  1. Нет. На стороне клиента есть вещи, которых нет на стороне сервера (и наоборот): например, DOM.
  2. Я никогда не работал с jsrepl сам, но предполагая, что он не зависит от платформы, require() из модуля узла должно быть нормально. Тем не менее, кажется, что в рассматриваемых скриптах есть некоторые специфичные для DOM вещи (например, document.getElementById), которые предполагают обратное.
person ubik    schedule 11.05.2013
comment
правильно. jsrepl не будет работать в среде узла, как написано в настоящее время. Возможно, это может помочь, nodejs.org/api/repl.html. - person Thaddeus Albers; 10.06.2013
comment
@ThaddeusAlbers: jsrepl также может напрямую выполнять coffeescript, схемы, lua и python, так что это не просто простой цикл REPL, как в ядре узла. - person slebetman; 25.10.2013