返回介绍

搭建开发环境

发布于 2024-09-11 01:11:56 字数 2265 浏览 0 评论 0 收藏 0

一种方式是通过 Node-API 开发原生模块,Node-API 是专门用于构建原生模块,它独立于底层 JavaScript 运行时,并作为 Node.js 的一部分进行维护。

它是跨 Node.js 版本的应用程序二进制接口(Application Binary Interface,ABI),旨在将原生模块与底层实现隔离开,并允许为某个 Node.js 版本编译的模块在更高版本的 Node.js 上运行而无需重新编译。

不同版本的 Node.js 使用同样的接口为原生模块提供服务,这些接口是 ABI 化的,只要 ABI 的版本号一致,编译好的原生模块就可以直接使用,不需要重新编译。

基于 Node-API 开发原生模块仍存在两种方式。

一种方式就是使用 C 语言开发,由于 Node-API 就是用 C 语言封装的,所以这种方法更为直接,由于 C 语言过于简单直接,语言特性较少,所以开发起来非常麻烦。

另一种方式是基于 node-addon-api 使用 C++ 语言开发,node-addon-api 项目是对 Node-API 的 C++ 再包装,这种方式可以精简很多代码。

全局安装 node-gyp 工具,它是专门为构建开发、编译原生模块环境而生的跨平台命令行工具。

npm install -g node-gyp

新建一个 Node.js 项目,安装 node-addon-api:

src 目录下新建文件夹 native。

初始化 Node.js 项目:

npm init -y
npm install node-addon-api

创建原生模块配置文件 binding.gyp:

{
  "targets": [
    {
      "cflags!": ["-fno-exceptions"],
      "cflags_cc!": ["-fno-exceptions"],
      "defines": ["NAPI_DISABLE_CPP_EXCEPTIONS"],
      "target_name": "addon",
      "include_dirs": ["<!(node -p \"require('node-addon-api').include_dir\")"],
      "sources": ["export.cc"],
      "conditions": [
        [
          'OS=="mac"',
          {
            "sources": ["clipboard.mm"],
            "link_settings": {
              "libraries": ["-framework Cocoa", "-framework CoreFoundation"]
            },
            "xcode_settings": {
              "GCC_ENABLE_CPP_EXCEPTIONS": "YES",
              "CLANG_ENABLE_OBJC_ARC": "YES",
              "OTHER_CFLAGS": ["-ObjC++", "-std=c++17"]
            }
          }
        ],
        [
          'OS=="win"',
          {
            "sources": ["clipboard.cc"],
            "libraries": ["Shlwapi.lib", "Shcore.lib"],
            "msvs_settings": {
              "VCCLCompilerTool": {
                "AdditionalOptions": ["/std:c++17"]
              }
            }
          }
        ]
      ]
    }
  ]
}
  • include_dirs 配置 node-addon-api 项目提供的 C++ 头文件所在路径。
  • defines、cflags_cc!、 cflags!起到禁用 C++ 异常的作用(注意,如果选择禁用 C++ 异常,那么 node-addon-api 框架将不再为开发者处理异常,需要自己检查异常)。
  • sources 指向这个原生模块的入口文件。
  • target_name 为原生模块的名称。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文