以 Runtime 重新认知 JavaScript
JavaScript 语言的执行方式
从语言的执行方式划分,我们可以将 JavaScript 划分为解释型语言,同时我们可以知道,解释型语言的执行需要解释器。通过解释器解释一行代码,执行一行代码。
JavaScript Engine
Javascript 或者更正式的说 ECMAScript,仅仅是一种编程语言的规范,任何人都可以编写一个 javaScript 引擎来解析执行 JavaScript 代码。
下面是一些 JS 引擎:
- V8 (Google)
- JavaScriptCore (Apple)
- Chakra (Microsoft)
- SpiderMonkey (Mozilla)
- Hermes (Facebook)
- ……
编译构建一个 JS 引擎(Hermes 举例)
Hermes 引擎
Hermes 是一个 Javascript 引擎,由 Facebook 开发,目前 Facebook 正在使用 Hermes 作为 React Native 的 Javascript 引擎。
install
安装必要的依赖包
#centos/redhat
yum install cmake git ninja-build libicu-devel python zip readline-devel
#ubuntu/debian
apt install cmake git ninja-build libicu-dev python zip readline-devel
#archlinux
pacman -S cmake git ninja icu python zip readline
#macos
brew install cmake git ninja
克隆项目
git clone https://github.com/facebook/hermes.git
编译构建
- -S 指定源目录
- -B 指定构建目录
- -G 指定构建工具
- -DCMAKE_BUILD_TYPE=Release 指定构建类型
调试版本
cmake -S hermes -B build -G Ninja
cmake --build ./build
生产版本
cmake -S hermes -B build_release -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build ./build_release
运行
# 开启REPL
./build/bin/hermes
>> var a = 1; var b = 2; var c = a + b;
undefined
>> c;
3
#运行文件
./build/bin/hermes test.js
JavaScirpt Runtime
但是大多数情况下,JavaScript 语言不仅仅是在独立的环境中执行,而是需要与一些外部的环境交互,以至于执行有用的程序。
下面是一些 JS 运行时
- Browser
- 谷歌浏览器
- 火狐浏览器
- IE 浏览器
- Edge 浏览器
- 国产浏览器
- Nodejs
- Deno
- Bun
- ……
在 Runtime 基础上,划分 js 为两部分
- JS Engine
- Runtime 自身集成的 API
js 引擎用来解析基本的 js 语法特性,运行时提供的 API 用来帮助 js 实现更多的功能
Browers
浏览器(以 Chrome 为例)这个 Runtime 就可以划分为:
- V8 引擎
- Web API(DOM、BOM)
Nodejs
Nodejs 这个 Runtime 就可以划分为
- V8 引擎
- Node API(fs、http、path)
在 Runtime 中执行 JS 代码
启动交互式解释器 REPL
Browser
- 右键鼠标,进入审查 inspect
- F12
>> console.log("hello world");
undefined
Nodejs
node
>> console.log("hello world");
undefined
Deno
deno
>> console.log("hello world");
undefined
Bun
需要下载交互式命令解释器
# install
bun repl
# start up
bun
>> console.log("hello world");
undefined
执行单个 js 代码文件
Browser
通过 HTML 的一个标签 script 去引入 js 文件
<script src="index.js"></script>
Nodejs
node index.js
Deno
deno run index.js
Bun
bun run index.js