Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/youngwind/fake-node
内嵌 V8 引擎到 C++ 应用中
https://github.com/youngwind/fake-node
Last synced: about 2 months ago
JSON representation
内嵌 V8 引擎到 C++ 应用中
- Host: GitHub
- URL: https://github.com/youngwind/fake-node
- Owner: youngwind
- Created: 2017-04-01T08:40:57.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2017-04-08T01:03:21.000Z (over 7 years ago)
- Last Synced: 2024-08-03T09:06:52.059Z (4 months ago)
- Language: C++
- Size: 26.2 MB
- Stars: 19
- Watchers: 3
- Forks: 4
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
- awesome-github-star - fake-node
README
# 主题
本项目研究如何将 [V8引擎](https://github.com/v8/v8) 嵌入到 C++ 应用中,以此学习 Node 实现的基本原理。
在运行此项目之前,需满足以下条件:1. 有一定的 C++ 基础
2. 阅读官方手册,关于[如何内嵌 V8 的说明](https://github.com/v8/v8/wiki/Getting-Started-with-Embedding)# 说明
1. 由于此项目依赖于 V8,我已经提前将 V8 编译好,存放到目录 out 中。直接执行 ./out/x64.release/d8 就可以运行 V8 的 debug 实例:d8。
如下图所示
![d8](./doc/d8.gif)
2. 编译的 V8 版本为 4.8,所以,本例使用的 V8 也是 4.8 版本。
3. include 文件夹是从 V8 源码中拷贝过来的头文件# 运行
1. 执行命令`clang++ -stdlib=libstdc++ -std=c++11 -I. hello_world.cpp -o hello_world out/x64.release/libv8_base.a out/x64.release/libv8_libbase.a out/x64.release/libicudata.a out/x64.release/libicuuc.a out/x64.release/libicui18n.a out/x64.release/libv8_base.a out/x64.release/libv8_external_snapshot.a out/x64.release/libv8_libplatform.a`,便可编译生成官方的 demo,
输入 `./hello_world` 执行该 demo,即可查看到输出字符串 "youngwind"。
2. 同理,执行命令`clang++ -stdlib=libstdc++ -std=c++11 -I. main.cpp -o main out/x64.release/libv8_base.a out/x64.release/libv8_libbase.a out/x64.release/libicudata.a out/x64.release/libicuuc.a out/x64.release/libicui18n.a out/x64.release/libv8_external_snapshot.a out/x64.release/libv8_libplatform.a`,
生成本项目的可执行文件,输入`./main`执行。# main 有什么功能?
## 全局注入 console 函数
main 参考自 V8 源码中的 /sample/shell.cc,最大程度地删减了非必要的代码而成。
目前 main.cpp 只完成一个功能:"全局注入 console 函数,使得 JS 具有全局 console 方法;当 JS 调用 console 方法的时候,打印其传递的参数"。
正是通过这一形式,使得 JS 具备调用 C++ 的能力,这也是 Node 得以实现的基础。
下图是 d8 与 main 的对比。![console](./doc/console.gif)
## 全局注入 newHttp 函数
调用 newHttp 函数,可以发起一个 http 请求。调用方式如下: `newHttp('localhost', 4444);`
第一个参数是域名,第二个参数是端口号,目前只支持这种最简单的请求。
你需要先在本地起一个 http 服务器,端口号是 4444。(比如我用 express 起的服务器)
如下图所示:![newHttp](./doc/new_http.gif)