[JAVA] Versuch, SSR Vue.js mit Spring Boot und GraalJS zu verwenden

Überblick

Nachdem ich GraalJS berührt habe, werde ich SSR ausprobieren. Ich hoffe, es ist hilfreich für Leute, die SSR auch in Java wollen.

Über GraalJS

GraalVM ist eine VM, auf der JVM, JavaScript, Python, Ruby usw. ausgeführt werden können. GraalJS soll die Leistung optimieren, indem es in der GraalVM-Umgebung (vom Beamten) ausgeführt wird. Da es jedoch in Java geschrieben ist, handelt es sich um eine normale JVM Aber es ist möglich zu bedienen. Dieses Mal möchte ich SSR mit GraalJS mit JVM ausprobieren.

Umgebung

JS-Datei

Ich werde die Einstellungen auf der JS-Seite nicht im Detail erläutern, sondern die JS-Dateien auf der Serverseite und der Clientseite mit einem Webpack gemäß dem VueSSR-Handbuch vorbereiten.

javascript:webpack.config.js


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

Fügen Sie das Obige hinzu, um auf der Serverseite zu arbeiten.

Laden Sie in der Java-App den Vue-Server-Renderer und die Bundle-Datei und lassen Sie sie den HTML-Code zeichnen.

entry-server.js


import { createApp } from './app'

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

router.push(route)

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

Ich schreibe einen Prozess, um den von renderVueComponentToString erfassten HTML-Code in die gerenderte globale Variable einzufügen.

ScriptEngine Fügen Sie eine Bibliothek hinzu, um GraalJS mit Javas ScriptEngine zu verwenden.

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);    //Globale Variablendeklaration
		engineScope.put("route", route);      //Globale Variablendeklaration
        engine.eval(read("static/js/server.js"), context);
        
		return context.getAttribute("rendered").toString(); //Rendervariable auf String-Typ übertragen
	}

    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-Renderer wird geladen

        return engineScope;
    }

Sie können globale Variablen mit der put-Methode der Bindings-Klasse deklarieren und die Werte mit der getAttribute-Methode der ScriptContext-Klasse abrufen.

Renderer.java


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

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

Um zu vermeiden, dass die JS-Seite zu einem Singleton wird, wie im VueSSR-Handbuch beschrieben, erstellt ScriptEngine jedes Mal eine neue Instanz, wenn eine Anforderung vorliegt.

Zeichnung

Zeichnen Sie das erworbene HTML mit Thymeleaf.

index.html


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

Stellen Sie auf der Vue-Seite sicher, dass Sie die zum Zeichnen verwendete Element-ID angeben.

Erste Datenerfassung

Die Daten zum Zeitpunkt des ersten Zeichnens werden durch Schreiben von JSON in eine HTML-Datei erfasst. Dies wird mit Thymeleaf erreicht.

index.html


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

Ich habe ein Beispielprojekt auf github veröffentlicht, daher hoffe ich, dass Sie es hilfreich finden.

Impressionen

Es ist einfacher, SSR mit Nuxt oder etwas anderem zu machen.

Referenz

Handbuch zur serverseitigen Wiedergabe von Vue.js terwer/spring-vue-ssr

Recommended Posts

Versuch, SSR Vue.js mit Spring Boot und GraalJS zu verwenden
Bis INSERT und SELECT für Postgres mit Spring Boot und Thymianblatt
Stellen Sie mit spring boot + spring jpa eine Verbindung zur Datenbank her und führen Sie die CRUD-Operation durch
HTTPS mit Spring Boot und Let's Encrypt
Fügen Sie Frühlingsstiefel und Gradle zur Sonnenfinsternis hinzu
Verwendung des eingebauten h2db mit Federstiefel
Versuchen Sie, die Anmeldefunktion mit Spring Boot zu implementieren
Versuchen Sie, die Migration mit Spring Boot Flyway zu automatisieren
[Java] Artikel zum Hinzufügen einer Validierung mit Spring Boot 2.3.1.
Ich wollte Spring Boot in einem Multiprojekt gradle
[Einführung in Spring Boot] Authentifizierungsfunktion mit Spring Security
Mit Spring Boot herunterladen
Pläne zur Unterstützung von JDK 11 für Eclipse und Spring Boot
Versuchen Sie es mit einem DI-Container mit Laravel und Spring Boot
Wechseln Sie die Umgebung mit Spring Boot application.properties und @ Profile-Annotation
Ordnen Sie DTO automatisch Entitäten mit der Spring Boot-API zu
Verwendungshinweis zu Spring Security: Zusammenarbeit mit Spring MVC und Boot
Booten nach Umgebung mit Spring Boot of Maven
Verbinden Sie Spring Boot und Angular typsicher mit OpenAPI Generator
Versuchen Sie Spring Boot von 0 bis 100.
Generieren Sie mit Spring Boot einen Barcode
Hallo Welt mit Spring Boot
Beginnen Sie mit Spring Boot
Hallo Welt mit Spring Boot!
Führen Sie LIFF mit Spring Boot aus
SNS-Login mit Spring Boot
Einführung in Spring Boot ~ ~ DI ~
Einführung in Spring Boot ② ~ AOP ~
Spring Boot beginnend mit Docker
Hallo Welt mit Spring Boot
Setzen Sie Cookies mit Spring Boot
Verwenden Sie Spring JDBC mit Spring Boot
Modul mit Spring Boot hinzufügen
Erste Schritte mit Spring Boot
API mit Spring + Vue.js verknüpfen
Einführung in Spring Boot Teil 1
Erstellen Sie mit Spring Boot einen Mikrodienst
Mail mit Spring Boot verschicken
Geben Sie das integrierte Tomcat-Zugriffsprotokoll mit Spring Boot an die Standardausgabe aus
Behandeln Sie die Java 8-Datums- und Uhrzeit-API mit Thymeleaf mit Spring Boot
Implementieren Sie die REST-API mit Spring Boot und JPA (Infrastructure Layer).
Schneiden Sie SQL in die Eigenschaftendatei mit jdbcTemplate von Spring Boot aus
Aufrufen und Verwenden der API in Java (Spring Boot)
Fluss bis zur Ausgabe von Tabellendaten, die mit Spring Boot angezeigt werden sollen
Implementieren Sie die REST-API mit Spring Boot und JPA (Domain Layer Edition).
Domänengesteuerte Entwicklung mit Java und Spring Boot-Layer und Modulabteilung
Ich habe versucht, mit Swagger mit Spring Boot zu beginnen
8 Dinge, die mit Spring Boot und JPA in die DB eingefügt werden müssen
Hash beim Spring-Boot das Passwort und verwenden Sie die Mitgliederregistrierung und die Spring-Sicherheit, um die Anmeldefunktion zu implementieren.
Einfache Entwicklung von Webanwendungen mit STS und Spring Boot. In 10 Minuten.
Verwenden Sie die Standardauthentifizierung mit Spring Boot
Einführung in Spring Boot x Offene API ~ Offene API, erstellt mit Generationslückenmuster ~
gRPC auf Spring Boot mit grpc-spring-boot-Starter
Hot Deploy mit Spring Boot-Entwicklung
So stellen Sie Spring Boot + PostgreSQL ein
Spring Boot Programmierung mit VS Code
Bis "Hallo Welt" mit Spring Boot
Erstellen Sie eine Anfrage-App mit Spring Boot
So erstellen Sie mit Spring Boot einen eigenen Controller, der / error entspricht
Erhalten Sie Validierungsergebnisse mit Spring Boot
Vergleiche Hallo Welt! Mit Spring Boot mit Java, Kotlin und Groovy