标题
Duktape-C语言推荐的js引擎,据说 MuJS 中有很多错误
clq
浏览(8) +
2025-06-13 14:09:11 发表
编辑
关键字:
[2025-06-13 22:57:56 最后更新]
Duktape-C语言推荐的js引擎,据说 MuJS 中有很多错误
https://xlsx.nodejs.cn/docs/demos/engines/mujs/
“
MuJS 引擎存在许多错误,影响 XLSX、XLML 以及其他 XML 和纯文本文件格式的解析。如果软件不需要支持旧版系统或架构,强烈建议使用现代引擎,例如 Duktape。
”
MuJS 的接口很像 lua
--------------------------------------------------------
https://duktape.org/
https://duktape.org/api
感觉它的 github 有点乱,不如上面的两个网址.
https://github.com/svaarala/duktape
--------------------------------------------------------
quickjs 似乎并不方便编译,还有其他小巧的 C 语言的 js 引擎吗
除了 QuickJS,确实还有一些小巧的 C/C++ 实现的 JavaScript 引擎,以下是几个备选方案:
1. Duktape
特点:
纯 C 实现,无外部依赖,嵌入式设计(仅需 200-600KB 内存)。
支持 ES5+ 部分特性,可配置裁剪。
自带调试协议和简单的垃圾回收。
适用场景:
资源受限的嵌入式设备、游戏脚本、扩展系统。
缺点:
不支持现代 ES6+ 语法(如 let/const、箭头函数等)。
编译:
单头文件(duktape.h + duktape.c),直接包含到项目中即可。
2. JerryScript
特点:
由三星开发,针对 IoT 设备优化(最小内存占用约 200KB)。
支持 ES5.1 和部分 ES6 特性(如 Proxy)。
适用场景:
超低功耗设备(如微控制器)。
缺点:
性能较低,社区活跃度一般。
编译:
CMake 构建,但比 QuickJS 更简单,通常无复杂依赖。
3. MuJS
特点:
轻量级(约 150KB),专注于简单脚本嵌入。
基于 Lua 的轻量设计,语法支持 ES5。
适用场景:
需要与 Lua 共存的场景(如游戏脚本)。
缺点:
功能有限,非活跃开发。
编译:
直接 make 即可生成静态库。
4. Hermes(Facebook)
特点:
针对 React Native 优化,支持现代 JS(ES6+)。
AOT 编译提升性能。
适用场景:
React Native 应用或需要高性能的场景。
缺点:
体积较大(约几 MB),非通用嵌入式设计。
编译:
需要较复杂的工具链(CMake + Ninja)。
5. XS(Moddable)
特点:
超小型(可裁剪到 50KB),支持 ES2018+。
专为嵌入式设备设计(如 ESP32)。
适用场景:
极低资源环境下的脚本需求。
缺点:
文档较少,生态局限。
编译:
依赖 Moddable SDK,需配置工具链。
选择建议:
嵌入式/IoT:优先 Duktape 或 JerryScript。
现代语法需求:尝试 Hermes 或 XS(若接受复杂性)。
极致简单:MuJS 或单文件版 Duktape。
如果需要更具体的推荐,可以补充你的使用场景(如目标平台、内存限制、语法需求等)。
clq
2025-06-13 20:33:03 发表
编辑
https://duktape.org/
https://duktape.org/api
https://xlsx.nodejs.cn/docs/demos/engines/duktape/
这个 SheetJS 的文档惊人的完整。
--------------------------------------------------------
使用 Duktape 进行数据处理
Duktape 是一个用 C 编写的嵌入式 JS 引擎。它已被移植到许多奇异的体系结构和操作系统。
SheetJS 是一个用于从电子表格读取和写入数据的 JavaScript 库。
"完整示例" 部分包括一个完整的命令行工具,用于从电子表格读取数据并导出到 Excel XLSB 工作簿。"绑定" 涵盖其他生态系统的绑定。
集成详情
初始化 Duktape
Duktape 不提供 global 变量。它可以在一行中创建:
/* initialize */
duk_context *ctx = duk_create_heap_default();
/* duktape does not expose a standard "global" by default */
duk_eval_string_noresult(ctx, "var global = (function(){ return this; }).call(null);");
加载 SheetJS 脚本
SheetJS 独立脚本 可以在 Duktape 上下文中进行解析和评估。
可以通过从文件系统读取脚本并在 Duktape 上下文中进行评估来加载垫片和主库:
/* simple wrapper to read the entire script file */
static duk_int_t eval_file(duk_context *ctx, const char *filename) {
size_t len;
/* read script from filesystem */
FILE *f = fopen(filename, "rb");
if(!f) { duk_push_undefined(ctx); perror("fopen"); return 1; }
long fsize; { fseek(f, 0, SEEK_END); fsize = ftell(f); fseek(f, 0, SEEK_SET); }
char *buf = (char *)malloc(fsize * sizeof(char));
len = fread((void *) buf, 1, fsize, f);
fclose(f);
if(!buf) { duk_push_undefined(ctx); perror("fread"); return 1; }
/* load script into the context */
duk_push_lstring(ctx, (const char *)buf, (duk_size_t)len);
/* eval script */
duk_int_t retval = duk_peval(ctx);
/* cleanup */
duk_pop(ctx);
return retval;
}
// ...
duk_int_t res = 0;
if((res = eval_file(ctx, "shim.min.js")) != 0) { /* error handler */ }
if((res = eval_file(ctx, "xlsx.full.min.js")) != 0) { /* error handler */ }
要确认库已加载,可以检查 XLSX.version:
/* get version string */
duk_eval_string(ctx, "XLSX.version");
printf("SheetJS library version %s\n", duk_get_string(ctx, -1));
duk_pop(ctx);
读取文件
Duktape 本身支持 Buffer,但应在处理前进行切片。假设 buf 是一个 C 字节数组,长度为 len,此片段解析数据:
/* load C char array and save to a Buffer */
duk_push_external_buffer(ctx);
duk_config_buffer(ctx, -1, buf, len);
duk_put_global_string(ctx, "buf");
/* parse with SheetJS */
duk_eval_string_noresult(ctx, "workbook = XLSX.read(buf.slice(0, buf.length), {type:'buffer'});");
workbook 将是 JS 环境中的一个变量,可以使用各种 SheetJS API 函数进行检查。
写入文件
duk_get_buffer_data 可以将 Buffer 对象数据拉入 C 代码中:
/* write with SheetJS using type: "array" */
duk_eval_string(ctx, "XLSX.write(workbook, {type:'array', bookType:'xlsx'})");
/* pull result back to C */
duk_size_t sz;
char *buf = (char *)duk_get_buffer_data(ctx, -1, sz);
/* discard result in duktape */
duk_pop(ctx);
生成的 buf 可以用 fwrite 写入文件。
完整示例
测试部署
该演示在以下部署中进行了测试:
架构 版本 日期
darwin-x64 2.7.0 2024-12-31
darwin-arm 2.7.0 2025-02-13
win11-x64 2.7.0 2024-12-20
win11-arm 2.7.0 2025-02-23
linux-x64 2.7.0 2024-12-31
linux-arm 2.7.0 2025-02-15
该程序解析文件并打印第一个工作表中的 CSV 数据。它还生成 XLSB 文件并写入文件系统。
流程图显示在示例步骤之后
Windows 构建需要带有 "使用 C++ 进行桌面开发" 的 Visual Studio。命令必须在 "原生工具命令提示符" 会话中运行。
创建项目文件夹:
mkdir sheetjs-duk
cd sheetjs-duk
下载并解压 Duktape:
Linux/MacOS
Windows
curl -LO https://duktape.org/duktape-2.7.0.tar.xz
tar -xJf duktape-2.7.0.tar.xz
mv duktape-2.7.0/src/*.{c,h} .
下载 SheetJS Standalone 脚本、shim 脚本和测试文件。将所有三个文件移动到项目目录:
shim.min.js
xlsx.full.min.js
pres.numbers
Linux/MacOS
Windows
curl -LO https://cdn.sheetjs.com/xlsx-0.20.3/package/dist/shim.min.js
curl -LO https://cdn.sheetjs.com/xlsx-0.20.3/package/dist/xlsx.full.min.js
curl -LO https://xlsx.nodejs.cn/pres.numbers
下载 sheetjs.duk.c:
curl -LO https://xlsx.nodejs.cn/duk/sheetjs.duk.c
编译独立的 sheetjs.duk 二进制文件
Linux/MacOS
Windows
gcc -std=c99 -Wall -osheetjs.duk sheetjs.duk.c duktape.c -lm
GCC 可能会生成警告:
duk_js_compiler.c:5628:13: warning: variable 'num_stmts' set but not used [-Wunused-but-set-variable]
duk_int_t num_stmts;
^
可以忽略此警告。
运行演示:
Linux/MacOS
Windows
./sheetjs.duk pres.numbers
如果程序成功,CSV 内容将打印到控制台并创建文件 sheetjsw.xlsb。该文件可以用 Excel 打开。
clq
2025-06-13 22:48:27 发表
编辑
mujs 似乎没有这么差吧。
https://github.com/ccxvii/mujs
https://mujs.com/examples.html
从示例上看,接口很是完整。
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.