zoukankan      html  css  js  c++  java
  • 一个java开发者对 Node 的认知

    本文记录对 Node 认知的改变

    之前,对于node的认知仅在于些个js 使用node命令来执行,最近接触到vue的前端项目,越发觉得对于前端的认知很是匮乏

    关于 node,我希望了解 node 是什么,如何进行工作的,便在网上查阅资料,在简书上看到这样一篇文章:

    Node内部工作原理解析: https://www.jianshu.com/p/a8f5a8cdc6ab

    该文章从 node 源码的角度分析其工作原理,给了我很大的帮助(我不是专业的前端技术人员,不敢对文章的好坏做出评价,仅表示对我了解 Node 的历程有很大帮助)

    Node 简介

    Node is a runtime environment for executing javascript code.  

    Node 不是一种语言,也不是一种框架,而是一个能够执行 JavaScript 代码执行的运行时环境。

    最初, JavaScript 仅支持在浏览器中,浏览器依赖JS引擎把JavaScript代码转换成浏览器能够识别的机器码,从而支持Javascript的执行,如 Chrome 的 V8 引擎。

    后来,Node 创始人Ryan Dahl 希望在浏览器外的其他地方也能够支持 JavaScript的执行,便把google的 V8 引擎嵌入到C++的程序中,并扩展一定的功能,创建 支持执行JavaScript的 Node。

    这里我们关注两个依赖库 V8, libuv

    V8: 负责将Javascript 转成 c++

    libuv: c++ 开源项目,处理并发及进程构建,提供访问操作系统文件及网络的能力

    而Node 在这里封装c++的api,给javascript提供很好的接口,实现javascript与计算机上的c++之间的良好交互。(个人理解:简言之,不用写c++,直接通过javascript的接口访问c++的中间层。)

     

    从代码的角度分析Node具体的工作原理:

    例如: 

    模块 scrypt.js 中提供了scrypt函数

    https://github.com/nodejs/node/blob/6a9ec8d9331ee726b26ef8427c42e7571bf31174/lib/internal/crypto/scrypt.js

     函数调用了 _scrypt(keybufpasswordsaltNrpmaxmemwrap), 函数由internalBinding获取 const { scrypt: _scrypt } = internalBinding('crypto');

     c++ 代码中函数的定义与绑定:

     Scrypt函数的绑定: env->SetMethod(target, "scrypt", Scrypt); , 与前面js中函数的获取想对应 const scrypt: _scrypt internalBinding('crypto');

    至此,从 js 到 c++ 的逻辑解析完成,并盗图一张:

    认知总结

    Node 对 JavaScript 的作用有些像 JVM 对 Java 的作用,js对c++的调用过程类似于 java 中的 JNI 技术, v8 引擎也类似于字节码引擎。

    高级程序的架构可能都会有一些类似的地方。

  • 相关阅读:
    equa与==的区别
    使用Log4j进行日志操作
    动态代理的步骤
    批量插入使用SqlBulkCopy
    SQL之开窗函数二——在复杂场景中的实际运用
    SQL Server数据类型详解
    SQL Server遍历表的几种方法
    SQL Server之表变量
    SQL Server之字符串处理函数
    SQL Server之String_Split函数(SQL Server2016版本以上使用)
  • 原文地址:https://www.cnblogs.com/yelao/p/14474513.html
Copyright © 2011-2022 走看看