首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Node.js C++ addons: how to create JS Date object by N-API and V8 in Node.js 10

基础概念

Node.js C++ Addons 是使用 C++ 编写的扩展模块,可以直接在 Node.js 环境中调用。N-API(Node-API)是 Node.js 提供的一套稳定的 API,用于构建原生插件,不依赖于底层 JavaScript 运行时(如 V8)的具体实现细节。V8 是 Google 开发的 JavaScript 引擎,Node.js 使用 V8 作为其默认的 JavaScript 运行时。

创建 JS Date 对象

在 Node.js 中使用 C++ Addons 创建一个 JS Date 对象,可以通过 N-API 和 V8 来实现。以下是一个简单的示例,展示了如何使用 N-API 在 Node.js 10 中创建一个 JS Date 对象。

示例代码

代码语言:txt
复制
#include <node_api.h>
#include <iostream>

napi_value CreateDateObject(napi_env env, napi_callback_info info) {
    size_t argc = 1;
    napi_value argv[1];
    napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);

    if (argc < 1) {
        napi_throw_error(env, nullptr, "Expected one argument");
        return nullptr;
    }

    double time = 0;
    napi_get_value_double(env, argv[0], &time);

    napi_value date;
    napi_create_date(env, time * 1000, &date); // V8 expects milliseconds
    return date;
}

napi_value Init(napi_env env, napi_value exports) {
    napi_status status;
    napi_value fn;

    status = napi_create_function(env, nullptr, 0, CreateDateObject, nullptr, &fn);
    if (status != n::napi_ok) {
        napi_throw_error(env, nullptr, "Unable to wrap native function");
    }

    status = napi_set_named_property(env, exports, "createDate", fn);
    if (status != n::napi_ok) {
        napi_throw_error(env, nullptr, "Unable to set named property");
    }

    return exports;
}

NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)

编译和使用

  1. 创建一个 binding.gyp 文件来描述如何编译 C++ 代码:
代码语言:txt
复制
{
  "targets": [
    {
      "target_name": "addon",
      "sources": [ "addon.cc" ],
      "include_dirs": [
        "<!(node -e \"require('nan')\")"
      ],
      "cflags!": [ "-fno-exceptions" ],
      "cflags_cc!": [ "-fno-exceptions" ],
      "xcode_settings": {
        "GCC_ENABLE_CPP_EXCEPTIONS": "NO",
        "CLANG_CXX_LIBRARY": "libc++",
        "MACOSX_DEPLOYMENT_TARGET": "10.7"
      },
      "msvs_settings": {
        "VCCLCompilerTool": { "ExceptionHandling": 1 }
      }
    }
  ]
}
  1. 使用 node-gyp 编译 C++ 插件:
代码语言:txt
复制
node-gyp configure
node-gyp build
  1. 在 JavaScript 中使用编译好的插件:
代码语言:txt
复制
const addon = require('./build/Release/addon');

const date = addon.createDate(1633072800); // 使用 Unix 时间戳创建 Date 对象
console.log(date);

应用场景

Node.js C++ Addons 适用于需要高性能计算或访问底层系统资源的场景。例如,处理大量数据、使用特定硬件加速、或者封装现有的 C/C++ 库。

可能遇到的问题

  1. 版本兼容性:Node.js 版本更新可能导致 N-API 的变化,需要确保代码与 Node.js 版本兼容。
  2. 内存管理:C++ 中的内存管理与 JavaScript 不同,需要注意避免内存泄漏。
  3. 错误处理:在 C++ 中处理错误的方式与 JavaScript 不同,需要适当地将错误信息传递回 JavaScript 层。

解决方法

  • 版本兼容性:定期检查 Node.js 和 N-API 的更新日志,确保代码与最新版本兼容。
  • 内存管理:使用智能指针(如 std::shared_ptrstd::unique_ptr)来管理内存。
  • 错误处理:使用 N-API 提供的错误处理函数,如 napi_throw_errornapi_throw_type_error,将错误信息传递给 JavaScript 层。

参考链接

通过以上步骤和示例代码,你可以在 Node.js 10 中使用 N-API 和 V8 创建 JS Date 对象。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Node.js为什么需要C++扩展?

一.概念 本质上,Node.js 扩展就是 C++动态链接库: Addons are dynamically-linked shared objects written in C++....(尤其是 V8 API 经常发生变化) 基于nan:即 Native Abstractions for Node.js,为了屏蔽不同 Node/V8 版本间 C++ API 差异而加的一层抽象,期望将下层...不用 N-API 的话,手搓一个有些复杂,涉及好几层的知识: V8:Node.js 依赖的 JavaScript 引擎,对象创建、函数调用等机制都是 V8 提供的,具体 C++ API 见头文件node...并且 C++并不总是比 JS 快(比如正则匹配的某些场景) 参考资料 C++ Addons | Node.js v14.0.0 Documentation why write C/C++ addons...generation Node.js APIs for native modules N-API: Next generation APIs for Node.js native addons available

2.4K10
  • 通过N-API使用Libuv线程池

    Node.js不适合处理耗时操作是一直存在的问题,为此Node.js提供了三种解决方案。 1 子进程 2 子线程 3 Libuv线程池 前两种是开发效率比较高的,因为我们只需要写js。...但是也有些缺点 1 执行js的成本 2 虽然可以间接使用Libuv线程池,但是受限于Node.js提供的API。 3 无法利用c/c++层提供的解决方案(内置或业界的)。...::Localv8::Context> context = env->context(); v8::Localv8::Object> resource; if (async_resource...总结:通过N-API提供的API,使得我们不再受限于Nod.js本身提供的一些异步接口(使用Libuv线程池的接口),而是直接使用Libuv线程池,这样我们不仅可以自己写c/c++,还可以复用业界的一些解决方案解决...Node.js里的一些耗时任务。

    91410

    编写原生 Node.js 模块

    在C/C++和Node.js之间创建一个Bridge,进行通信。 什么是原生模块? Node.js Addons是动态链接的可共享对象,由C/C++编写而成。...想要编写Node.js addons,你需要了解一些基本知识: Libuv V8 Node.js internals 推荐阅读这些资料。...C++ 有丰富的内置类型来保存数字或者字符串,但是JS只能识别v8::里面定义的类型。因此,将c++的变量赋值给JS时,需要转换成可以被JS识别的类型,也即是v8::定义的类型。...比如v8::String、v8::Object。 编译原生的Node.js模块 一旦源代码编写完成,需要将它编译成二进制的addon.node文件,之后才能被Node.js require。...N-API,Node官方推出的用来编写原生Node扩展模块,是V8和nan的替代,目前处于实验阶段。

    3.8K00

    Node.js 原生模块开发方式变迁

    一直到最后,会比较详细地对 Node.js v8.x 新出的原生模块开发接口 N-API 做一次初步的尝试和解析,使得大家对 Node.js 原生 C++ 模块开发的固有印象(认为特别麻烦)有一个比较好的改观...在早期的时候,Node.js 原生 C++ 模块开发方式是非常暴力的,直接使用其提供的原生模块开发头文件。 开发者直接深入到 Node.js 的各种 API,以及 Google V8 的 API。...帝国时代:符合 ABI 的 N-API 自从前几天 Node.js v8.0.0 发布之后,Node.js 推出了全新的用于开发 C++ 原生模块的接口,N-API。..._onLine (readline.js:278:10) at REPLServer.Interface....并且代码里面并没有任何 Node.js 非 N-API 所暴露出来的数据结构和 V8 的数据结构——版本差异消除了。

    1.3K30

    拥抱Node.js 8.0,N-API入门极简例子

    N-API简介 Node.js 8.0 在2017年6月份发布,升级的特性中,包含了N-API。编写过或者使用过 node扩展的同学,不少都遇到过升级node版本,node扩展编译失败的情况。...因为node扩展严重依赖于V8暴露的API,而node不同版本依赖的V8版本可能不同,一旦升级node版本,原先运行正常的node扩展就编译失败了。...它跟底层JS引擎无关,只要N-API暴露的API足够稳定,那么node扩展的编写者就不用过分担忧node的升级问题。...这里只是简单返回一个字符串 napi_value HelloMethod (napi_env env, napi_callback_info info) { napi_value world; napi_create_string_utf8...相关链接 N-API:https://nodejs.org/api/n-api.html C++ Addons:https://nodejs.org/api/addons.html 本文摘录自《Nodejs

    2.3K70

    拥抱Node.js 8.0,N-API入门极简例子

    本文作者:IMWeb 陈映平 原文出处:IMWeb社区 未经同意,禁止转载 N-API简介 Node.js 8.0 在2017年6月份发布,升级的特性中,包含了N-API。...因为node扩展严重依赖于V8暴露的API,而node不同版本依赖的V8版本可能不同,一旦升级node版本,原先运行正常的node扩展就编译失败了。...它跟底层JS引擎无关,只要N-API暴露的API足够稳定,那么node扩展的编写者就不用过分担忧node的升级问题。...这里只是简单返回一个字符串 napi_value HelloMethod (napi_env env, napi_callback_info info) { napi_value world; napi_create_string_utf8...相关链接 N-API:https://nodejs.org/api/n-api.html C++ Addons:https://nodejs.org/api/addons.html 本文摘录自《Nodejs

    1.5K20

    Node 10 新功能概览(译)

    N-API 不再是实验性功能 Node文档将N-API描述为构建本地插件的API。 它独立于底层的JavaScript运行时(ex V8),并作为Node.js本身的一部分进行维护。...它旨在将Addons与基础JavaScript引擎中的更改隔离,并允许为一个版本编译的模块在更高版本的Node.js上运行,而无需重新编译。...之前在Node 8中实验性地引入了N-API,并将从Node 10开始稳定。在Node版本之间升级不再会引起模块损坏。 它也将向后移植以实现Node.js v6.x和v8.x的兼容性。...V8 引擎 v6.6 的性能改进 Node 停止使用 Chromium 中的 V8 JavaScript引擎,并且 Node.js v10 使用了最新版本的V8 引擎。...TLS 1.3最近已完成定稿,待 Node.js v10 在10月份发布 LTS 时,它将会完全支持该标准。

    68630

    如何开发 Node.js Native Add-on?

    目前 N-API 的 C++ 封装 node-addon-api 每周的下载量已经超过了 250万次,并且所有 Node.js LTS(长期支持版本)都已经支持了 N-API v3 或者更高版本 ,Node.js...其他辅助函数 除了以上几个重要功能之外,我们也发现了许多在维护 Node.js add-on 的过程中经常会使用到的类型方法与函数,包括: Date 对象; BigInts; 从 JavaScript...结尾 从 Node.js 诞生之初,Node.js 就支持通过 C/C++ 代码来给 JavaScript 暴露更多的特性接口。...大版本之后重新编译 add-on 模块; 我们可以在除了使用 V8 作为 JavaScript 引擎的 Node.js 之外的运行环境实现 N-API,也意味着这些为 Node.js 开发的 add-on...N-API 是单纯的 C API,这意味着我们可以使用 C/C++ 之外的语言、运行时开发 Node.js add-on,比如 Go 或者是 Rust。

    1.6K20

    Node.js 10带着npm 6来了!

    Node.js 10.x 将是第一个支持 OpenSSL 1.1.0 的版本。该版本配备了 Google V8 6.6 JavaScript 引擎,性能会增强,错误处理和跟踪诊断能力也将会提升。...此版本还将推出 Node.js API(N-API),N-API 是一个稳定的 API 模块,它独立于 V8,这样就不会阻碍模块在不重新编译的情况下运行新版本的 Node.js。...Node.js 是一个非常灵活的平台,可用于构建 API、物联网和移动应用程序等。” 关于 N-API N-API 提高了 Node.js 的 ABI 稳定性,有助于模块的部署和维护。...Node.js 10 将 ABI 的稳定模块 API(N-API)作为官方支持的 API 层。...Node.js 10.x 引入 npm 6 Node.js 10.0.0 附带 npm 5.7.x, 但是,预计在 Node.js 10.x 生命周期的早期会更新为 npm 6。

    71230

    鸿蒙(HarmonyOS)安全和高效的使用N-API开发Native模块

    简介N-API 是 Node.js Addon Programming Interface 的缩写,是 Node.js 提供的一组 C++ API,封装了 V8 引擎 的能力,用于编写 Node.js...通过 N-API,开发者可以使用 C++ 编写高性能的 Node.js 模块,同时保持与 Node.js 的兼容性。...Node.js 官网中已经给出 N-API 接口基础能力的介绍,同时, 方舟 ArkTS 运行时 提供的 N-API 接口,封装了方舟引擎的能力,在功能上与 Node.js 社区保持一致,这里不再赘述。...TestDefineClass, NULL, NULL, NULL, napi_enumerable|napi_static, NULL}; NODE_API_CALL(env, napi_create_object...目前,通过 N-API 接口实现 ArkTS 调用 C++ 的场景大致分为三类:ArkTS 直接调用 C++ 接口、ArkTS 监听 C++ 接口以及 ArkTS 接收 C++ 回调。

    37620

    Node.js 8有哪些重要功能和修复?

    Node.js 8将从2017年10月起,正式成为当前的LTS版本,并持续到2019年12月31日。这也意味着Node.js 6版本将在2018年4月进入到维护模式,并在2019年4月结束维护支持。...N-API 介绍 N-API是用于构建原生插件的API。它独立于底层JavaScript运行时,并作为Node.js自身的一部分进行维护。...N-API的目的是将附加组件和基础JavaScript引擎中的更改区分开,以便原生插件在不需要重新编译情况下,就可以运行不同的Node.js版本。 了解更多N-API信息。...将 V8 升级到 5.8:TurboFan & Ingnition 使用Node.js 8版本,底层的V8 JavaScript引擎也会更新。...对于Node.js用户来说,最大的变化就是引入TurboFan和Ignition。Ignition是V8的解释器,TurboFan是优化编译器。

    1.1K20

    Node.js v15.0.0 is here!

    N-API 版本 7 npm 7 unhandled rejections 默认抛出 QUIC V8 8.6 AbortController Node.js 15 加入了 AbortController...N-API 7 N-API 7 是上一个大版本以来的第一个新版,并带来了使用 ArrayBuffers 的更多方法。 npm 7 Node.js 15 附带了 npm 的新大版本 npm 7。...去年是 Node.js 成立 10 周年,我们启动了《Node.js 的下一个 10 年》的项目。这项工作的目的是反思 Node.js 在头十年中成功的原因,并为下一个十年中的成功设定方向。...现在也是开始计划升级到 Node.js 14 的好时机,它将在下周升级到 LTS,支持会持续到直到 2023 年 4 月。 还要注意的是,Node.js 10 将于 2021 年 4 月结束生命周期。...因此,如果你仍在使用 Node.js 10,我们建议你开始计划升级。

    1K10

    前端-结合源码分析 Node.js 模块加载与运行原理

    关于 Node.js 扩展模块的开发,在 Node.js 官网文档中专门有一节予以介绍,大家可以移步官网文档查看:https://nodejs.org/docs/latest-v6.x/api/addons.html...::FunctionCallbackInfo; using v8::Isolate; using v8::Local; using v8::Object; using v8::String;...我们知道,Node.js 是基于 v8 引擎的,而 v8 引擎,就是用 C++ 来写的。...值得注意的是,不同 Node.js 版本,依赖的 v8 版本不同,导致很多 API 会有差别,因此使用原生 C/C++ 开发扩展的过程中,也需要针对不同版本的 Node.js 做兼容处理。...来绕开 v8 的内存限制,最典型的就是我们常用的 buffer.js 模块,其底层也是调用了 C++,在 C++ 的层面上去申请内存,避免 v8 内存瓶颈。

    2.3K20
    领券