如何在Ruby的ExecJS中使用bun.sh替代Node.js作为运行时?
用Bun替代Node.js作为ExecJS运行时的解决方案
错误原因
你遇到的uninitialized constant ExternalRuntime错误,是因为ExternalRuntime是ExecJS模块下的嵌套类,不能直接裸用,必须加上命名空间前缀ExecJS::。
修正后的代码
require 'execjs' require "execjs/external_runtime" PATH_TO_JS = File.join(__dir__, "katex.min.js") # 移除开头多余的/,避免路径拼接异常 BUN = ExecJS::ExternalRuntime.new( name: "Bun", command: ["bun"], # Bun直接支持运行JS代码,无需额外的run子命令 runner_path: ExecJS.root + "/support/node_runner.js", # Bun兼容Node核心API,可复用该runner文件 encoding: 'UTF-8' ) # 用File.read替代open,避免文件资源泄漏问题 KATEX = BUN.compile(File.read(PATH_TO_JS, encoding: 'UTF-8'))
额外注意事项
- 确保Bun已安装并加入系统环境变量
PATH,执行bun --version能正常输出版本号。 - 如果复用node_runner.js出现兼容性问题,可自定义极简runner文件(比如
bun_runner.js):
然后将process.stdin.pipe(process.stdout); require(process.argv[1]);runner_path指向这个自定义文件即可。
内容的提问来源于stack exchange,提问作者Jan Černý
相关产品推荐
相关产品推荐

