利用v8,libuv打造你自己的Javascript运行时

235 阅读1分钟
  • 先讲原理

js异步处理 通过Libuv实现

WX20231125-194835@2x.png

  • 思路 仿照node.js使用V8,Libuv ,C++ Layer
  1. 第一步 配置V8库 为了避免因为你的电脑环境不同,引发的各种奇怪编译问题,我们直接在gitpod上创建一个环境模版 gitpod.io/new/#snapsh…

打开线上vscode编辑器

WX20231126-165158@2x.png

进入 capivara文件夹 运行 start.sh ,然后make

cd capivara
./start.sh
make

WX20231126-165558@2x.png

WX20231126-170104@2x.png

然后就可以看到文件夹下多了一个bin目录 验证这点可以 先把bin目录删除 重新运行make命令看看 WX20231126-170445@2x.png

运行 ./bin/capivara index.js 可以看到index.js文件被运行

WX20231126-170714@2x.png

再试试运行 make uv-timers命令 WX20231126-171339@2x.png

修改index.js 尝试调用setTimeout和console.log 会发现这两个方法还没有被实现, print可以使用,因为它是c++的方法

WX20231126-182519@2x.png

现在我们来自己写一个timeout函数,使index.js能调用timeout方法

创建 app/src/timer.hpp文件

#include <v8.h>
#include <uv.h>

uv_loop_t *loop;
class Timer
{
public:
      static void Initialize(uv_loop_t *evloop)
      {
        loop = evloop;
      }

       static void Timeout(const v8::FunctionCallbackInfo<v8::Value> &args)
       {

       }

};

在capivara.hpp中引入 timer.hpp

WX20231126-211953@2x.png

添加如下代码 WX20231126-212116@2x.png

index.js中书写timeout函数调用 ,

WX20231126-212242@2x.png

命令行执行 ./start.sh 发现终端没有报错,说明timeout函数运行了

WX20231126-212546@2x.png