duktape 是一個體積小巧、可移植性高、适合嵌入到各種環境中的 javascript 引擎。
最近需要将 protobuf.js 移植到 duktape 裡邊運作起來,是以需要解決 javascript 子產品化加載問題,也就是要支援 require, module.exports 文法。我們通過 modsearch 函數來實作子產品化加載:
implementing a native modsearch() function這篇 guide 裡邊有說通過在 native 實作 modsearch 函數就可以在 javascript 裡通過require的時候加載到别的子產品。
我在 c 層實作 modsearch 函數如下:
test.js 用以驗證實作的子產品化加載功能是否正常,内容如下:
其中:
register_mod_search 函數用于向 duktape 注冊一個用于加載 javascript 子產品的函數 my_mod_search,該函數有四個入參,分别為子產品 id、發起 require 的子產品、本子產品的 exports 對象、本子產品的 module 對象,該函數加載 /users/faywong 目錄下以 id 為主檔案名(比如在 test.js 中 require 到的 bytebuffer, protobuf)的 javascript 檔案并将檔案内容傳回給 duktape
為了友善,test.js 中 require 的其他 javascript 子產品被筆者放在了自己的家目錄下: