自学内容网 自学内容网

Node.js新草案:通过共享库使用Node.js

对于大部分开发者而言,很难把Node.js当作一个类库(dll/so),嵌入到一个应用程序中。

这个工作之所以难,主要是因为Node.js(内置的libuv)有自己的消息循环,要想把这个消息循环和应用程序的消息循环合并到一起并不容易。

我们知道,应用程序的主线程只能有一个消息循环,要想合并前面提到的两个循环,一个常见的办法是把通过一个非常小的时间间隔,把一个消息循环的消息,泵入另一个消息循环,但这样做会导致导致GUI界面响应缓慢或占用大量CPU资源。

Electron的做法是这样的:创建了一个单独的线程并使用使用系统调用来轮询libuv的fd,以获得libuv的消息,得到libuv的消息后,再把消息交给GUI主线程,由主线程的消息循环处理libuv的消息。

这里说的fd是一个文件描述符(句柄),libuv通过轮询这个fd得到自己的消息。详情请参阅Electron的文档:https://www.electronjs.org/blog/electron-internals-node-integration。如果你要看代码,我建议你直接看这个项目的代码:https://github.com/yue/yode,这个项目就是Electron的作者做的。建议你不要直接使用yode,因为它有BUG,详见:https://github.com/yue/yue/issues/180

除了Electron做这个工作外,NodeGui(https://docs.nodegui.org/)也做了这个工作,不过他的做法和Electron的做法是相同的。

不过,这种做法显然是要修改Node.js的源码的(修改的不算多)。也就是说,你得确保你修改的代码始终与Node.js更新的代码保持兼容,不然你就用不了新版的Node.js。

最近关注到Node.js为了方便开发者在应用程序内使用Node.js提了一个新草案:node-api: use c-based api for libnode embedding(https://github.com/nodejs/node/pull/54660)

这个草案的目标就是为嵌入式场景启用Node-API,允许开发者在应用程序内部以共享库的方式使用Node.js。

来看看草案中预计公开的这些API:

全局API:

  • node_embedding_set_api_version

  • node_embedding_run_main

  • node_embedding_create_platform

  • node_embedding_delete_platform

  • node_embedding_platform_set_flags

  • node_embedding_platform_get_parsed_args

运行时API:

  • node_embedding_run_runtime

  • node_embedding_create_runtime

  • node_embedding_delete_runtime

  • node_embedding_runtime_set_flags

  • node_embedding_runtime_set_args

  • node_embedding_runtime_on_preload

  • node_embedding_runtime_on_start_execution

  • node_embedding_runtime_add_module

消息循环相关的API

  • node_embedding_runtime_set_task_runner

  • node_embedding_run_event_loop

  • node_embedding_complete_event_loop

  • node_embedding_terminate_event_loop

与Node.js互操作API

  • node_embedding_run_node_api

  • node_embedding_open_node_api_scope

  • node_embedding_close_node_api_scope

看上去非常诱人,有了这一套东西,我们就可以不用修改Node.js的源码,直接在应用程序中使用Node.js了,而且始终与Node.js保持兼容。

从草案的提交记录看,很多Node.js团队的成员都参与了讨论,但开发工作主要是一个人在做,希望这个草案能早日实现。


原文地址:https://blog.csdn.net/liulun/article/details/145112328

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!