使用webjars + graalvm js 引擎增強業務處理
機制上比較簡單,webjars 是利用了web 容器對於資源解析的特性
META-INF/resources 會自動解析處理,而且我們可以基於此模式實現js 的方便
打包以及版本化管理(這點webjars的設計比較到位),以下是一個簡單的嘗試,基於 graalvm js 的能力
我們可以比較靈活的擴充套件業務系統
核心程式碼
我們可以通過classloader 載入資源
public static void scritLoad(Engine engine) throws IOException {
ClassLoader cl = Thread.currentThread().getContextClassLoader();
URL url = cl.getResource("META-INF/resources/webjars/jquery/3.5.1/jquery.js");
Source mysource = Source.newBuilder("js",url).build();
Context context = Context.newBuilder().allowHostClassLoading(true).allowIO(true).allowHostAccess(true).engine(engine).build();
context.eval(mysource);
Value callapp = context.getBindings("js").getMember("$");
System.out.println(callapp.execute());
}
附加:基於spring resource 工具類載入
public static void content() throws IOException {
URL myfile = ResourceUtils.getURL("classpath:META-INF/resources/webjars/jquery/3.5.1/jquery.js");
InputStream inputStream = myfile.openStream();
byte[] bytes = new byte[inputStream.available()];
inputStream.read(bytes);
String str = new String(bytes);
inputStream.close();
System.out.println(str);
}
webjars 開發說明
這個比較簡單,核心還是按照webjars 的約定在打包階段進行資源處理,我們可以在資源處理階段進行管理,參考
<?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.dalong-web</groupId>
<artifactId>webjars</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
<package-version>1.0</package-version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<destinationDir>${project.build.outputDirectory}/META-INF/resources/platform/userlogin/${package-version}</destinationDir>
</properties>
<build>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<targetPath>${destinationDir}</targetPath>
</resource>
</resources>
</build>
</project>
說明
基於上邊的我們可能發現不是很方便,因為我們的系統可能有多版本的(webjars 支援多版本模式),那麼我們可以基於ClassGraph 來解決
同時webjars 中的靜態資源我們可以使用browserify 進行構建打包,提示js的模組化水平,或者自定義包裝也是可以的,實現一個自定義的require 機制
(nodyn/jvm-npm 是一個值得參考的方案),目前graalvm js已經支援了es 6 的模組機制(參考https://www.cnblogs.com/rongfengliang/p/13567602.html),理論上我們可以改寫require 實現將資源的載入通過jar 中的內容獲取(load 載入改寫)
的檔案(後邊可以嘗試下)
參考資料
https://github.com/classgraph/classgraph
https://www.webjars.org/
https://www.graalvm.org/reference-manual/js/JavaScriptCompatibility/
https://github.com/graalvm/graaljs/blob/master/docs/user/JavaScriptCompatibility.md
http://browserify.org/
https://www.cnblogs.com/rongfengliang/p/13567602.html