<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                得到hello.node結果文件后,如果調用擴展模塊其實在前面已經提及。require()方法通過解析標識符、路徑分析、文件定位,然后加載執行即可。下面的代碼引入前面編譯得到的.node文件,并調用執行其中的方法: ~~~ const hello = require("./build/Release/hello.node"); console.log(hello.sayHello()); ~~~ 以上代碼存為hello.js,調用`node hello.js`命名即可得到如下輸出結果: ~~~ Hello World! ~~~ 對于以.node為擴展名的文件,Node將會調用process.dlopen() 方法去加載文件: ~~~ //Native extension for .node Module._extensions['.node'] = process.dlopen; ~~~ 對于調用者而言,require()是輕松愉快的。對于擴展模塊的編寫者來說,process.dlopen()中隱含的過程值得了解一番。如圖: ![](https://box.kancloud.cn/2016-08-26_57bf1fe42ae1f.png) require()在引入.node文件的過程中,實際上經歷了4個層面上的調用。 加載.node文件實際上經歷了兩個步驟,第一個步驟是調用uv_dlopen()方法去打開動態鏈接庫,第二個步驟是調用uv_dlsym()方法找到動態鏈接庫中通過NODE_MODULE宏定義的方法地址。這兩個過程都是通過libuv庫進行封裝的:在`*nix`平臺下實際上調用的是dlfcn.h頭文件中定義的dlopen()和dlsym()兩個方法;在Windows平臺則是通過LoadLibraryExW()和GetProcAddress()這兩個方法實現的,它們分別加載.so和.dll文件(實際為.node文件)。 這里對libuv函數的調用充分表現Node利用libuv實現跨平臺的方式,這樣的情景在很多地方還會出現。 由于編寫模塊時通過NODE_MODULE將模塊定義為`node_module_struct`結構,所以在獲取函數地址之后,將它映射為`node_module_struct`結構幾乎是無縫對接的。接下來的過程就是將傳入的exports對象作為實參運行,將C++中定義的方法掛載在exports對象上,然后調用者就可以輕松調用了。 C/C++擴展模塊與JavaScript模塊的區別在于加載之后不需要編譯,直接執行之后就可以被外部調用了,其加載速度比JavaScript模塊略快。 使用C/C++擴展的一個好處就在于可以靈活和動態的加載它們,保持Node模塊自身簡單性的同時,給予Node無限的可擴展性。 關于node-gyp工具的更多細節可以參見 https://github.com/TooTallNate/node-gyp(作者為Nathan Rajlich,Node源碼的核心貢獻者之一)。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看