Duktape 是一个体积小巧、可移植性高、适合嵌入到各种环境中的 JavaScript 引擎。
最近需要将 protobuf.js 移植到 Duktape 里边运行起来,所以需要解决 JavaScript 模块化加载问题,也就是要支持 require, module.exports 语法。我们通过 modSearch 函数来实现模块化加载:
实现 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 模块被笔者放在了自己的家目录下:
/Users/faywong/bytebuffer.js/Users/faywong/protobuf.js/Users/faywong/test.js