Je veux aussi utiliser ES2015 avec Java! → (´ ・ ω ・ `)

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.

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

1. Préparation de babel.js

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)
...

2. Effectuer la transcompilation

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

3. Exécution de code transcompilé

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

Je veux aussi utiliser ES2015 avec Java! → (´ ・ ω ・ `)
Je veux utiliser @Autowired dans Servlet
Je souhaite envoyer un e-mail en Java.
Je veux utiliser java8 forEach avec index
rsync4j --Je veux toucher rsync en Java.
[Java Spring MVC] Je souhaite utiliser DI dans ma propre classe
Je souhaite également utiliser Combine dans UIKit.
Je veux faire quelque chose comme "cls" en Java
Je veux utiliser une petite icône dans Rails
Comment utiliser les classes en Java?
Je souhaite utiliser l'API Java 8 DateTime lentement (maintenant)
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3
Je souhaite simplifier l'instruction if-else de la branche conditionnelle en Java
Prise en charge multilingue de Java Comment utiliser les paramètres régionaux
Je souhaite utiliser DBViewer avec Eclipse 2018-12! !!
J'ai essayé de configurer les débutants Java pour qu'ils utilisent des touches de raccourci dans eclipse
Je veux arrêter complètement les mises à jour Java
[Java] Je veux effectuer distinctement avec la clé dans l'objet
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3 (édition PowerMockito)
(Limité à Java 7 ou version ultérieure) Je souhaite que vous compariez des objets dans Objects.equals
Je souhaite obtenir l'adresse IP lors de la connexion au Wi-Fi avec Java
Je veux ForEach un tableau avec une expression Lambda en Java
Exécuter R à partir de Java Je veux exécuter rJava
Je souhaite transmettre APP_HOME pour me connecter à Gradle
Je voulais que (a == 1 && a == 2 && a == 3) vrai en Java
J'ai essayé de sortir quatre-vingt-dix-neuf en Java
Je veux être finalement même à kotlin
Je veux écrire rapidement de java vers sqlite
J'ai essayé de créer une compétence Alexa avec Java
Je veux obtenir la valeur en Ruby
Utiliser OpenCV avec Java
Utiliser PreparedStatement en Java
Je veux que vous utilisiez Scala comme meilleur Java pour le moment
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3 (Black Magic)
[Java] Je souhaite calculer la différence par rapport à la date
Je veux utiliser NetBeans sur Mac → Je peux l'utiliser!
Je veux intégrer n'importe quel TraceId dans le journal
J'ai essayé d'implémenter la notification push Firebase en Java
# 2 [Note] J'ai essayé de calculer quatre-vingt-dix-neuf avec Java.
J'ai essayé de créer une compétence Clova en Java
J'ai essayé de créer une fonction de connexion avec Java
Je souhaite définir une fonction dans la console Rails
[Android Studio] Je souhaite utiliser une bibliothèque Maven sur Android
Je veux faire des transitions d'écran avec kotlin et java!
Je veux arrêter les cas de serpent avec des définitions de table
Lorsque vous souhaitez remplacer dynamiquement l'annotation dans Java 8
Je veux cliquer sur une broche GoogleMap dans RSpec
J'ai essayé d'implémenter la méthode de division mutuelle d'Eugrid en Java
~ J'ai essayé d'apprendre la programmation fonctionnelle avec Java maintenant ~
Remarques sur l'utilisation des expressions régulières en Java
J'ai essayé de découvrir ce qui avait changé dans Java 9
[Android Studio] Je souhaite définir des restrictions sur les valeurs enregistrées dans EditText [Java]
Je souhaite utiliser PowerMock dans une classe qui combine des tests paramétrés et des tests ordinaires
Je souhaite renvoyer un objet au format CSV avec en-tête et filtre multilignes en Java
# 1_JAVA Je veux obtenir le numéro d'index en spécifiant un caractère dans la chaîne de caractères
Code à utiliser lorsque vous souhaitez traiter Json en Java avec uniquement des bibliothèques standard