Эквивалент Руби "требуют" в Javascript - PullRequest
3 голосов
/ 22 октября 2010

Как вам «требуется» другой файл в существующий файл в Javascript? Есть ли что-нибудь похожее на Ruby "require" или "load"?

> Примечание: я использую JS на сервере (Rhino)

Причина: мне просто нужно получить доступ к методам в других файлах JS.

Обновление: Это работает только при выполнении из строки cmd. Когда я пытаюсь назвать это программно, это терпит неудачу. Вот мой код: http://pastie.org/1240495

Ответы [ 2 ]

3 голосов
/ 25 октября 2010

Чтобы использовать функцию загрузки в js, встроенную из Java, вы должны сначала представить ее в контексте сценария. Вероятно, есть способ сделать это из Java, но вы можете сделать это и с помощью js.

Отказ от ответственности: это решение использует исходный код, взятый из лицензированного Apache проекта, над которым я работал. Вы можете увидеть исходный файл здесь .

Этот файл js устанавливает ваши глобальные переменные и находится в файле с именем setupglobals.js:

var shell = org.mozilla.javascript.tools.shell.Main;
var args = ["-e","var a='STRING';"];
shell.exec(args);

var shellGlobal = shell.global;

//grab functions from shell global and place in current global
load=shellGlobal.load;
print=shellGlobal.print;
defineClass=shellGlobal.defineClass;
deserialize=shellGlobal.deserialize;
doctest=shellGlobal.doctest;
gc=shellGlobal.gc;
help=shellGlobal.help;
loadClass=shellGlobal.loadClass;
quit=shellGlobal.quit;
readFile=shellGlobal.readFile;
readUrl=shellGlobal.readUrl;
runCommand=shellGlobal.runCommand;
seal=shellGlobal.seal;
serialize=shellGlobal.serialize;
spawn=shellGlobal.spawn;
sync=shellGlobal.sync;
toint32=shellGlobal.toint32;
version=shellGlobal.version;
environment=shellGlobal.environment;

Вот ваш исходный файл хоста Java, теперь дополненный для оценки setupglobals.js перед любыми другими скриптами:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import org.mozilla.javascript.*;

public class RhinoRunner {
    public static void main(String args[]) throws IOException 
    {
        BufferedReader script = new BufferedReader(new FileReader("setupglobals.js"));
        BufferedReader script2 = new BufferedReader(new FileReader("example.js"));
        Context context = Context.enter();
        try {
            ScriptableObject scope = context.initStandardObjects();
            context.evaluateReader(scope, script, "script", 1, null);
            context.evaluateReader(scope, script2, "script2", 1, null);
            Function fct = (Function)scope.get("abc", scope);
            Object result = fct.call(context, scope, scope, new Object[] {2, 3});
            System.out.println(Context.jsToJava(result, int.class));
        } 
        finally 
        {
            Context.exit();
        }
    }
}

Вот ваш example.js, теперь дополненный функцией глобальной загрузки для загрузки файла hello.js:

function abc(x,y) 
{
    return x+y 
}

load("hello.js")

И, наконец, вот hello.js:

print("hello world!")

При выполнении RhinoRunner печатает следующее:

hello world!
5
2 голосов
/ 22 октября 2010

В оболочке Rhino вы можете использовать load(), который является предопределенным глобальным методом:

load([filename, ...])

Загрузите исходные файлы JavaScript, названные строковыми аргументами. Если задано несколько аргументов, каждый файл читается и исполняется по очереди.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...