当前位置: 首页 > 面试题库 >

使用require.js和Java / Rhino解析模块

邹时铭
2023-03-14
问题内容

我正在尝试让require.js在Java 6和Rhino的服务器端加载模块。

我能够加载require.js本身就好。Rhino可以看到该require()功能。我之所以说是因为Rhino抱怨说,当我改成其他require()东西时,它找不到该功能requireffdkj()

但是当我尝试甚至需要一个简单的JS时,例如 hello.js

var hello = 'hello';

使用以下任一方法:

require('hello');
require('./hello');

它不起作用。我懂了

Caused by: javax.script.ScriptException: sun.org.mozilla.javascript.internal.JavaScriptException: [object Error] (<Unknown source>#31) in <Unknown source> at line number 31
    at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:153)
    at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:167)
    at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:247)

hello.js在Java类路径的顶部。那也是我的所在require.js。我尝试将移动到hello.js我认为可能会到的任何地方,包括硬盘驱动器的根目录,用户目录的根目录,运行Java应用程序的目录等,但没有任何效果。

我查看了CommonJS规范(http://wiki.commonjs.org/wiki/Modules/1.0),它说顶级ID(如hello)是从“概念模块名称空间根”解析的,而相对ID(即像./hello)针对调用模块进行解析。我不确定这两个基准在哪里,我怀疑这就是问题所在。

有什么建议?我什至可以使用Rhino的require.js吗?

编辑:
认为我需要根据以下注释中Pointy的建议设置环境,因此我也尝试进行评估r.js。(我尝试先进行评估require.js,然后再进行评估require.js。)在两种情况下,我都会遇到错误:

Caused by: javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "arguments" is not defined. (<Unknown source>#19) in <Unknown source> at line number 19
    at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:153)
    at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:167)
    at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:247)

“参数”似乎是中的变量r.js。我认为这是用于命令行参数的,所以我认为r.js这不是我尝试执行的正确方法。虽然不确定。


问题答案:

require.js在rhino上运行良好。最近,我在一个项目中使用了它。

  1. 您必须确保使用r.js(不是require.js),犀牛的require.js的修改版本。
  2. 您必须扩展ScritableObject类才能实现loadprint运行。调用时require(["a"]),将调用此类中的load函数,您可以调整此函数以从任何位置加载js文件。在以下示例中,我从加载classpath
  3. 您必须arguments在sharedscope中定义属性,如下面的示例代码所示
  4. (可选)您可以使用配置子路径require.config,以指定classpath内js文件所在的子目录。

JsRuntime支持

public class JsRuntimeSupport extends ScriptableObject {

    private static final long serialVersionUID = 1L;
    private static Logger logger = Logger.getLogger(JsRuntimeSupport.class);
    private static final boolean silent = false;

    @Override
    public String getClassName() {
        return "test";
    }

    public static void print(Context cx, Scriptable thisObj, Object[] args,
            Function funObj) {
      if (silent)
        return;
        for (int i = 0; i < args.length; i++)
          logger.info(Context.toString(args[i]));
    }

    public static void load(Context cx, Scriptable thisObj, Object[] args,
            Function funObj) throws FileNotFoundException, IOException {
        JsRuntimeSupport shell = (JsRuntimeSupport) getTopLevelScope(thisObj);
        for (int i = 0; i < args.length; i++) {
            logger.info("Loading file " + Context.toString(args[i]));
            shell.processSource(cx, Context.toString(args[i]));
        }
    }

    private void processSource(Context cx, String filename)
            throws FileNotFoundException, IOException {
        cx.evaluateReader(this, new InputStreamReader(getInputStream(filename)), filename, 1, null);
    }

    private InputStream getInputStream(String file) throws IOException {
        return new ClassPathResource(file).getInputStream();
    }
}

样例代码

public class RJsDemo {

    @Test
    public void simpleRhinoTest() throws FileNotFoundException, IOException {
    Context cx = Context.enter();

    final JsRuntimeSupport browserSupport = new JsRuntimeSupport();

    final ScriptableObject sharedScope = cx.initStandardObjects(browserSupport, true);

    String[] names = { "print", "load" };
    sharedScope.defineFunctionProperties(names, sharedScope.getClass(), ScriptableObject.DONTENUM);

    Scriptable argsObj = cx.newArray(sharedScope, new Object[] {});
    sharedScope.defineProperty("arguments", argsObj, ScriptableObject.DONTENUM);

    cx.evaluateReader(sharedScope, new FileReader("./r.js"), "require", 1, null);
    cx.evaluateReader(sharedScope, new FileReader("./loader.js"), "loader", 1, null);

    Context.exit();

  }

}

loader.js

require.config({
    baseUrl: "js/app"
});

require (["a", "b"], function(a,  b) {
    print('modules loaded');
});

js/app 目录应该在您的类路径中。



 类似资料:
  • 问题内容: 我正在使用JDK的javax.script。*包。具体来说,我使用的是JavaScript引擎,据我所读,它似乎是基于Mozilla开发的名为Rhino的JavaScript- in-Java解释器。 我希望完成的工作基本上是使我的JavaScript能够在代码中的某个点“暂停”自身(例如,在函数调用的一半),并且只有在Java允许的情况下稍后才能自我恢复。 为了说明我的意思,请想象以

  • 本文向大家介绍require.js的用法详解,包括了require.js的用法详解的使用技巧和注意事项,需要的朋友参考一下 一、为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了。后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载。下面的网页代码,相信很多人都见过。 这段代码依次加载多个js文件。 这样的写法有很大的缺

  • 本文向大家介绍require.js深入了解 require.js特性介绍,包括了require.js深入了解 require.js特性介绍的使用技巧和注意事项,需要的朋友参考一下 现在,Require.js是我最喜欢的Javascript编程方式。它可以使代码化整为零,并易于管理。而Require.js Optimizer能帮助我们将一个较大的应用分散成多个较小的应用,并通过依赖串联起来,最后在编

  • 本文向大家介绍基于require.js的使用(实例讲解),包括了基于require.js的使用(实例讲解)的使用技巧和注意事项,需要的朋友参考一下 本篇文章总结下require.js使用方法。 1.为什么使用require.js? 使用之前,我的页面的js是这样的 由于这些js代码一般都写在模板中,因此不管我的页面如何简单,用不用的到这么多js,这些js都会加载,而我们大家都知道,加载js时页面会

  • 我有一个数据库操作对象作为我的UUT(被测试单元)的依赖项。因此,我希望将其作为严格的mock,因为我还希望确保UUT不调用任何其他可以导致db更改的方法。 在rhino mocks中,我做了以下操作: 我从db对象创建了一个strictmock 我在安排中创建了.expect子句 我在assert中调用了VerifyAllExpectations 然而,当我想在FakeItEasy中这样做时,却

  • 本文向大家介绍Require.js的基本用法详解,包括了Require.js的基本用法详解的使用技巧和注意事项,需要的朋友参考一下 一:什么是require.js ①:require.js是一个js脚本加载器,它遵循AMD(Asynchronous Module Definition)规范,实现js脚本的异步加载,不阻塞页面的渲染和其后的脚本的执行,并提供了在加载完成之后的执行相应回调函数的功能;