1. 程式人生 > 實用技巧 >graalvm js 載入遠端js 檔案

graalvm js 載入遠端js 檔案

graalvm js 支援了基於遠端模式的js 檔案載入(當然是處於實驗階段的,生產謹慎使用),以下是一個簡單的demo

環境準備

  • pom.xml
<?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.ex</groupId>
  <artifactId>qlex-learnint</artifactId>
  <version>1.0-SNAPSHOT</version>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <encoding>UTF-8</encoding>
    <java.version>1.8</java.version>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>
  <dependencies>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>QLExpress</artifactId>
      <version>3.2.0</version>
    </dependency>
<!--    如果使用了js-scriptengine 以下可選-->
<!--    <dependency>-->
<!--      <groupId>org.graalvm.truffle</groupId>-->
<!--      <artifactId>truffle-api</artifactId>-->
<!--      <version>20.2.0</version>-->
<!--    </dependency>-->
<!--    <dependency>-->
<!--      <groupId>org.graalvm.sdk</groupId>-->
<!--      <artifactId>graal-sdk</artifactId>-->
<!--      <version>20.2.0</version>-->
<!--    </dependency>-->
    <dependency>
      <groupId>org.graalvm.js</groupId>
      <artifactId>js-scriptengine</artifactId>
      <version>20.2.0</version>
    </dependency>
    <dependency>
      <groupId>org.graalvm.js</groupId>
      <artifactId>js</artifactId>
      <version>20.2.0</version>
    </dependency>
  </dependencies>
  <build>
    <!-- Maven Shade Plugin -->
    <finalName>my-expression-app</finalName>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.3</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <mainClass>Application</mainClass>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>
  • 開啟實驗特性的遠端url 載入
Engine engine = Engine.newBuilder().option("js.load-from-url","true").allowExperimentalOptions(true).build();
  • 程式碼
// 複用了同一個engine,可以提高效能
public static void loadURL(Engine engine) throws IOException {
    Context context = Context.newBuilder().allowAllAccess(true).allowHostClassLoading(true).allowIO(true).engine(engine).build();
    Source mysource =Source.newBuilder("js"," load(\"http://127.0.0.1:8080/mylogin.js\")","rongdemo").build();
    context.eval(mysource);
    Value callapp = context.getBindings("js").getMember("mylogin");
    System.out.println(callapp.execute());
}
  • mylogin.js 內容
function mylogin(){
  var BigDec = Java.type('java.math.BigDecimal');
  var bd = new BigDec("0.1");
  console.log(bd.add(bd).toString());
  return "dalong rong feng"
}
  • 執行效果

參考資料

https://github.com/graalvm/graaljs/blob/master/docs/user/JavaScriptCompatibility.md