MOTIVATION
Babel est un transcompilateur qui traduit la dernière syntaxe ECMAScript (classes, lambdas, const
, let
, etc.) afin qu'il puisse être exécuté dans des environnements JS plus anciens. Par exemple, React convertit la source ECMA2015 + JSX en JS qui peut être interprétée par Babel dans les navigateurs courants.
J'avais une entreprise à utiliser React, et je voulais préparer un serveur API avec Finagle ou Akka, auquel je suis habitué, et je voulais que Node / React et JavaVM coexistent bien en premier lieu. Si Babel peut générer un JS exécutable par navigateur, je me demande si ES2015 peut être utilisé avec Nashorn, une API Java Scripting ou la bibliothèque Node.js peut être utilisée.
CONCLUSION
D'abord de la conclusion.
Il est possible de transcompiler JS écrit en ES2015 avec Babel et de l'exécuter dans Nashorn. Pourtant:
Strict. La raison en est la suivante.
prend ** 30 secondes **. Ventilateur CPU grognant. Eh bien, côté serveur, etc., il peut être bon de mettre en cache le
ScriptEngine` préparé.require ()
, donc ** les bibliothèques externes ne peuvent pas être utilisées **. Il semble également nécessaire d'utiliser webpack. Alternativement, il peut être possible de l'éviter en implémentant la fonction équivalente en Java et en la passant dans les liaisons.npm
est supposé dans les paramètres d'environnement en premier lieu, il existe un moyen de démarrer babel directement sans utiliser Nashorn (et c'est plus rapide).Par conséquent, il est préférable d'utiliser l'environnement d'exécution node
ou npm
dansRuntime.exec ()
que d'utiliser Nashorn.
PLAN
La procédure que j'ai exécutée avec un tel plan.
J'ai des préréglages es2015 installés avec npm (mais je ne sais pas si j'en avais vraiment besoin).
$ npm init
$ npm install babel-cli babel-preset-es2015 --save
Installation de babel-standalone Obtenez babel.js
sur la page de publication (https://github.com/babel/babel-standalone/releases) ou npm comme dans / babel-standalone # installation).
final ScriptEngineManager manager = new ScriptEngineManager();
final ScriptEngine babel = manager.getEngineByName("JavaScript");
final String babelJS = "babel.js";
babel.put(ScriptEngine.FILENAME, babelJS);
try(Reader in = new FileReader(babelJS)){
babel.eval(in);
}
Ce babel.eval (in)
prend environ 30 secondes. De plus, si vous utilisez babel.min.js
, une exception se produira, alors utilisez babel.js
.
javax.script.ScriptException: SyntaxError: empty range in char class in babel.min.js at line number 4
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.throwAsScriptException(Unknown Source)
...
Caused by: babel.min.js:4 SyntaxError: empty range in char class
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ECMAErrors.error(Unknown Source)
...
Caused by: jdk.nashorn.internal.runtime.ParserException: empty range in char class
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.regexp.RegExp.throwParserException(Unknown Source)
...
final String es2015JS = "es2015.js";
final String es2015 = new String(Files.readAllBytes(Paths.get(es2015JS)), StandardCharsets.UTF_8);
babel.put(ScriptEngine.FILENAME, "<transcompile>");
babel.put("src", es2015);
babel.put("a", new Object[3]);
final Object[] result = (Object[])babel.eval(
"var r = Babel.transform(src, {presets:['es2015']});\n" +
"a[0] = r.code;\n" +
"a[1] = r.map;\n" +
"a[2] = r.ast;\n" +
"a"
);
System.out.println(result[0]);
Babel.transformFileSync
n'était pas défini pour une raison quelconque. Parce que vous utilisez des arguments dans la fonction?
Pour le moment, lisez une fois la source ES2015, transform
et stockez le résultat dans le tampon de retour. À l'intérieur de es2015.js se trouve:
// run `npm install kuromoji` before
import kuromoji from "kuromoji"
kuromoji.builder({ dicPath: "./node_modules/kuromoji/dict" }).build((err, tokenizer) => {
var path = tokenizer.tokenize("Des cuisses et des cuisses")
console.log(path)
})
La transcompilation sur Nashorn a généré la source suivante:
"use strict";
var _kuromoji = require("kuromoji");
var _kuromoji2 = _interopRequireDefault(_kuromoji);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
_kuromoji2.default.builder({ dicPath: "./node_modules/kuromoji/dict" }).build(function (err, tokenizer) {
var path = tokenizer.tokenize("Des cuisses et des cuisses");
console.log(path);
}); // run `npm install kuromoji` before
Le résultat de la transcompilation avec Babel est exactement le même.
$ node_modules/.bin/babel --presets=es2015 es2015.js
Exécute le code transcompilé séparément de Babel dans le moteur de script.
final ScriptEngine engine = manager.getEngineByName("JavaScript");
engine.put(ScriptEngine.FILENAME, es2015JS);
engine.eval(result[0].toString());
Mais je ne peux pas le faire car j'utilise require ()
: frowning2:
javax.script.ScriptException: ReferenceError: "require" is not defined in es2015.js at line number 3
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.throwAsScriptException(Unknown Source)
...
Oshimashi
Recommended Posts