美文网首页唯识相链
深度理解nodejs[1]-node底层机制

深度理解nodejs[1]-node底层机制

作者: 唯识相链 | 来源:发表于2018-11-13 15:12 被阅读0次

    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

    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

    绑定
     env->SetMethod(target, "pbkdf2", PBKDF2);
     inline void PBKDF2(const FunctionCallbackInfo<Value>& args) {
        ...
       job->iteration_count = args[3].As<Uint32>()->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++类型

    using v8::Array;
    using v8::Boolean;
    using v8::ConstructorBehavior;
    using v8::Context;
    using v8::DontDelete;
    ...
    
    

    libuv

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

    ...
    static uv_once_t init_once = UV_ONCE_INIT;
    uv_once(&init_once, InitCryptoOnce);
    

    个人博客:https://dreamerjonson.com

    相关文章

      网友评论

        本文标题:深度理解nodejs[1]-node底层机制

        本文链接:https://www.haomeiwen.com/subject/hxklfqtx.html