解决使用require.js和Java /犀牛模块(Resolving modules using

2019-06-25 14:05发布

我试图让require.js加载在服务器端模块与Java 6和犀牛。

我能够加载require.js本身就好了。 犀牛可以看到require()函数。 我可以告诉大家,因为犀牛抱怨说,它无法找到该功能时我改变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 )是针对通话模块解决。 我不知道在哪里无论这些基线的是,我怀疑这是个问题。

有什么建议? 我甚至可以用require.js从犀牛?

编辑:思考,我需要在评论中设置的环境了按尖尖的建议之下,我试图评估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是什么,我试图做正确的道路。 虽然不能肯定。

Answer 1:

require.js犀牛效果很好。 最近,我用它在一个项目。

  1. 你必须确保使用r.js (不require.js),改性require.js犀牛的版本。
  2. 你必须扩展ScritableObject类来实现loadprint功能。 当你调用require(["a"])在这个类加载函数将被调用,您可以调整该功能能够从任何位置加载的js文件。 在下面的例子中,我从加载classpath
  3. 你必须定义属性arguments在sharedscope如示例代码如下所示
  4. 或者,您可以使用配置子路径require.config ,指定内部类路径的子目录,其中的js文件的位置。

JsRuntimeSupport

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目录应该在你的classpath中。



文章来源: Resolving modules using require.js and Java/Rhino