2013-05-11 65 views
7

我正在潛入NodeJS和Express(構建一個實時Web應用程序非常複雜)。目前,我試圖瞭解如何在服務器端使用現有的JavaScript庫。問題是庫似乎設計爲在客戶端運行,因此,這些指令僅向您顯示如何在客戶端使用它。我說的是可以在這裏找到該庫...如何在NodeJS應用程序的服務器端設計爲在客戶端上運行時使用JavaScript庫?

https://github.com/replit/jsrepl

問題:

  1. 由於網絡的NodeJS應用是建立在JavaScript中,是否公平地說,我可以運行任何服務器端的非gui 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 
    } 
}); 

感謝您的智慧!我正在盡力理解這一切。

+3

+1問題。有趣的庫 - 純JavaScript python,scheme和lua解釋器。這個庫只是尖叫着移植到node.js – slebetman 2013-10-25 03:38:59

回答

1
  1. 不。客戶端有些東西在服務器端沒有(反之亦然):例如DOM。
  2. 我自己從來沒有和jsrepl一起工作,但假設它是平臺不可知的,從節點模塊中加入它應該是可以的。但是,有問題的腳本中似乎還有一些特定於DOM的內容(例如document.getElementById),否則就會出現這種情況。
+1

是正確的。 jsrepl在當前編寫的節點環境中不起作用。也許這可能有所幫助,http://nodejs.org/api/repl.html。 – 2013-06-10 16:57:00

+0

@ThaddeusAlbers:jsrepl也可以直接執行coffeescript,scheme,lua和python,因此它不僅僅是一個簡單的REPL循環,就像節點核心中的一樣。 – slebetman 2013-10-25 03:36:56

2

您可以在Node中運行phantomjs,它是一個無頭webkit瀏覽器。然後在phantomjs中運行jsrepl。

8

所以這是可能的,但你需要一些嚴重的hackery爲了得到它的工作。由於這不是一個節點模塊,並且像其他人已經注意到的那樣從瀏覽器寫入,所以您需要在節點內部使用DOM來執行它。幸運的是,我們有美妙的jsdom項目,這讓我們可以做到這一點。所以讓我們來設置這個東西。

  • cd到您的節點項目(創建一個如果沒有的話)
  • 克隆下來jsrepl回購git clone git://github.com/replit/jsrepl.git
  • 光盤插入jsrepl並初始化子模塊git submodule update --init --recursive
  • 仍然在文件夾中,運行npm install coffee-scriptnpm install uglify-js,在回購(ugh)中沒有提到的依賴關係。
  • 確保安裝了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對象,該對象可以像在瀏覽器中一樣使用:)

相關問題