首页 > 编程语言 >使用cmake-js 构建node addon

使用cmake-js 构建node addon

时间:2023-11-20 20:34:07浏览次数:43  
标签:node cmake ts js Napi addon

cmake-js 是nodejs 包装的cmake,可以用来方便的进行nodejs native 项目的构建,以下是一个试用

简单项目

  • 项目结构
├── CMakeLists.txt
├── hello_world.cc
├── index.d.ts
├── lib
│   ├── binding.d.ts
│   └── binding.js
├── package.json
├── test.js
  • 代码说明
    hello_world.cc 基于node-addon-api 的addon 实现
 
#include <napi.h>
 
using namespace Napi;
 
Napi::String Method(const Napi::CallbackInfo& info) {
  Napi::Env env = info.Env();
  return Napi::String::New(env, "world");
}
 
Napi::Object Init(Napi::Env env, Napi::Object exports) {
  exports.Set(Napi::String::New(env, "HelloWorld"),
              Napi::Function::New(env, Method));
  return exports;
}
 
NODE_API_MODULE(hello_world, Init)

package.json 是对于以来以及包的一些定义

{
  "name": "@dalongrong/node-addon-second",
  "version": "1.0.0",
  "main": "lib/binding.js",
  "license": "MIT",
  "types": "index.d.ts", # typescript 类型定义
  "devDependencies": {
    "cmake-js": "^7.2.1"
  },
  # 打包依赖的文件
  "files": [
    "lib/*",
    "index.d.ts",
    "build/Release/*.node"
  ],
 # 依赖,按照实践 node-addon-api 应该放到dependencies 中
  "dependencies": {
    "bindings": "^1.5.0",
    "node-addon-api": "^7.0.0"
  },
  "scripts": {
   # 构建
    "build": "cmake-js compile",
    "p": "npm publish"
  },
  "publishConfig": {
    "access": "public",
    "registry": "https://registry.npmjs.org/"
  }
}

CMakeLists.txt cmake 定义

cmake_minimum_required(VERSION 3.20.0)
# 注意c++ 版本
cmake_policy(SET CMP0042 NEW)
set (CMAKE_CXX_STANDARD 11)
project (hello_world)
include_directories(${CMAKE_JS_INC})
file(GLOB SOURCE_FILES "hello_world.cc")
add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES} ${CMAKE_JS_SRC})
set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "" SUFFIX ".node")
target_link_libraries(${PROJECT_NAME} ${CMAKE_JS_LIB})
# 依赖处理
execute_process(COMMAND node -p "require('node-addon-api').include"
        WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
        OUTPUT_VARIABLE NODE_ADDON_API_DIR
        )
string(REPLACE "\n" "" NODE_ADDON_API_DIR ${NODE_ADDON_API_DIR})
string(REPLACE "\"" "" NODE_ADDON_API_DIR ${NODE_ADDON_API_DIR})
target_include_directories(${PROJECT_NAME} PRIVATE ${NODE_ADDON_API_DIR})
add_definitions(-DNAPI_VERSION=3)

lib/binding.js 模块包装,使用了bindings,简化native 的查找

const addon = require('bindings')('hello_world');
module.exports =  addon;

binding.d.ts 以及index.d.ts 主要是类型定义,方法代码提示

binding.d.ts 
export function HelloWorld():string;
index.d.ts 
export { HelloWorld } from './lib/binding';

test.js 主要是测试的

const test = require('./lib/binding');
console.log(test.HelloWorld())

构建&效果

  • 构建
yarn build
  • 运行效果
node test.js

说明

基于cmake-js 构建node addon 是一个很不错的选择,而且可以很好的与一些ide 集成

参考资料

https://nodejs.github.io/node-addon-examples/build-tools/cmake-js
https://github.com/cmake-js/cmake-js
https://www.npmjs.com/package/bindings
https://github.com/TooTallNate/node-bindings
https://nodejs.github.io/node-addon-examples/build-tools/node-gyp/
https://github.com/nodejs/node-gyp
https://nodejs.org/dist/latest/docs/api/n-api.html

标签:node,cmake,ts,js,Napi,addon
From: https://www.cnblogs.com/rongfengliang/p/17844779.html

相关文章

  • nvm--node.js的多版本管理
    背景接触的项目有点多,其中有些项目对node的版本有一定的要求。比如有个项目没有用npm或者yarn,而是用了pnpm。而pnpm8要求的node必须是大于等于v16.14,而且nodev17+目前是不兼容webpackv4,该项用用的是webpackv4,所以node的版本只能是大于等于v16.14,小于v17。而其他用npm或者y......
  • QDomNode
    QDomNode  PublicFunctions QDomNode() QDomNode(constQDomNode&n) ~QDomNode()QDomNodeappendChild(constQDomNode&newChild)QDomNamedNodeMapattributes()constQDomNodeListchildNodes()constvoidclear()QDomNodecloneN......
  • 使用Node.js 常见的问题
    "commandnotfound"错误 *解决方法:*在命令行中输入以下命令:bashsudoyuminstallnodejssudoyuminstallnpm使用btoa()和atob()函数处理字符串 *解决方案:*使用`Buffer.from()`和`.toString()`方法转换字符编码格式。设置NODE_ENV环境变量......
  • JSP接受POST请求参数
    代码如下:<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%><%@pageimport="org.json.JSONObject"%><%@pageimport="weaver.conn.RecordSet"%><%@pageimport="we......
  • js深拷贝function
    js拷贝函数怎么操作使用bind()方法JavaScript的函数提供了bind()方法,可以用来创建一个新函数,该函数与原函数具有相同的代码,但其上下文和部分参数可以绑定。通过使用空的上下文和参数,可以实现函数的拷贝。functionoriginalFunction(){console.log("Originalfunction")......
  • 原生JS使用window.location进行传参
    页面一发送location.href='./addUpdate.html?pageName=添加'页面二接受console.log(decodeURI(location.search.split('=')[1]));......
  • Ubuntu安装最新nodejs
    环境:Ubuntu20.04.6问题描述由于ubuntu默认的apt下载器只能下载较老版本的nodejs,而使用源代码编译又有点麻烦,因此这里采用github上官方推荐的方式,推荐看官方的教程,里面还介绍了nodejs和ubuntu的对应版本,地址如下:https://github.com/nodesource/distributions。安装步骤Dow......
  • 【开源】基于Vue.js的天然气工程运维系统的设计和实现
    一、摘要1.1项目介绍基于Vue+SpringBoot+MySQL的天然气工程运维系统,包含工程项目模块、材料档案模块、材料领用单模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,天然气工程运维系统基于角色的访问控制,给工程......
  • 安装install的项目的报错sass npm ERR! node-sass@4.14.1 postinstall: `node scripts
    npmERR!codeELIFECYCLEnpmERR!errno1npmERR!node-sass@4.14.1postinstall:`nodescripts/build.js`npmERR!Exitstatus1npmERR!npmERR!Failedatthenode-sass@4.14.1postinstallscript.npmERR!Thisisprobablynotaproblemwithnpm.Thereis......
  • Node.js精进(12)——ElasticSearch
    ElasticSearch(简称ES)是一款基于Lucene的分布式、可扩展、RESTful风格的全文检索和数据分析引擎,擅长实时处理PB级别的数据。一、基本概念1)LuceneLucene是一款开源免费、成熟权威、高性能的全文检索库,是ES实现全文检索的核心基础,而检索的关键正是倒排索引。2)倒......