Node.js来一打C++扩展--第一、二章

周末在家磨磨唧唧了一上午,原因是作为一个学渣还在不停的逼迫自己痛苦的啃食编程书籍,读书的时候也是被动学习,如今工作了,稀里糊涂进入这一行,发现有很多自我否定的瞬间,也不知道这些年我是怎么过来的,依然还在这条路上且慢且行。好吧,既然已经做出了选择,那就把啃书打码变成一种习惯吧。接下里记录一下死月这本书的总结。
第一章 Node.js的c++扩展前驱知识储备

第一章

1、模块机制

common.js模块规范

  • require
  • 模块上下文
  • 模块标识
  • 未指定的约定
//math.js
exports.add=()=>{
  var sum=0,i=0, args=arguments,1=args.length;
  while(i<1){
    sum+=args[i++];
 }
 return sum
}
//increments.js
let add=require('math').add;
exports.increment=(val)=>{
  return add(val, 1);
}
//program.js
let inc=require('increment').increment;
let a=1;
inc(a);//2
module.id=='program'

2、包机制

包格式

common.js包的格式是一个包含整个包目录
目录结构:

  • package.json在根目录下
  • 二进制文件应当在bin目录下
  • javascript源码在lib目录下
  • 文档应该在doc目录下
  • 单元测试文件应当在test目录下

CNPM

工作原理:将一些包缓存在node_modules/.npminstall目录下,再以符号链接(Symbol Link)的形式将依赖目录连接到其对应的路径。这样相同版本的包在安装过程中实际上只要一份实体。

3、依赖

chromeV8

V8会编译、执行js代码,一样会管理内存,垃圾回收等,V8高性能以及跨平台等特性
高效的4个特性
- JIT编译:即时编译
- 垃圾回收:JAVA VM的精确垃圾回收管理
- 内联缓存:确定属性偏移量,提高属性访问效率
- 隐藏类:对一个对象增加和修改属性的功能
V8为nodejs做的事情:
1、在chrome开发者工具中调试node.js
2、加速ES6
3、针对Node.js vm模块和REPL的一些修复
4、Async/await

libuv

nodejs的事件循环驱动
亮点特性:

  • 基于epoll/kqueue/IOCP/event ports实现的全能事件循环
  • 异步TCP和UDP套接字
  • 异步DNS解析
  • 异步文件、文件系统操作
  • 文件系统事件
  • ANSI转义码控制的TTY
  • 使用UNIX domain套接字或者命名管道实现的套接字共享IPC;
  • 子进程
  • 线程池
  • 信号处理
  • 高精度时钟
  • 线程和同步元

其他依赖

1、http-parser
能解析http协议的请求数据和返回数据
特性如下:

  • 无依赖
  • 持久化连接的流式处理keep-alive
  • 分段信息chunk的解码
  • 缓冲区溢出攻击的防御
    该依赖主要解析HTTP消息中下面的一些内容:
    1、消息头键值对header
    2、内容长度Content-Length
    3、请求方法(GET、POST、PUT DELETE等)
    4、返回状态吗status code
    5、传输编码(Transfer-Encoding)
    6、HTTP版本;
    7、请求地址(URL)
    8、消息体

2、OpenSSL
安全套接字层协议库
SSL就是Secure Socket Layer的缩写,其可以在网络上提供秘密性传输。SSL包含记录层(Record Layer)和传输层,记录层协议确定传输层数据的封装格式。传输层安全协议使用X.509认证,之后利用非对称加密演算来对通信方做身份认证,之后交换对称密钥作为会谈密钥。
3、Zlib 提供数据压缩功能的库

4、c++开发的环境准备

编辑器vs code
node-gyp:Python2.7 c++

  • node-gyp build
  • node-gyp clean
  • node-gyp configure
  • node-gyp rebuild
  • node-gyp list
  • node-type remove

第二章

使用c++来写Nodejs原生扩展的两大理由

性能更好,开发成本低,但是维护成本比较高,所以Nodejs只选择了一部分使用c++写法

c++扩展本质

在Nodejs中引入一个C++模块的过程,实际上就是Node.js在运行时引入了一个动态链接库的过程

几种模块的加载过程

1、C++核心模块
通过NODE_MODULE_CONTEXT_AWARE_BUILTIN等宏将不同的模块注册进Node.js C++核心模块链表中
2、Nodejs内置模块
会在Nodejs编译时被写入C++源码中并被编译到Node.js可执行二进制文件中,并在恰当的时机被拿出来闭包化导出
3、用户源码模块
会在首次执行require的时候被读取源码并闭包化导出,然后再加入模块缓存中
4、C++扩展
会在首次执行require时候通过uv_dlopen加载该扩展的*.node动态链接库文件,在链接库内部把模块注册函数赋值给modpending,然后将执行reuqire时传入的module和exports两个对象传入模块注册函数进行导出
[TOC]

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
本书主要介绍了运用Visual C++ 5.0或6.0的高级编程技巧,内容涉及MFC程序设计的最新概念,全书提供了大量VC的编程实例,旨在帮助读者较为全面地掌握VC编程知识、技巧和方法。全书分为三个部分和附录。第一部分介绍Windows编程的基础知识,第二部分讲解用户界面编程技巧,最后一部分涉及Windows内部进程的一些实例。本书思路清晰,实用性强,是计算机应用人员及大专院校师生不可多得的参考书。 目 录 第一部分 基础 第1章 概述 1 1.1 Windows基础 1 1.1.1 窗口类结构 2 1.1.2 消息 2 1.1.3 客户区和非客户区 2 1.1.4 重叠窗口、弹出窗口和子窗口 2 1.1.5 父窗口和宿主窗口 3 1.2 Windows消息 3 1.2.1 发送或寄送消息 4 1.2.2 消息类型 4 1.2.3 接收消息 4 1.2.4 窗口处理函数的子类化 5 1.3 窗口绘图 5 1.3.1 设备环境 5 1.3.2 绘图工具 6 1.3.3 映射模式 6 1.3.4 窗口视和视口视 6 1.3.5 逻辑单位和设备单位 7 1.3.6 绘图函数 7 1.3.7 抖动和非抖动颜色 7 1.3.8 设备无关位图 8 1.3.9 元文件 8 1.3.10 何时绘图 8 1.4 MFC基础 8 1.5 Developer Studio基础 9 1.6 Windows和MFC总结 10 1.7 基本类 10 1.8 应用类 11 1.8.1 文档视 11 1.8.2 CWinApp(OC) 11 1.8.3 文档模板 12 1.8.4 线程 12 1.8.5 CFrameWnd(OCW) 12 1.8.6 CDocument(OC) 12 1.8.7 CView(OCW) 13 1.8.8 对话框应用程序 13 1.8.9 SDI应用程序 13 1.8.10 MDI应用程序 13 1.9 其余用户界面类 13 1.9.1 通用控件类 13 1.9.2 菜单类(O) 14 1.9.3 对话框类 15 1.9.4 通用对话框MFC类 15 1.9.5 控件条类 (OCW) 15 1.9.6 属性类 15 1.10 绘图类 16 1.11 其他MFC类 16 1.11.1 文件类 16 1.11.2 CArchive和序列化 16 1.11.3 数据库类 17 1.11.4 ODBC类 17 1.11.5 DAO类 17 1.11.6 数据集合类 17 1.11.7 通信类 18 1.12 类的消息机制 18 1.12.1 MFC如何接收一个寄送消息 18 1.12.2 MFC如何处理接收的消息 18 1.12.3 UI对象 20 1.13 小 结 20 第2章 控制条 21 2.1 通用控制条 21 2.2 用API创建控制条 22 2.3 用MFC创建控制条 24 2.3.1 CToolBarCtrl和CStatusBarCtrl 24 2.3.2 CToolBar和CStatusBar 24 2.3.3 CControlBar 26 2.4 停靠栏 27 2.4.1 设置停靠功能 28 2.4.2 自动改变大小和移动 30 2.4.3 停靠栏小结 30 2.5 浮动条 31 2.6 MFC的高级控制条类小结 32 2.7 视和控制条如何共享客户区 32 2.7.1 CFrameWnd::RecalcLayout() 32 2.7.2 CWnd::RepositionBars() 33 2.7.3 CControlBar::OnSizeParent() 33 2.7.4 CalcDynamicLayout()和 CalcFixedLayout () 34 2.7.5 CToolBar::CalcFixedLayout()和CTool Bar:: CalcDynamicLayout() 35 2.7.6 工具栏布局 35 2.7.7 CStatusBar::CalcFixedLayout() 36 2.7.8 CDockBar::CalcFixedLayout() 36 2.7.9 共享客户区小结 36 2.8 对话条 37 2.9 伸缩条 38 2.9.1 CReBar和CReBarCtrl 39 2.9.2 CReBar::CalcFixedLayout() 39 2.10 命令条 39 2.11 控制条窗口小部件风格 40 2.11.1 工具栏按钮风格 40 2.11.2 状态栏窗格风格 40 2.11.3 伸缩条段风格 40 2.12 设计自己的控制条 41 2.12.1 重载CControlBar::CalcDynamic-Layout() 41 2.12.2 增加WM_SIZEPARENT消息处理器 41 2.12.3 重载CMainFrame::RecalcLayout() 41 2.12.4 从CDockBar派生 42 2.13 实例 42 2.14 总结 42 第3章 通信 43 3.1 进程间通信 43 3.1.1 通信策略 43 3.1.2 同步和异步通信 44 3.2 窗口消息 44 3.2.1 打开和关闭 44 3.2.2 读与写 45 3.2.3 回顾 45 3.3 动态数据交换 46 3.3.1 客户/服务器 46 3.3.2 打开和关闭 46 3.3.3 读和写 47 3.3.4 其他DDE函数 48 3.3.5 MFC支持 48 3.3.6 回顾 49 3.4 消息管道 49 3.4.1 打开和关闭 49 3.4.2 读和写 50 3.4.3 回顾 51 3.5 Windows套接字 51 3.5.1 打开和关闭 52 3.5.2 读和写 52 3.5.2 通过Windows套接字序列化 53 3.5.3 数据流和数据报 53 3.5.4 回顾 54 3.6 串行/并行通信 54 3.6.1 打开和关闭 54 3.6.2 读和写 54 3.6.3 配置端口 55 3.6.4 回顾 55 3.7 Internet通信 56 3.7.1 打开和关闭文件 56 3.7.2 读文件 56 3.7.3 打开和关闭连接 56 3.7.4 其他Internet类 57 3.8 通信方式小结 57 3.9 共享数据 58 3.10 共享内存文件 58 3.10.1 创建和销毁 58 3.10.2 读和写 58 3.10.3 回顾 59 3.11 文件映射 59 3.11.1 打开和关闭 59 3.11.2 读和写 60 3.11.3 数据同步 60 3.11.4 回顾 60 3.12 客户/服务器 61 3.12.1 传递调用参数 61 3.12.2 远程过程调用 62 3.13 小结 62 第二部分 用户界面实例 第4章 应用程序和环境 64 4.1 实例1:在工具栏中添加静态标识符 64 4.2 实例2:在工具栏中添加动态标识符 71 4.3 实例3:只启动一个实例 75 4.4 实例4:创建对话框/MDI混合式 应用程序 77 4.5 实例5:在系统托盘中添加图标 79 4.6 实例6: 主菜单状态栏中的标记 81 第5章 菜单、控件条和状态栏 85 5.1 实例7:在菜单中添加图标 85 5.2 实例8:调整命令条外观 97 5.3 实例9:可编程工具栏 102 5.4 实例10:在对话框中添加工具栏、 菜单和状态栏 127 5.5 实例11:在弹出菜单中增加位图标记 129 5.6 实例12:工具栏上的下拉按钮 131 5.7 实例13:在状态栏中添加图标 136 5.8 实例14:使用伸缩条 141 第6章 视 143 6.1 实例15:创建标签窗体视 143 6.2 实例16:创建具有通用控件的视 150 6.3 实例17 :打印报表 156 6.4 实例18: 打印视 167 6.5 实例19:绘制MDI客户视 174 6.6 实例20:拖放文件到视 177 第7章 对话框和对话条 179 7.1 实例21:动态改变对话框的尺寸 179 7.2 实例22:自定义数据交换并验证 184 7.3 实例23:重载通用文件对话框 187 7.4 实例24:重载通用颜色对话框 190 7.5 实例25:获得目录名 192 7.6 实例26:子对话框 197 7.7 实例27:子属性表 198 第8章 控件窗口 200 8.1 实例28:自己绘制的控件 200 8.2 实例29:在窗口标题中添加按钮 204 8.3 实例30:添加热键控件 211 第9章 绘图 213 9.1 实例31:使用非散射颜色 213 9.2 实例32:伸展位图 227 9.3 实例33:抓取屏幕 231 9.4 实例34:输出DIB位图文件 236 第10章 帮助 243 10.1 实例35:添加帮助菜单项 243 10.2 实例36:添加上下文相关帮助 245 10.3 实例37:添加气泡帮助 247 第11章 普通窗口 254 11.1 实例38:创建普通窗口 254 11.2 实例39:创建短调用形式窗口类 256 11.3 实例40:创建长调用形式窗口类 258 第12章 特定的应用程序 261 12.1 实例41:创建简单的文本编辑器 261 12.2 实例42:生成简单的RTF编辑器 262 12.3 实例43:创建资源管理器界面 265 12.4 实例44:创建简单的ODBC数据库 编辑器 284 12.5 实例45:创建简单的DAO数据库 编辑器 287 12.6 实例46:创建简单的向导 289 第三部分 内部处理实例 第13章 消息和通信 295 13.1 实例47:等待消息 296 13.2 实例48:清除消息 297 13.3 实例49:向其他应用程序发送消息 298 13.4 实例50:与其他应用程序共享数据 300 13.5 实例51:使用套接字与任意的应用 程序通信 301 13.6 实例52:使用串行或并行I/O 321 第14章 多任务 331 14.1 实例53:后台处理 331 14.2 实例54:运行其他应用程序 332 14.3 实例55:改变优先级 334 14.4 实例56:应用程序内部的多任务 工作者线程 336 14.5 实例57:应用程序内部的多任务 —用户界面线程 339 14.6 实例58:向用户界面线程发送消息 342 14.7 实例59:线程间的数据共享 343 第15章 其他 347 15.1 实例60:创建定时器 347 15.2 实例61:播放声音 349 15.3 实例62:创建VC++宏 350 15.4 实例63:使用函数地址 351 15.5 实例64:二进制字符串 352 15.6 实例65:重新启动计算机 356 15.7 实例66:获得可用磁盘空间 357 15.8 实例67:闪烁窗口和文本 358 第四部分 附录 附录A 消息和重载顺序 361 附录B 绘图结构 385
CppWeb和Node.js是两种不同的技术,用于开发Web应用程序。下面是对它们的介绍和比较: 1. CppWeb: CppWeb是一个C++编写的开源Web框架,用于构建高性能的Web应用程序。它提供了一组功能强大的工具和库,使开发人员能够快速构建可扩展的Web应用程序。CppWeb使用C++语言编写,因此它可以提供更高的性能和更低的资源消耗。它支持多线程和异步处理,可以处理大量并发请求。CppWeb还提供了丰富的功能,如路由、模板引擎、数据库访问等,使开发人员能够轻松构建复杂的Web应用程序。 2. Node.jsNode.js是一个基于Chrome V8引擎的JavaScript运行时,用于构建高性能的网络应用程序。它使用事件驱动、非阻塞I/O模型,使得可以处理大量并发请求而不会阻塞线程。Node.js使用JavaScript语言编写,因此它具有很高的开发效率和灵活性。它还提供了丰富的模块和库,使开发人员能够轻松构建各种类型的应用程序,包括Web应用程序、实时通信应用程序等。 比较: - 语言:CppWeb使用C++语言,而Node.js使用JavaScript语言。 - 性能:由于CppWeb使用C++语言编写,因此它可以提供更高的性能和更低的资源消耗。而Node.js使用V8引擎,也具有很高的性能。 - 生态系统:Node.js拥有庞大的生态系统,有大量的第三方模块和库可供使用。而CppWeb的生态系统相对较小。 - 开发效率:由于Node.js使用JavaScript语言,具有很高的开发效率和灵活性。而CppWeb使用C++语言,开发相对较为复杂。 总结: CppWeb和Node.js都是用于构建Web应用程序的技术,但它们使用不同的语言和技术栈。选择哪种技术取决于项目需求、开发团队的技术栈和个人偏好。如果对性能要求较高且熟悉C++语言,可以选择CppWeb;如果对开发效率和灵活性要求较高,可以选择Node.js

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值