当 NodeJS 应用程序设计为在客户端上运行时,如何在服务器端使用 javascript 库?

问题描述 投票:0回答:4

我正在深入研究 NodeJS 和 Express(这对我来说太复杂了)来构建一个实时 Web 应用程序。目前,我正在尝试了解如何在服务器端使用现有的 javascript 库。问题是该库似乎被设计为在客户端运行,因此,说明仅向您展示如何在客户端使用它。我正在谈论的图书馆可以在这里找到......

https://github.com/replit/jsrepl

问题:

  1. 既然 NodeJS Web 应用程序是基于 javascript 构建的,那么可以公平地说我可以在服务器端运行任何非 gui javascript 库吗?
  2. 任何人都可以提供一些指导,告诉我如何将 jsrepl 库添加到我的 Express 3.0 应用程序中,让我能够像在浏览器客户端中使用它一样使用它吗?我是否必须修改 jsrepl 代码并添加“exports.”我想使用的方法?

意思是,在服务器端,我可以执行以下代码...

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

预先感谢您的智慧!我正在尽力理解这一切。

javascript node.js express read-eval-print-loop
4个回答
9
投票

所以这是可能的,但是你需要一些认真的黑客才能让它工作。由于这不是一个节点模块并且是从浏览器编写的,正如其他人所指出的,因此您需要节点内的 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
对象,该对象可以像在浏览器中一样使用: )


2
投票

您可以在 Node 中运行 phantomjs,这是一个无头 webkit 浏览器。然后在 phantomjs 中运行 jsrepl。


1
投票
  1. 不。客户端上有一些服务器端没有的东西(反之亦然):例如 DOM。
  2. 我自己从未使用过
    jsrepl
    ,但假设它与平台无关,从节点模块
    require()
    应该没问题。然而,相关脚本中似乎有一些特定于 DOM 的内容(例如
    document.getElementById
    )表明并非如此。

0
投票

你可以使用jsdom。


const { window } = new JSDOM('');
const { document, navigator } = window;

global.window = window;
global.document = document;
global.navigator = navigator;

查看此博客以了解其工作原理博客

© www.soinside.com 2019 - 2024. All rights reserved.