Javet:Java 和 V8/Node.js 终于是牵手了!

家好,很高兴又见面了,我是"高级前端‬进阶‬",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!

今天给大家带来的主题是 Javet ,即在 Java 中嵌入 Node.js 和 V8 的绝佳方式。Javet 的发布也意味着Java 和 V8/Node.js 生态的强强联合。话不多说,直接进入正题!

1.Node.js 和 V8 关系

Node.js 是一个开源的、跨平台的后端 JavaScript 运行时,它建立在 V8 引擎之上,在浏览器之外执行 Javascript 代码。 Node.js 运行时包含执行 JS 所需的所有环境,而 JavaScript 最初设计为仅在浏览器中运行。

2019 年,当 Ryan Dahl 意识到 Chrome 浏览器中 V8 引擎的巨大潜力并将其扩展为作为独立应用程序运行时,创建了 Node.js。因为计算机只能解释机器码,而 Javascript 是一种高级语言,所以需要一个编译器来将 Javascript 翻译成机器码。而 V8 借助于 JIT (Just in Time)即时编译,优化编译器 TurboFan 等能力帮助 Node.js 自动完成这一系列过程。

所以,从这一点来看,没有 V8,Node.js 就无法运行,但是两者并不对等。

Node.js 在 V8 基础上增加了一些额外的功能,例如:文件系统访问、网络通信、事件循环(宏观微观任务)等。Node.js 的代码由 C++ 编写,其与 V8 引擎的交互是通过 V8 的 C++ 接口实现的,Node.js 在编译时会将 V8 引擎集成进去。因此,从这一点来看,Node.js 实际上是一个基于 V8 引擎的应用程序,它提供了额外的 API,使得 JavaScript 能够在服务器端运行。

Chrome V8 引擎采用人类可读的 Javascript 代码并将其转换为更优化的机器代码。 它是一个用 C++ 编写的开源多线程程序。 该引擎最初专为由网络浏览器执行而设计,但最新版本也在浏览器之外执行 JS 代码,从而启用服务器端脚本,独立于执行它的浏览器。

此功能启发了设计人员选择 V8 引擎来为 Node.js 提供动力。总之,Node.js 是用 C++ 编写的, V8 引擎嵌入在 Node.js 代码中,为代码添加了额外的功能,同时 V8 引擎和 Node.js 是可互操作的,共同构成了开发应用程序的强大组合。

2.什么是 Javet

Javet 是什么

Javet 是 Java + V8 (JAVa + V + EighT) 的组合,用于在 Java 中嵌入 Node.js 和 V8 。Javet 具有以下特征:

Javet的整体架构如下:

V8 原始类型和引用类型之间有一个模糊的界限。 在 Javet 中,primitive 的定义是 V8 和 Java primitive 类型的混合,作为设计上的权衡。

引用类型对象在 V8 + JNI + JVM 中保持内存占用,调用 close() 时回收所有资源。 这是一种相当古老的资源管理方式,Javet 试图通过 try-with-resource 向 Java 应用程序隐藏这种繁琐的工作。

Javet 的 Node.js 和V8模式

Javet 同时支持 Node.js 模式和 V8 模式,这两种模式可以共存于一个 JVM 中。也就是说,它们可以并排运行,互不干扰。

如图所示,Node.js 和 V8 都是在专用的自定义类加载器中延迟加载的,两种方式详细对比如下。

Javet 的优点之一是 V8 模式下的所有功能都可以应用于 Node.js 模式, 比如下面的例子。

在模块加载方面,Javet 不构建 require() 但允许应用程序设置拦截器,因为 Javet 不知道如何定位模块并且不想引入安全问题。 因此,由应用程序定义它们自己的模块定位方式。

Javet 提供对 ES6 import() 的完整支持,JNI 内部的某些工作必须到位,因为 V8 仅部分支持 import()。 因此,在 Javet 中,模块是虚拟化的,换句话说,模块由任意字符串表示,可以在运行时由应用程序解释。 例如。 module.js 可能来自文件、URL、内存中的字符串或其他任何内容。 Javet 将编译和执行的模块存储在映射中,并以该字符串作为键,并在 V8 通过该字符串查找该模块时将其提供给 V8。

因为作者目前工作主要以 JavaScript 为主,虽然懂一点 Java 但是并不深入。更多关于 Javet 的特性已经在文末参考资料中给出,大家可以自行阅读。

3.如何使用 Javet

首先添加如下的 Maven 配置:



    com.caoccao.javet
    javet
    2.2.0




    com.caoccao.javet
    javet-macos
    2.2.0

Gradle Kotlin DSL 配置如下:

implementation("com.caoccao.javet:javet:2.2.0"); // Linux and Windows (x86_64)
implementation("com.caoccao.javet:javet-macos:2.2.0"); // Mac OS (x86_64 and arm64)
implementation("com.caoccao.javet:javet-android:2.2.0"); // Android (arm, arm64, x86 and x86_64)

Gradle Groovy DSL 配置如下:


implementation 'com.caoccao.javet:javet:2.2.0' // Linux and Windows (x86_64)
implementation 'com.caoccao.javet:javet-macos:2.2.0' // Mac OS (x86_64 and arm64)
implementation 'com.caoccao.javet:javet-android:2.2.0' // Android (arm, arm64, x86 and x86_64)

配置完成后就可以以 Node.js 和 V8 格式运行 JavaScript 代码了:

// Node.js Mode
// 第 1 步:在 try-with-resource 中从 V8 主机创建一个 Node 运行时。
try (V8Runtime v8Runtime = V8Host.getNodeInstance().createV8Runtime()) {
    // 第 2 步:将字符串作为 JavaScript 代码执行并将结果打印到控制台。
    System.out.println(v8Runtime.getExecutor("'Hello Javet'").executeString());
    // 第 3 步:在 try-with-resource 块的末尾自动回收资源。
}

// V8 Mode
    // 第 1 步:在 try-with-resource 中从 V8 主机创建 V8 运行时。
try (V8Runtime v8Runtime = V8Host.getV8Instance().createV8Runtime()) {
    // 第 2 步:将字符串作为 JavaScript 代码执行并将结果打印到控制台。
    System.out.println(v8Runtime.getExecutor("'Hello Javet'").executeString());
    //第 3 步:资源在 try-with-resource 块的末尾自动回收。
}

本文总结

本文主要和大家介绍的是Javet ,即在 Java 中嵌入 Node.js 和 V8 的绝佳方式。相信通过本文的阅读,大家对 Javet 都会有一个初步的了解。

因为篇幅和作者水平有限,文章并没有过多展开,如果有兴趣,可以在我的主页继续阅读,同时文末的参考资料提供了大量优秀文档以供学习。最后,欢迎大家点赞、评论、转发、收藏!


参考资料

https://www.geeksforgeeks.org/what-is-the-relationship-between-node-js-and-v8/

https://zhuanlan.zhihu.com/p/622161519

https://github.com/caoccao/Javet

https://www.caoccao.com/Javet/

https://www.caoccao.com/Javet/development/test.html

https://www.caoccao.com/Javet/development/design.html

展开阅读全文

页面更新:2024-02-14

标签:机器码   控制台   参考资料   字符串   应用程序   牵手   模块   模式   代码   方式   引擎

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top