1. 程式人生 > 實用技巧 >使用webjars + graalvm js 引擎增強業務處理

使用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