{"id":13669751,"url":"https://github.com/youngwind/fake-node","last_synced_at":"2025-07-01T02:37:21.050Z","repository":{"id":143665126,"uuid":"86898727","full_name":"youngwind/fake-node","owner":"youngwind","description":"内嵌 V8 引擎到 C++ 应用中","archived":false,"fork":false,"pushed_at":"2017-04-08T01:03:21.000Z","size":27428,"stargazers_count":19,"open_issues_count":1,"forks_count":4,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-14T21:21:23.107Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/youngwind.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2017-04-01T08:40:57.000Z","updated_at":"2023-04-07T09:34:52.000Z","dependencies_parsed_at":null,"dependency_job_id":"c4f29a4d-aee5-446c-961c-d4a7eaeac9ba","html_url":"https://github.com/youngwind/fake-node","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/youngwind/fake-node","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/youngwind%2Ffake-node","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/youngwind%2Ffake-node/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/youngwind%2Ffake-node/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/youngwind%2Ffake-node/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/youngwind","download_url":"https://codeload.github.com/youngwind/fake-node/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/youngwind%2Ffake-node/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262884536,"owners_count":23379411,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-02T09:00:21.196Z","updated_at":"2025-07-01T02:37:21.020Z","avatar_url":"https://github.com/youngwind.png","language":"C++","readme":"# 主题\n本项目研究如何将 [V8引擎](https://github.com/v8/v8) 嵌入到 C++ 应用中，以此学习 Node 实现的基本原理。\n在运行此项目之前，需满足以下条件：\n\n1. 有一定的 C++ 基础\n2. 阅读官方手册，关于[如何内嵌 V8 的说明](https://github.com/v8/v8/wiki/Getting-Started-with-Embedding)\n\n\n# 说明\n1. 由于此项目依赖于 V8，我已经提前将 V8 编译好，存放到目录 out 中。直接执行 ./out/x64.release/d8 就可以运行 V8 的 debug 实例：d8。\n如下图所示\n    ![d8](./doc/d8.gif)\n2. 编译的 V8 版本为 4.8，所以，本例使用的 V8 也是 4.8 版本。\n3. include 文件夹是从 V8 源码中拷贝过来的头文件\n\n# 运行\n\n1. 执行命令`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，\n输入 `./hello_world` 执行该 demo，即可查看到输出字符串 \"youngwind\"。\n2. 同理，执行命令`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`，\n生成本项目的可执行文件，输入`./main`执行。\n\n# main 有什么功能？\n\n## 全局注入 console 函数\nmain 参考自 V8 源码中的 /sample/shell.cc，最大程度地删减了非必要的代码而成。\n目前 main.cpp 只完成一个功能：\"全局注入 console 函数，使得 JS 具有全局 console 方法；当 JS 调用 console 方法的时候，打印其传递的参数\"。\n正是通过这一形式，使得 JS 具备调用 C++ 的能力，这也是 Node 得以实现的基础。\n下图是 d8 与 main 的对比。\n\n![console](./doc/console.gif)\n\n## 全局注入 newHttp 函数\n调用 newHttp 函数，可以发起一个 http 请求。调用方式如下： `newHttp('localhost', 4444);` \n第一个参数是域名，第二个参数是端口号，目前只支持这种最简单的请求。\n你需要先在本地起一个 http 服务器，端口号是 4444。（比如我用 express 起的服务器）\n如下图所示：\n\n![newHttp](./doc/new_http.gif)","funding_links":[],"categories":["C++"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyoungwind%2Ffake-node","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyoungwind%2Ffake-node","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyoungwind%2Ffake-node/lists"}