nodejs作为javascript在后端运行的环境,源码由js与C完成。本质上,nodejs是借助于谷歌V8引擎来运行javascript代码。使用了C的libuv库来处理网络,访问文件系统等操作。

nodejs的作用

1、提供一种接口,仅仅书写javascript的代码,就可以让他们正确执行,不用书写C++代码。
2、丰富的api。http、fs、path、crypto …modules

nodejs源码

nodejs源码:

https://github.com/nodejs/node

lib:nodejs库函数
src:库函数的C++实现。

pbkdf2中js代码

pbkdf2函数的实现:node/lib/internal/crypto/pbkdf2.js

1
2
3
4
5
6
7
8
9
10
11
12
function pbkdf2(password, salt, iterations, keylen, digest, callback) {
 ...

 handleError(keybuf, password, salt, iterations, digest, wrap);
}

调用了:

const rc = _pbkdf2(keybuf, password, salt, iterations, digest, wrap);

_pbkdf2绑定了C++函数的实现。
const { pbkdf2: _pbkdf2 } = internalBinding('crypto');

internalBinding链接javascript代码与C++代码。

pbkdf2中c++代码

crypto库源代码实现:node/src/node_crypto.cc

1
2
3
4
5
6
7
8
9
10
11
12
13
绑定
env->SetMethod(target, "pbkdf2", PBKDF2);
inline void PBKDF2(const FunctionCallbackInfo& args) {
   ...
  job->iteration_count = args[3].As()->Value();
  Utf8Value digest_name(args.GetIsolate(), args[4]);
  job->digest = EVP_get_digestbyname(*digest_name);
  if (job->digest == nullptr) return rv.Set(-1);
  if (args[5]->IsObject()) return PBKDF2Job::Run(std::move(job), args[5]);
  env->PrintSyncTrace();
  job->DoThreadPoolWork();
  rv.Set(job->ToResult());
}

v8

node/src/node_crypto.cc中我们还会看到很多的v8,将javascript类型转换为c++类型

1
2
3
4
5
6
 using v8::Array;
using v8::Boolean;
using v8::ConstructorBehavior;
using v8::Context;
using v8::DontDelete;
...

libuv

node/src/node_crypto.cc中我们还会看到很多的libuv,处理并发操作。

1
2
3
...
static uv_once_t init_once = UV_ONCE_INIT;
uv_once(&init_once, InitCryptoOnce);
  • 本文链接: https://dreamerjonson.com/2018/11/08/深度理解nodejs/

  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY 4.0 CN协议 许可协议。转载请注明出处!

郑建勋(jonson)区块链工程师 & Web工程师

灾难总是接踵而至,这正是世间的常理。你以为只要哭诉一下,就会有谁来救你吗?如果失败了,就只能说明我不过是如此程度的男人。