Rhino 1.7R4 Support CommonJS

Here are some testing about whether Rhino 1.7R4 support CommonJS. The answer is YES!
Tips: Two APIs provided by Rhino could load the JavaScript file, compileReader and evaluateReader.
Differences: compileReader will load JavaScript file without executed and return a Script object. You have to executed the Script object before you get the result.
                   evaluateReader will automatically execute JavaScript file after loading.

library.js

var require = (function() {
 
    var exportsObjects = {};
 
    var require = function(name) {
        if (exportsObjects.hasOwnProperty(name)) {
        return exportsObjects[name];
    }
    var exports = {};
    exportsObjects[name] = exports;
    modules[name](require, exports);
    return exports;
};
 
    return require;
})();
 
var run = function(name) {
    require(name);
};
 
var modules = {};

math.js

modules["math"] = function(require, exports) {
   exports.add = function() {
       var sum = 0, i = 0, args = arguments, l = args.length;
       while (i < l) {
           sum += args[i++];
       }
       return sum;
   };
};

increment.js

modules["increment"] = function(require, exports) {
    var add = require('math').add;
    exports.increment = function(val) {
    return add(val, 1);
    };
};

program.js

modules["program"] = function(require, exports) {
    var inc = require('increment').increment;
    exports.pro = function() {
        return inc(1998);
    }
};

Compile Test

/**
 * compileReader compiles the source in the given reader and returns a
 * script that may later be executed. Will consume all the source in the reader.
 * @throws FileNotFoundException
 * @throws IOException
 */
public void compileTest() throws FileNotFoundException, IOException {
    Context cx = Context.enter();
    final ScriptableObject scope = cx.initStandardObjects();
    Script scLibrary = cx.compileReader(new FileReader("library.js"), "library", 1, null);
    Script scMath = cx.compileReader(new FileReader("math.js"), "math", 1, null);
    Script scIncrement = cx.compileReader(new FileReader("increment.js"), "increment", 1, null);
    Script scProgram = cx.compileReader(new FileReader("program.js"), "program", 1, null);
    String js = "var pro = require('program').pro; pro();";
    Script sc = cx.compileString(js, "js", 1, null);
    scLibrary.exec(cx, scope);
    scMath.exec(cx, scope);
    scIncrement.exec(cx, scope);
    scProgram.exec(cx, scope);
    Object result = sc.exec(cx, scope);
    System.out.println(Context.toString(result));
 
    Context.exit();
}

Evaluate Test

/**
 * Evaluate a reader as JavaScript source. All characters of the reader are consumed.
 * @throws FileNotFoundException
 * @throws IOException
 */
    public void evaluateTest() throws FileNotFoundException, IOException {
    Context cx = Context.enter();
    final ScriptableObject scope = cx.initStandardObjects();
    cx.evaluateReader(scope, new FileReader("library.js"), "library", 1, null);
    cx.evaluateReader(scope, new FileReader("math.js"), "math", 1, null);
    cx.evaluateReader(scope, new FileReader("increment.js"), "increment", 1, null);
    cx.evaluateReader(scope, new FileReader("program.js"), "program", 1, null);
    String js = "var pro = require('program').pro; pro();";
 
    Object result = cx.evaluateString(scope, js, "js", 1, null);
    System.out.println(Context.toString(result));
 
    Context.exit();
}

Comments

Popular posts from this blog

CEF Python