文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
搭建开发环境
一种方式是通过 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论