springboot核心技术-web开发-视图模板执行原理
springboot是基于springframework发展起来的快速开发框架,web开发的发展主要是实现了前后端分离,spa单页应用流行,比如reactJs、vueJs等。由于seo的需求,spa单页应用的seo效果并不好,原来的springmvc仍然有用。springMvc在seo方面的作用主要是实现ssr(服务端渲染),以实现站点来自搜索引擎的自然流量。springboot保留了springMvc的支持,以模板引擎的方式支持服务的渲染,比如freemarker、thymleaf、js引擎等。freemarker是Java开发人员应用较多的一种解决方案,不过确实体验一般,和react、vue那些丰富的组件库相比,体验差一些,性能上也比不了nodeJs和V8引擎。freeMarker适合熟悉模板技术,并且对html5、css精通的开发人员,如果前端是小白,则不适合。react和vue组件库给小白们节省了大量成本,直接复用组件模板,可以实现很多炫酷的模板和效果,美中不足的是ssr需要实现同构。在springboot上搞定react、vue的同构ssr,需要使用js模板配置,使用支持es6的js引擎,然后结合webpack、maven打包插件exec-maven-plugin和ReactJs模板实现同构ssr工程。目前支持es6的js引擎,推荐使用V8引擎。前端开发人员倾向于使用nodeJs做中间件,与后端交互,这种同构架构多了一层node,很不爽。可以把js引擎直接嵌入springboot,然后在springboot上搞前后端一体化的同构渲染,优点是利用react、vue组件库,解决前端人员不足或者强后端定制的需求。主要应用场景是实现便于seo的cms内容管理系统,然后结合spa单页应用的csr客户端渲染,实现真正的高效、便捷。这里面最难搞的是集成V8引擎到springboot。已经实现的方案都比较老,基于J2V8引入本地化的引擎。
maven pom配置:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.onready</groupId>
<artifactId>spring-react-ssr</artifactId>
<version>1.0.0</version>
<name>spring-react-ssr</name>
<description>spring-react-ssr</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.8</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.eclipsesource.j2v8/j2v8 -->
<dependency>
<groupId>com.eclipsesource.j2v8</groupId>
<artifactId>j2v8_win32_x86_64</artifactId>
<version>4.6.0</version> // 如果需要更高版本的j2v8,需要从github上下载源码,在本地自行编译和打包(具体过程源码里有教程,需要根据运行平台分别定制打包,目前最高版本6.2.1)
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<compilerArgument>-Xlint:unchecked</compilerArgument>
<excludes>
<packageingExcludes>
org.projectlombok
</packageingExcludes>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<id>npm install</id>
<goals>
<goal>exec</goal>
</goals>
<phase>compile</phase>
<configuration>
<executable>npm</executable>
<arguments>
<argument>install</argument>
</arguments>
</configuration>
</execution>
<execution>
<id>npm build</id>
<goals>
<goal>exec</goal>
</goals>
<phase>compile</phase>
<configuration>
<executable>npm</executable>
<arguments>
<argument>run</argument>
<argument>build</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>aliyun-repos</id>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>aliyun-repos</id>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
基于springboot、webpack搭建的同构react项目结构如下:

如果你想复用springMvc的脚本模板渲染方式,jdk8支持的nashorn引擎是不支持es6的,因此如果使用react流行的组件库,会报错。这种方式只适合完全用html5和js5实现html模板,失去了同构的意义。后面说明使用j2v8的方式。

下面是一个简易的使用V8引擎执行服务端渲染的示例(读者可以举一反三):

通过以上过程,就实现了一个嵌入V8引擎的Java、ReactJs服务端渲染方案。既用了强大的V8引擎,又利用了React强大的组件生态,最后集中于强大的Java生态中,实现了seo、组件化、插件化等等在云物互联时代必须的技术能力。有时间的开发者,可以尝试实现。
声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 嗅谱网
转载请注明:转自《springboot核心技术-web开发-视图模板执行原理》
本文地址:http://www.xiupu.net/archives-11217.html
关注公众号:
微信赞赏
支付宝赞赏
