2013-05-11 2 views
7

Mi sto immergendo in NodeJS ed Express (è davvero complicato per me) creare un'app web in tempo reale. Al momento, sto cercando di capire come utilizzare una libreria javascript esistente sul lato server. Il problema è che la libreria sembra essere progettata per funzionare sul lato client e, di conseguenza, le istruzioni mostrano solo come usarlo sul lato client. La biblioteca di cui sto parlando si possono trovare qui ...Come posso utilizzare una libreria javascript sul lato server di un'app NodeJS quando è stata progettata per essere eseguita sul client?

https://github.com/replit/jsrepl

Domande:

  1. Dal momento che una web app NodeJS è costruito su javascript, è giusto dire che posso eseguire qualsiasi libreria javascript non gui sul lato server?
  2. Qualcuno può offrire indicazioni su come aggiungere la libreria jsrepl alla mia app Express 3.0 in un modo che mi consenta di utilizzarla nello stesso modo in cui la userei sul lato client in un browser? Devo modificare il codice jsrepl e aggiungere "esportazioni". ai metodi che voglio usare?

Significato, sul lato server, posso eseguire il codice seguente ...

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

Grazie in anticipo per tutta la tua saggezza! Sto facendo del mio meglio per capire tutto questo.

+3

+1 domanda. Libreria interessante - python javascript puro, schema e interprete lua. Questa libreria è semplicemente urlata per essere trasferita su node.js – slebetman

risposta

1
  1. No. Sul lato client ci sono cose che non si hanno sul lato server (e viceversa): ad esempio, il DOM.
  2. Non ho mai lavorato con me jsrepl, ma supponendo che sia indipendente dalla piattaforma, require() da un modulo nodo dovrebbe essere OK. Tuttavia, sembra che ci siano alcune cose specifiche del DOM negli script in questione (ad esempio document.getElementById) che suggeriscono il contrario.
+1

è corretta. jsrepl non funzionerà in un ambiente nodo come attualmente scritto. Forse questo può aiutare, http://nodejs.org/api/repl.html. –

+0

@ThaddeusAlbers: jsrepl è anche in grado di eseguire direttamente coffeescript, scheme, lua e python quindi non è solo un semplice loop REPL come quello nel nodo core. – slebetman

2

È possibile eseguire phantomjs nel nodo, che è un browser Webkit senza testa. Quindi esegui jsrepl all'interno di phantomjs.

8

Quindi questo è possibile, ma è necessario un po 'di hacker per farlo funzionare. Poiché questo non è un modulo nodo e viene scritto dal browser come altri hanno notato, è necessario un DOM all'interno del nodo per eseguirlo. Fortunatamente, abbiamo il meraviglioso progetto jsdom che ci consente di fare proprio questo. Quindi sistemiamo questa cosa.

  • cd nel progetto del nodo (crearne uno se non ce n'è uno già)
  • clone giù il repo jsrepl git clone git://github.com/replit/jsrepl.git
  • cd nella jsrepl e inizializzare sottomoduli git submodule update --init --recursive
  • ancora nella cartella, corrono npm install coffee-script e npm install uglify-js, dipendenze che non sono menzionate da nessuna parte nel repository (ugh).
  • assicurarsi che java sia installato ed eseguito cake bake. Dopo un lungo processo di compilazione dei file java e tale comando verrà terminato e jsrepl sarà costruito e pronto per l'uso.
  • corsa npm install jsdom, allora possiamo iniziare a scrivere un file di esempio

Ecco un esempio minimo:

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) 
} 

Ecco la quantità minima di codice necessario per ottenere JSREPL in un luogo in cui si sta lavorando. Tutto quello che stiamo facendo qui richiede jsdom e istanziazione, leggendo nella sorgente jsrepl direttamente dal file. Se esegui questo file con node filename, verrà disconnesso l'oggetto JSREPL, che può essere utilizzato proprio come nel browser:)