虽然现在大部分情况都是使用n-api来编写插件,但是底层毕竟是v8(和libuv),使用v8编写简单的插件,同时熟悉v8的使用。...本文介绍在写c++插件时,简单又常用的写法,其实本质上,写插件的难处在于底层的能力和对libuv、v8的了解。话不多说,直接看代码。...#include namespace demo { using v8::FunctionCallbackInfo; using v8::Isolate; using v8::Local...; using v8::Object; using v8::String; using v8::Value; using v8::FunctionTemplate; using v8::Function...Initialize( LocalObject> exports, LocalValue> module, Local context ) { Isolate*
Node.js 不仅可以单独运行,还可以以库的方式被使用,本文介绍下如何把 Node.js 嵌入到自己项目中。首先第一步下载 Node.js 源码,然后根据 Node.js 的文档进行编译安装。...::InitializePlatform(platform.get()); V8::Initialize(); int ret = RunNodeInstance(platform.get()...LoadEnvironment 最后会执行我们传入的字符串代码。这段代码中,前面是 Node.js 提供的 demo,后面一句是我加的,test.js 里简单输出 hello world。...std::vectorLocalValue>>* arguments) { EscapableHandleScope scope(env->isolate()); // 从原生 JS 模块代码中找到我们的代码...maybe_fn.ToLocal(&fn)) { return MaybeLocalValue>(); } // 执行我们的代码 MaybeLocalValue> result
::Localv8::Object> target, v8::Localv8::Value> unused,...Local; using v8::Object; using v8::String; using v8::Value; void Cyb::Initialize(LocalObject> target...src/cyb_wrap.cc src/cyb_wrap.h 这时候nodejs会编译我们的代码了。但是nodejs的内置模块有一定的机制,我们的代码加入了nodejs内核,不代表就可以使用了。...,还把我们的代码定义的模块注册到内置c++模块里了。...这个配置是给process.binding函数使用的,如果不修改这个配置,通过process.binding就找不到我们的模块。process.binding是可以在用户js里使用的。
JS 引擎 写一个 JS 运行时,首先就必须需要一个 JS 引擎来处理 JS,大部分的 JS 运行时都是基于 V8的,当然你也可以使用其他的 JS 引擎。...所以首先需要选择一个 JS 引擎,然后下载代码,编译成功。有了 JS 引擎,就可以通过它提供的一些 API 实现一个可以执行 JS 代码的软件。...:unique_ptr platform = platform::NewDefaultPlatform(); v8::V8::InitializePlatform(platform.get...但是幸运的是,JS 引擎提供了拓展能力,我们可以使用 JS 引擎提供的 API 拓展网络、文件这些功能。在之前代码的基础上增加以下代码。..., nullptr, global); Context::Scope context_scope(context); // 所有拓展功能挂到这个对象中 LocalObject> No = Object
接着执行了 *result = napi_value变量; result类型是napi_value*,即二级指针,这样调用方就拿到了v8创建的对象。我们看一下具体的调用代码。...napi_value ret; napi_create_array(env, &ret); 执行以上代码后,ret就保存了v8对象的信息。那么这样做有什么好处呢?我们继续看一下对ret的使用。...{ v8::Localv8::Context> context = env->context(); v8::Localv8::Object> obj; // 校验并转成对应的v8类型...class Local { T* val_;} 即把v的值复制到了val_中,后续就可以按照v8的模式去使用了。 分析到这里,就结束了,那么napi_value到底有什么用呢?...v8::Localv8::Object> v8value = v8::Object::New(...); v8::Localv8::Array> v8value = v8::Array::New(.
本文介绍一下如何实现这种映射(不确定是否能满足这位同学的需求)。 下面我们看一下Addon的实现。会涉及到V8的一些使用,可以先阅读该文章《一段js理解nodejs中js调用c++/c的过程》。...; using v8::Isolate; using v8::Local; using v8::Object; using v8::String; using v8::Value; using v8::...v8::Int32; using v8::NewStringType; void Initialize( LocalObject> exports, LocalValue> module,...第二种就是两个存在继承关系的C++类,同样先通过V8的API实现两个继承的类导出到JS使用,因为JS层使用的只是壳子,具体执行到C++代码的时候,我们再体现出这种继承关系。...上面代码新建了一个新的函数模板并且设置了一系列的原型属性,那么模板t就继承了这些属性。我们看看Node.js里怎么使用的。
1,给window.scrollX设置值会导致堆栈溢出,看堆栈是反复进入js的访问器回调导致。但发现github上最新代码反而没问题。一开始以为是v8-5-7和miniblink49哪个代码不兼容。...2,修改v8 5.7开启devtools失效的bug。原因是getv8version这函数找不到。新v8确实移除了,但不知道为何debug.js这个v8自带的js却用到了。...v8::Value> const &),void (__cdecl*)(v8::Localv8::Name>,v8::Localv8::Value>,v8::PropertyCallbackInfo...v8::Value> &) * getter=0x0f79f5a2, void (v8::Localv8::Name>, v8::Localv8::Value>, const v8::PropertyCallbackInfo...PropertyCallbackInfov8::Value> &) * getter=0x0f79f5a2, void (v8::Localv8::Name>, v8::Localv8::Value
1 导出给js使用的功能 #include NAPI_MODULE(NODE_GYP_MODULE_NAME, Init) 上面的代码是使用napi时的通用模式,我们只需要实现Init...{ v8::Localv8::Context> context = env->context(); v8::Localv8::Object> obj; // 把napi_value object...转成v8的Object,数组继承Object CHECK_TO_OBJECT(env, context, obj, object); // 把值napi_value value转成v8对象...v8::Localv8::Value> val = v8impl::V8LocalValueFromJsValue(value); // 调用v8 Object对象的Set方法设置对象的属性,即数组的元素...(env);} 从上面的分析中,我们大致可以看到napi实现中的一些规律,get的api的逻辑是调用v8接口拿到v8类型的对象,然后转成napi_value类型返回给调用方,set的api是传入napi_value
假设我们有以下代码 HandleScope scope; Local hello = String::New(参数); 这个看起来很简单的过程,其实在V8的内部实现起来比较复杂。...而是V8内部使用的Handle(代码在handles.h),我们看看实现。...接着构造一个Local对象。ToLocal是V8代码的分水岭,我们看看Local的定义。...后记:从上面的分析中我们不仅看到了Handle的实现原理,也看到了V8代码的一些设计细节,V8在内部实现了一类对象,然后把内部对象转成外部使用的类型后返回给用户,当用户使用该返回的对象时,V8又会转成内部的对象再操作这个对象...外部类的定义在v8.h中,这是我们使用V8时需要了解的最好文档。内部类的实现根据版本不同而不同,比如早期版本都是在object.h里实现的,而实现内外部对象转换的方法在api.c中定义。 ?
napi_value ret;napi_create_array(env, &ret); 执行以上代码后,ret就保存了v8对象的信息。那么这样做有什么好处呢?我们继续看一下对ret的使用。...{ v8::Localv8::Context> context = env->context(); v8::Localv8::Object> obj; // 校验并转成对应的v8类型...CHECK_TO_OBJECT(env, context, obj, object); v8::Localv8::Value> val = v8impl::V8LocalValueFromJsValue...class Local { T* val_;} 即把v的值复制到了val_中,后续就可以按照v8的模式去使用了。 分析到这里,就结束了,那么napi_value到底有什么用呢?...v8::Localv8::Object> v8value = v8::Object::New(...); v8::Localv8::Array> v8value = v8::Array::New(.
本文的重点其实还是关注 v8, 以及 v8 如何与 c++ 进行交互这个问题, 所以我们将选择代码比较简洁, 充分利用 c++ 新特性的 v8pp 作为讲述的重点. ---- 2. v8pp 的使用范例...其它特化的实现也大量使用了 v8 本身提供的类型, 代码都比较简洁, 这里不一一展开了. ---- 4....object_registry::unwrap_object(v8::Localv8::Value> value) { v8::HandleScope scope(isolate..._); while (value->IsObject()) { v8::Localv8::Object> obj = value.Asv8::Object>();...js_add(a, b) { return a + b; } 通过以下c++代码: v8::Localv8::Function> fun; v8pp::get_option(isolate,
LocalValue> f_value = ExecuteString(env, MainSource(env), script_name); Local f = Local...::Cast(f_value); // 全局变量,我们访问全局变量的时候都是global的属性 LocalObject> global = env->context()->Global...LocalValue> arg = env->process_object(); // 执行bootstrap_node.js导出的函数 auto ret = f->Call(env->context...* mod = get_builtin_module(*module_v); LocalObject> exports; if (mod !...里定义一个函数或者对象,在编译后v8也知道应该调用的是c++哪些代码,因为我们怎么写脚本以及使用什么功能但是v8提供的,v8在编译执行我们的js脚本的时候,当我会知道需要执行底层哪些代码。
我们看使用v8执行一段js代码开始,分析整个流程。...v8::Localv8::Value> result = script->Run(context).ToLocalChecked(); 我们主要关注Compile和Run这两个函数。...NULL,ScriptData* pre_data = NULL); LocalValue> Run(); }; 实现(省略不重要的代码) // OpenHandle和ToLocal是v8用来转换内部类和外部类的工具...比如v8对外提供的类是Object,这个只是一个对外的简单接口,对外的实现是JSObject类,即Object类最终是使用JSObject这个类的功能 Local Script::Compile...node->values()->at(i); if (value->AsLiteral() == NULL) { Load(value); // Get the value
本文分享一下nodejs中js调用c++模块的一些内容。js调用c++模块是v8提供的能力,nodejs是使用了这个能力。这样我们只需要面对js,剩下的事情交给nodejs就行。...接下来我们看看这个字段的使用。后面会详细介绍他的用处。...完成了模块的注册。我们来看看如何使用这个模块。...>(); node::Utf8Value module_v(env->isolate(), module); // 从模块链表中找到对应的模块 node_module* mod = get_builtin_module...void TCPWrap::Initialize(LocalObject> target, LocalValue> unused,
接着看看N-API的代码。...::Localv8::Object> async_resource, v8::Localv8::String> async_resource_name,...::Localv8::Object> async_resource, v8::Localv8::String> async_resource_name,...::Localv8::Context> context = env->context(); v8::Localv8::Object> resource; if (async_resource...::Object::New(env->isolate); } v8::Localv8::String> resource_name; CHECK_TO_STRING(env, context
简介 首先介绍使用v8 API跟使用swig框架的不同: (1)v8 API方式为官方提供的原生方法,功能强大而完善,缺点是需要熟悉v8 API,编写起来比较麻烦,是js强相关的,不容易支持其它脚本语言...++组件,不需要了解各种脚本语言的组件开发框架,缺点是不支持javascript的回调,文档和demo代码不完善,使用者不多。...v8::FunctionCallbackInfo; using v8::Isolate; using v8::Local; using v8::Object; using v8::String; using...异步组件的实现只需要关注libuv的uv_queue_work API,组件实现时,除了主体代码hello.cpp和组件使用者代码,其它部分都与上面三的demo一致。...::FunctionCallbackInfo; using v8::Function; using v8::Isolate; using v8::Local; using v8::Object; using
在 C++ 代码中,定义以下原型的函数: HandleValue> func(const Arguments& args){//return something} 然后,再将其公开给脚本: global...最好的应用场景是:既有脚本语言的灵活性, 又有 C/C++ 等系统语言的效率。使用 V8 引擎,可以很方便的将 C++ 类” 包装” 成可供 JavaScript 使用的资源。...紧接着,我们需要包装 Person 类的 getter/setter: HandleValue> PersonGetAge(const Arguments& args){ LocalObject...::Localv8::Value> AsyncWrap::MakeCallback(uint32_t index, int argc, v8::Localv8::Value>* argv) {...v8::Localv8::Value> cb_v = object()->Get(index); CHECK(cb_v->IsFunction()); return MakeCallback
因此,Stalker 不是使用断点,而是基于动态修改代码的方式实现。...(platform.get()); v8::V8::Initialize(); // 2....执行脚本并获取结果 v8::Localv8::Value> result = script->Run(context).ToLocalChecked(); // 8....(GetIsolate(), "Attach"); // 判断对象是否存在,以及类型是否是函数 LocalValue> attach_val; if (!...(GetIsolate()); const int argc = 1; LocalValue> argv[argc] = {obj}; LocalValue> result; attach_func
前言:越来越多同学在使用Node.js,大家也不同程度地理解Node.js是什么。比如Node.js是由V8、Libuv、JS组成的,Node.js底层是C\C++,Node.js不是语言是运行时。...(context); // 定义我们要执行的代码 v8::Localv8::String> source = v8::String::NewFromUtf8(isolate, "'Hello...; return 0;} 我们看代码很多,但是大部分的根据V8文档就行,最核心的是context和脚本的定义,我们看到这里的context是V8提供的内容,然后执行的JS脚本也平平无奇。...,主要是对V8 API的使用。...(info.Holder())->Socket();} // 取出真正的对象,即obj[0]static TCPServer * GetTCPServer(LocalObject> object) {
blink::CanvasRenderingContext2DV8Internal::fontAttributeSetter(v8::Localv8::Value> v8Value, const v8...v8::Function::Call(v8::Localv8::Context> context, v8::Localv8::Value> recv, int argc, v8::Localv8:..., v8::Localv8::Value> receiver, int argc, v8::Localv8::Value> * args, v8::Isolate * isolate) 行 444..., v8::Localv8::Value> receiver, int argc, v8::Localv8::Value> * info, v8::Isolate * isolate) 行 155...blink::ScriptController::callFunction(v8::Localv8::Function> function, v8::Localv8::Value> receiver
领取专属 10元无门槛券
手把手带您无忧上云