当前位置: 首页 > news >正文

【HarmonyOS Next NAPI 深度探索1】Node.js 和 CC++ 原生扩展简介

【HarmonyOS Next NAPI 深度探索1】Node.js 和 CC++ 原生扩展简介

如果你用过 Node.js,应该知道它强大的地方在于能处理各种场景,速度还很快。但你有没有想过,Node.js 的速度秘密是什么?今天我们来聊聊其中一个幕后英雄——原生扩展,特别是如何通过 C/C++ 把 JavaScript 的能力进一步放大。

原生扩展是什么

简单来说,原生扩展就是用 C/C++ 写的模块,能直接跟 Node.js 一起工作。它的核心作用是:

  1. 提升性能:当 JavaScript 在处理计算密集型任务(比如图像处理、音频编解码)时效率不高,就可以用原生扩展来加速。
  2. 调用底层系统功能:JavaScript 本身无法直接访问操作系统底层,但 C/C++ 可以。所以,通过扩展,我们能让 JavaScript 调用底层 API。
  3. 复用现有 C/C++ 库:很多高性能库是用 C/C++ 写的,比如 OpenCV(图像处理)或 FFmpeg(多媒体处理)。通过扩展,Node.js 开发者也能用上这些工具。

一句话,原生扩展就是给 JavaScript 装上了“超能力”。

为什么需要原生扩展

虽然 Node.js 非常高效,但它本质上是单线程的,处理大量计算时会比较吃力。举个例子:
场景 1:音频处理
假设你需要开发一个实时音频编辑器,纯用 JavaScript 写的话可能会卡顿,因为大量计算会占满主线程。用 C/C++ 写一个音频处理扩展,不仅速度更快,还能释放主线程去处理别的事情。

场景 2:设备驱动
想控制一些硬件,比如传感器或摄像头?JavaScript 可直接支持不了这些。但通过 C/C++ 写个驱动扩展,Node.js 也能轻松控制硬件。

这些都是原生扩展的用武之地。

Node.js 如何支持 C/C++ 原生扩展

Node.js 能支持原生扩展,主要靠两个工具:

  1. V8 引擎
    Node.js 使用了 Google 的 V8 引擎,它把 JavaScript 转成了机器码,同时提供了一套 C++ 接口(叫 V8 API),让开发者能用 C++ 操作 JavaScript 对象。
  2. N-API
    写原生扩展并不简单,直接用 V8 API 太麻烦。所以 Node.js 提供了一个更易用的接口——N-API,让我们可以更方便地用 C/C++ 开发扩展。

通过 N-API,你可以:

  • 用 C++ 写模块的核心逻辑
  • 把模块暴露给 JavaScript,让 JavaScript 调用你的扩展功能
原生扩展的应用场景

以下是几个常见场景,看看是不是跟你有关:

  • 高性能需求:如图片压缩、视频编码、数据加密
  • 硬件交互:如机器人控制、传感器数据采集
  • 跨语言桥接:用原生扩展把其他语言的功能带到 JavaScript,比如 Python 或 Rust
如何开始开发原生扩展

开发原生扩展需要几个前提:

  1. 安装 Node.js 和 C++ 编译器(比如 Windows 上用 MSVC,Linux 和 MacOS 用 GCC/Clang)
  2. 安装 node-gyp,它是编译扩展模块的工具
  3. 写一个简单的 C++ 文件,用 N-API 提供的接口暴露一个功能,比如打印 “Hello World”

代码看起来像这样:

#include <napi.h>Napi::String HelloWorld(const Napi::CallbackInfo& info) {Napi::Env env = info.Env();return Napi::String::New(env, "Hello World from C++!");
}Napi::Object Init(Napi::Env env, Napi::Object exports) {exports.Set(Napi::String::New(env, "helloWorld"), Napi::Function::New(env, HelloWorld));return exports;
}NODE_API_MODULE(hello, Init)

然后,通过 node-gyp 编译后,在 JavaScript 中可以这样调用:

const hello = require('./build/Release/hello');
console.log(hello.helloWorld()); // 输出: Hello World from C++!
总结

Node.js 和 C/C++ 原生扩展的结合,让我们可以突破 JavaScript 的性能瓶颈,甚至操作底层硬件。虽然开发过程稍微复杂些,但带来的性能提升和功能扩展绝对值得一试。如果你对高性能开发感兴趣,这是个很棒的领域。接下来,我们会讲解如何搭建开发环境,以及用 N-API 创建第一个模块,敬请期待!

相关文章:

【HarmonyOS Next NAPI 深度探索1】Node.js 和 CC++ 原生扩展简介

【HarmonyOS Next NAPI 深度探索1】Node.js 和 CC 原生扩展简介 如果你用过 Node.js&#xff0c;应该知道它强大的地方在于能处理各种场景&#xff0c;速度还很快。但你有没有想过&#xff0c;Node.js 的速度秘密是什么&#xff1f;今天我们来聊聊其中一个幕后英雄——原生扩展…...

redis的学习(四)

13. 渐进式遍历 通过渐进式遍历能够获取当前所有的key&#xff0c;又不会讲当前的服务器卡死。不是一个命令将所有的key获取&#xff0c;而是每执行一次命令&#xff0c;只获取到其中的一部分。所以想要获取到所有的key就需要多次遍历&#xff0c;即化整为零的思想。 渐进式遍历…...

C# winform 多线程 UI更新数据 报错:无法访问已释放的对象。

System.ObjectDisposedException HResult0x80131622 Message无法访问已释放的对象。 ObjectDisposed_ObjectName_Name SourceSystem.Windows.Forms StackTrace: at System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, …...

error: linker `link.exe` not found

开始学习rust&#xff0c;安装好rust的环境&#xff0c;开始从hello world开始&#xff0c;结果用在win10环境下&#xff0c;使用vs code或cmd窗口编译rust报错&#xff1a; PS E:\study_codes\rust-demo\chart01> rustc hello.rs error: linker link.exe not found| note:…...

Vue.js组件开发-如何使用moment.js

在Vue.js组件开发中&#xff0c;需要处理日期和时间&#xff0c;moment.js 是一个非常有用的库。moment.js 提供了丰富的API来解析、验证、操作和显示日期和时间。 步骤&#xff1a; 1. 安装moment.js 首先&#xff0c;需要通过npm或yarn安装moment.js。在项目根目录下运行以…...

Linux第二课:LinuxC高级 学习记录day01

0、大纲 0.1、Linux 软件安装&#xff0c;用户管理&#xff0c;进程管理&#xff0c;shell 命令&#xff0c;硬链接和软连接&#xff0c;解压和压缩&#xff0c;功能性语句&#xff0c;结构性语句&#xff0c;分文件&#xff0c;make工具&#xff0c;shell脚本 0.2、C高级 …...

《DOM NodeList》

《DOM NodeList》 介绍 DOM&#xff08;文档对象模型&#xff09;是HTML和XML文档的编程接口&#xff0c;它允许开发者在JavaScript等编程语言中操作文档的结构、样式和内容。在DOM中&#xff0c;NodeList是一个重要的接口&#xff0c;它表示一个包含节点&#xff08;如元素、…...

Nginx代理同域名前后端分离项目的完整步骤

前后端分离项目&#xff0c;前后端共用一个域名。通过域名后的 url 前缀来区别前后端项目。 以 vue php 项目为例。直接上 server 模块的 nginx 配置。 server{ listen 80; #listen [::]:80 default_server ipv6onlyon; server_name demo.com;#二配置项目域名 index index.ht…...

uniapp页面高度设置(铺满可视区域、顶部状态栏高度、底部导航栏高度)

这里说几种在uniapp开发中,关于页面设置高度的几种情况。宽度就不说了哈,宽度设置百分比都会生效。 首先我们要知道平时开发中,如果说没在uniapp做特殊处理,即正常情况下,所有的页面(.vue文件)中都是没有高度的(和vue一样),也就是说给最外层的的view标签设置高度为1…...

解锁 RAG 技术:从原理、论文研读走向实战应用RAG

亲爱的小伙伴们&#x1f618;&#xff0c;在求知的漫漫旅途中&#xff0c;若你对深度学习的奥秘、Java 与 Python 的奇妙世界&#xff0c;亦或是读研论文的撰写攻略有所探寻&#x1f9d0;&#xff0c;那不妨给我一个小小的关注吧&#x1f970;。我会精心筹备&#xff0c;在未来…...

HTML5实现好看的中秋节网页源码

HTML5实现好看的中秋节网页源码 前言一、设计来源1.1 网站首页界面1.2 登录注册界面1.3 节日由来界面1.4 节日习俗界面1.5 节日文化界面1.6 节日美食界面1.7 节日故事界面1.8 节日民谣界面1.9 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看…...

数字孪生笔记 1 工业数字孪生的意义

什么是工业数字孪生&#xff1f; 很多在做这个工作研究的同学最开始都想问的一个问题。到底什么才是数字孪生&#xff1f;我在五年前做数字孪生的时候也在思考这个问题。五年时间从数字孪生兴起&#xff0c;到元宇宙爆发&#xff0c;再到数字孪生和元宇宙没人提起&#xff0c;…...

013:深度学习之神经网络

本文为合集收录&#xff0c;欢迎查看合集/专栏链接进行全部合集的系统学习。 合集完整版请参考这里。 深度学习是机器学习中重要的一个学科分支&#xff0c;它的特点就在于需要构建多层且“深度”的神经网络。 人们在探索人工智能初期&#xff0c;就曾设想构建一个用数学方式…...

计算机网络(四)网络层

4.1、网络层概述 简介 网络层的主要任务是实现网络互连&#xff0c;进而实现数据包在各网络之间的传输 这些异构型网络N1~N7如果只是需要各自内部通信&#xff0c;他们只要实现各自的物理层和数据链路层即可 但是如果要将这些异构型网络互连起来&#xff0c;形成一个更大的互…...

【ArcGIS微课1000例】0138:ArcGIS栅格数据每个像元值转为Excel文本进行统计分析、做图表

本文讲述在ArcGIS中,以globeland30数据为例,将栅格数据每个像元值转为Excel文本,便于在Excel中进行统计分析。 文章目录 一、加载globeland30数据二、栅格转点三、像元值提取至点四、Excel打开一、加载globeland30数据 打开配套实验数据包中的0138.rar中的tif格式栅格土地覆…...

Linux 中统计进程的线程数 | 查看进程的线程

注&#xff1a;本文为 “Linux 线程” 相关文章合辑。 在 Linux 中统计一个进程的线程数 作者&#xff1a;Dan Nanni 译者&#xff1a; LCTT struggling | 2015-09-17 10:29 在 Linux 中一个程序在运行时会派生出多个线程。检查每个进程的线程数&#xff0c;有以下几种方法可…...

【深度学习 】训练过程中loss出现nan

[toc]【深度学习 】训练过程中loss出现nan 训练过程中loss出现nan 在深度学习中&#xff0c;loss 出现 NaN 通常是由数值不稳定或计算错误引起的。 1. 学习率过高 原因: 学习率过大可能导致权重更新幅度过大&#xff0c;引发数值不稳定。 解决方法: 降低学习率&#xff0c;…...

Linux - 什么是线程和线程的操作

线程概念 什么是线程: 线程&#xff08;Thread&#xff09;是操作系统能够进行运算调度的最小单位. 它被包含在进程之中, 是进程中的实际运作单位. 一个进程可以包含多个线程. 进程 : 线程 1 : n (n > 1). 进程是系统分配资源的基本单位. 线程则是系统调度的基本单位. 在…...

windows及linux 安装 Yarn 4.x 版本

1. 确保系统环境准备 a. 安装 Node.js Yarn 依赖于 Node.js,所以需要先安装 Node.js。前往 Node.js 官网 下载并安装适合你的 Windows 版本的 Node.js(推荐 LTS 版本)。安装完成后,打开命令提示符(CMD)或 PowerShell,验证安装:node -v npm -v如果显示版本号,则表示安…...

如何设计一个 RPC 框架?需要考虑哪些点?

面试官&#xff1a;如何设计一个 RPC 框架&#xff1f;需要考虑哪些点&#xff1f; 设计一个远程过程调用&#xff08;RPC&#xff09;框架是一个复杂的系统工程&#xff0c;涉及多个方面的考虑。一个好的 RPC 框架应具备可扩展性、灵活性、易用性和高性能。下面是设计 RPC 框…...

Unity UGUI轻量UI框架:200行代码实现零GC界面管理

1. 为什么还要自己手写UI框架&#xff1f;——当UGUI原生方案开始“卡脖子”很多人看到这个标题第一反应是&#xff1a;“都2024年了&#xff0c;还手写UI框架&#xff1f;Asset Store里几十个成熟方案&#xff0c;NGUI、FairyGUI、TextMeshPro配套的UI系统一抓一大把&#xff…...

STM32单片机学习(27) —— SPI相关概念

文章目录概述SPI通信的核心特性I2C和SPI的简单对比SPI学习的补充说明SPI硬件电路设计SPI的四条通信线SPI通信的片选线低电平选中不支持广播通信SPI通信的时序结构&#xff08;重点&#xff09;SPI通信的比特序通信空闲状态&#xff0c;SPI时钟极性采样时机&#xff0c;SPI时钟相…...

从分立逻辑到单片机:基于ATmega8的MIDI通道分析仪设计与实现

1. 项目概述&#xff1a;从分立逻辑到单片机的MIDI通道分析仪进化史二十年前&#xff0c;当我在《Elektor》杂志上发表第一版MIDI通道分析仪时&#xff0c;整个数字音乐世界还处于一个相当“硬核”的阶段。那个版本的设计&#xff0c;用今天的话来说&#xff0c;简直就是一场“…...

FeHelper前端助手:30+开发工具集,让你的浏览器变身效率神器

FeHelper前端助手&#xff1a;30开发工具集&#xff0c;让你的浏览器变身效率神器 【免费下载链接】FeHelper &#x1f60d;FeHelper--Web前端助手&#xff08;Awesome&#xff01;Chrome & Firefox & MS-Edge Extension, All in one Toolbox!&#xff09; 项目地址:…...

Burp Suite证书安装全解:HTTPS抓包失败的根源与跨平台命令行方案

1. 为什么必须亲手安装Burp Suite证书——不是“点一下就完事”的操作很多人第一次在手机或测试设备上配置Burp Suite代理时&#xff0c;会下意识认为&#xff1a;只要把电脑上的Burp监听地址填进Wi-Fi代理设置&#xff0c;再用浏览器访问http://burp&#xff0c;点击那个绿色的…...

NanaZip:现代Windows文件压缩问题的终极解决方案

NanaZip&#xff1a;现代Windows文件压缩问题的终极解决方案 【免费下载链接】NanaZip The 7-Zip derivative intended for the modern Windows experience 项目地址: https://gitcode.com/gh_mirrors/na/NanaZip 还在为Windows文件压缩工具界面老旧、功能单一而烦恼吗&…...

学习日志(三)【php语法学习,iscc校赛wp】

1. 任务 1.1.1.1.1.1. 知识部分 rce看【之前的笔记&#xff1f;】php的知识点学习继续jwt token好像是比赛的题目考察内容&#xff0c;我看看php伪协议 1.1.1.1.1.2. 题目 参加iscc比赛【五一】rce题目 1.1.1.1.1.3. 环境配置 把vscode搞好&#xff0c;上学期没有把Php配…...

大厂校招变了:AI 能力正在进入笔试和面试

最近不少同学投递校招时&#xff0c;应该已经发现一个变化&#xff1a; 以前 JD 里写的是“熟悉 Python / Java / SQL / Office 优先”。 现在越来越多岗位开始出现新的描述&#xff1a; “熟练使用 AI 工具者优先” “了解大模型应用者优先” “具备 AI 辅助编程经验优先” “…...

三步破解百度网盘限速:免费获取真实下载链接的终极指南

三步破解百度网盘限速&#xff1a;免费获取真实下载链接的终极指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘几十KB的龟速下载而苦恼吗&#xff1f;想要彻…...

深入解析NxDumpTool:Switch游戏文件系统提取的终极指南 [特殊字符]

深入解析NxDumpTool&#xff1a;Switch游戏文件系统提取的终极指南 &#x1f3ae; 【免费下载链接】nxdumptool Generates XCI/NSP/HFS0/ExeFS/RomFS/Certificate/Ticket dumps from Nintendo Switch gamecards and installed SD/eMMC titles. 项目地址: https://gitcode.com…...