[JAVA] Tentative de SSR Vue.js avec Spring Boot et GraalJS

Aperçu

Après avoir touché GraalJS, je vais essayer SSR. J'espère que cela sera utile pour les personnes qui veulent SSR même en Java.

À propos de GraalJS

GraalVM est une VM qui peut exécuter JVM, JavaScript, Python, Ruby, etc. GraalJS est censé optimiser les performances en s'exécutant dans l'environnement GraalVM (de la version officielle), mais comme il est écrit en Java, il s'agit d'une JVM normale Mais il est possible d'opérer. Cette fois, je voudrais essayer SSR en utilisant GraalJS avec JVM.

environnement

Fichier JS

Je n'expliquerai pas les paramètres côté JS en détail, mais préparerai les fichiers JS côté serveur et côté client avec webpack selon le Guide VueSSR.

javascript:webpack.config.js


    node: {
        child_process: 'empty',
        fs: 'empty',
        net: 'empty',
        tls: 'empty',
    },

Ajoutez ce qui précède pour travailler côté serveur.

Dans l'application Java, chargez le fichier vue-server-renderer et Bundle et laissez-le dessiner le HTML.

entry-server.js


import { createApp } from './app'

const { app, router, store } = createApp()

router.push(route)

router.onReady(() => {
    renderVueComponentToString(app, (err, res) => {
        rendered = String(res)
    })
})

J'écris un processus pour mettre le HTML obtenu par renderVueComponentToString dans la variable globale rendue.

ScriptEngine Ajoutez une bibliothèque pour utiliser GraalJS avec ScriptEngine de Java.

pom.xml


		<!-- https://mvnrepository.com/artifact/org.graalvm.js/js -->
		<dependency>
			<groupId>org.graalvm.js</groupId>
			<artifactId>js</artifactId>
			<version>19.2.0</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.graalvm.js/js-scriptengine -->
		<dependency>
			<groupId>org.graalvm.js</groupId>
			<artifactId>js-scriptengine</artifactId>
			<version>19.2.0</version>
		</dependency>

Renderer.java


    public String render(String route) throws ScriptException, IOException {

        ScriptEngine engine = getEngine();
        ScriptContext context = getContext();
        Bindings engineScope = engineSetting(engine, context);
        engineScope.put("rendered", null);    //Déclaration de variable globale
		engineScope.put("route", route);      //Déclaration de variable globale
        engine.eval(read("static/js/server.js"), context);
        
		return context.getAttribute("rendered").toString(); //Obtenir la variable rendue au type String
	}

    private Bindings engineSetting(ScriptEngine engine, ScriptContext context) throws ScriptException, IOException {
        context.setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE);
        Bindings engineScope = context.getBindings(ScriptContext.ENGINE_SCOPE);

        engine.setContext(context);

        engine.eval(
                "var process = { env: { VUE_ENV: 'server', NODE_ENV: 'production' }}; this.global = { process: process };",
                context);
        loadFiles(engine, context);  // vue-server-Chargement du moteur de rendu

        return engineScope;
    }

Vous pouvez déclarer une variable globale avec la méthode put de la classe Bindings et obtenir la valeur avec la méthode getAttribute de la classe ScriptContext.

Renderer.java


    private ScriptEngine getEngine() {
        return new ScriptEngineManager().getEngineByName("graal.js");
    }

    private ScriptContext getContext() {
        return new SimpleScriptContext();
    }

Pour éviter que le côté JS ne devienne un singleton comme décrit dans le Guide VueSSR, ScriptEngine est en train de créer une nouvelle instance à chaque fois qu'il y a une demande.

dessin

Dessinez le HTML acquis avec Thymeleaf.

index.html


<body th:utext="${rendered}">
</body>

Du côté Vue, assurez-vous d'inclure l'ID d'élément utilisé pour le dessin.

Acquisition initiale des données

Les données au moment du dessin initial sont acquises en écrivant JSON dans un fichier HTML. Ceci est réalisé avec thymeleaf.

index.html


    <script th:inline="javascript">
      /*<![CDATA[*/	    
      window.__INITIAL_STATE__ = /*[[${word}]]*/ {};
      /*]]>*/
    </script>

J'ai publié un exemple de projet sur github, j'espère donc que vous le trouverez utile.

Impressions

Il est plus facile de faire du SSR en utilisant Nuxt ou quelque chose comme ça.

référence

Guide de rendu côté serveur Vue.js terwer/spring-vue-ssr

Recommended Posts

Tentative de SSR Vue.js avec Spring Boot et GraalJS
Jusqu'à INSERT et SELECT sur Postgres avec botte de printemps et feuille de thym
Connectez-vous à la base de données avec spring boot + spring jpa et effectuez l'opération CRUD
HTTPS avec Spring Boot et Let's Encrypt
Ajoutez une botte de printemps et un dégradé à éclipse
Comment utiliser h2db intégré avec Spring Boot
Essayez d'implémenter la fonction de connexion avec Spring Boot
Essayez d'automatiser la migration avec Spring Boot Flyway
[Java] Article pour ajouter une validation avec Spring Boot 2.3.1.
Je voulais classer la botte à ressort dans un multi-projet
[Introduction à Spring Boot] Fonction d'authentification avec Spring Security
Télécharger avec Spring Boot
Plans pour prendre en charge JDK 11 pour Eclipse et Spring Boot
Essayez d'utiliser un conteneur DI avec Laravel et Spring Boot
Changer d'environnement avec Spring Boot application.properties et l'annotation @Profile
Mappez automatiquement DTO aux entités avec l'API Spring Boot
Mémo d'utilisation de Spring Security: coopération avec Spring MVC et Boot
Comment démarrer par environnement avec Spring Boot de Maven
Connectez Spring Boot et Angular en toute sécurité avec OpenAPI Generator
Essayez Spring Boot de 0 à 100.
Générer un code à barres avec Spring Boot
Hello World avec Spring Boot
Démarrez avec Spring Boot
Bonjour tout le monde avec Spring Boot!
Exécutez LIFF avec Spring Boot
Connexion SNS avec Spring Boot
Introduction à Spring Boot ① ~ DI ~
Introduction à Spring Boot ② ~ AOP ~
Spring Boot à partir de Docker
Hello World avec Spring Boot
Définir des cookies avec Spring Boot
Utiliser Spring JDBC avec Spring Boot
Ajouter un module avec Spring Boot
Premiers pas avec Spring Boot
Lier l'API avec Spring + Vue.js
Introduction à Spring Boot, partie 1
Créer un micro service avec Spring Boot
Envoyer du courrier avec Spring Boot
Sortez le journal d'accès Tomcat intégré à la sortie standard avec Spring Boot
Gérez l'API de date et d'heure Java 8 avec Thymeleaf avec Spring Boot
Implémenter l'API REST avec Spring Boot et JPA (couche d'infrastructure)
Découpez SQL en fichier de propriété avec jdbcTemplate of spring boot
Comment appeler et utiliser l'API en Java (Spring Boot)
Flux jusqu'à la sortie des données de la table à afficher avec Spring Boot
Implémenter l'API REST avec Spring Boot et JPA (Domain Layer Edition)
Développement piloté par domaine avec Java et Spring Boot-Layer et division de modules
J'ai essayé de démarrer avec Swagger en utilisant Spring Boot
8 choses à insérer dans DB en utilisant Spring Boot et JPA
Avec Spring Boot, hachez le mot de passe et utilisez l'enregistrement des membres et la sécurité Spring pour implémenter la fonction de connexion.
Développement facile d'applications Web avec STS et Spring Boot. Dans 10 minutes.
Utiliser l'authentification de base avec Spring Boot
Introduction à Spring Boot x Open API ~ Open API créée avec le modèle d'écart de génération ~
gRPC sur Spring Boot avec grpc-spring-boot-starter
Déploiement à chaud avec le développement Spring Boot
Comment configurer Spring Boot + PostgreSQL
Programmation Spring Boot avec VS Code
Jusqu'à "Hello World" avec Spring Boot
Créer une application d'enquête avec Spring Boot
Comment créer votre propre contrôleur correspondant à / error avec Spring Boot
Obtenez des résultats de validation avec Spring Boot
Comparez Hello, world! Avec Spring Boot avec Java, Kotlin et Groovy