目录

nodejs搭建electron插件笔记记录

nodejs搭建electron插件笔记记录

一、解决 ‘cmake-js’缺失问题

package.json内容如下:


{
  "name": "testNode",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "build": "cmake-js build",
    "build-debug": "cmake-js build --debug",
    "rebuild": "cmake-js rebuild",
    "rebuild-debug": "cmake-js rebuild --debug"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "cmake-js": "^7.3.1",
    "node-gyp": "^11.4.2"
  },
  "dependencies": {
    "bindings": "^1.5.0",
    "node-addon-api": "^8.5.0"
  }
}

执行"scripts"中定义的命令: npm run rebuild-debug

出现以下报错:

‘cmake-js’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

说明你在 package.json 里配置了 cmake-js,但是项目里 没有安装 cmake-js

解决方法
安装 cmake-js,在项目根目录运行:


npm install --save-dev cmake-js

这样 node_modules/.bin/cmake-js 就会出现,npm run … 脚本就能找到它。

检查是否安装成功

安装完成后,可以运行:


npx cmake-js --version

如果能正常输出版本号,说明 cmake-js 安装成功。

二、#include <napi.h>和#include <node_api.h>有什么区别

node_api.h

是Node.js 官方内置头文件(N-API C API),是纯 C 语言接口的。它提供最基础的 N-API 函数,例如:


napi_value napi_create_string_utf8(napi_env env, const char* str, size_t length, napi_value* result); 
napi_status napi_get_undefined(napi_env env, napi_value* result);

该头文件的特点就是 接口非常底层,几乎和V8引擎是绑定的,使用时需要大量手动的管理napi_env、napi_value值,写法相对比较繁琐一些,是Node.js自带的头文件,不需要额外执行安装操作,兼容性更好。适合想完全控制N-API、追求性能或兼容性的开发者。

napi.h

napi.h来自 node-add-api npm包,是在node_api.h的基础上用C++封装了一层,可以支持C++风格,例如:


#include <napi.h> 

Napi::String Hello(const Napi::CallbackInfo& info) { 
    return Napi::String::New(info.Env(), "Hello"); 
}

好处在于面向对象,封装了Napi::String, Napi::Object, Napi::Function 等类,符合更现代的C++写法,不需要直接处理 napi_env/napi_value这些值了,但是需要安装依赖:npm install node-addon-api,适合大部分开发场景,代码简洁,维护方便。

综上所述,加上原来旧代码适用的是node_api.h,为了保持统一性和前端不同平台安装时减少去安装时出现兼容性问题,采用node_api.h的方式。

三、package.json 中 “main”: “index.js”, 代表什么

package.json中有一个字段 “main”,代表的是 这个 npm 包的入口文件,也就是当别人使用 require('your-package')import ... from 'your-package' 时,Node.js 默认会去加载的文件。

package.json中的字段 “main”制定了模块的主文件,如果没有“main”这个字段,Node.js默认会尝试加载index.js或者index.json,但是显示指定是更可靠安全的。

使用场景有如下几种:

场景一

假设package.json的main字段指定了 index.js,那么


const addon = require('addon'); // Node 会加载 addon/index.js

这样一旦在node modules里执行了addon模块,就可以直接使用模块导出的内容,不需要写具体的文件路径了。

场景二

“main”字段是可以指向任意文件的,可以是js、cjs、esm甚至绑定node原生的addon(.node)文件。路径是相对于package.json来说的。如果指定的文件不存在,require会报错。

总而言之,main指定了electron require引用的时候首先加载的文件,告诉 electron/node.js,从这个文件开始加载模块。