你好,我正在使用Jekyll和Kramdown将markdown写成HTML的文章。我的文章包含了大量的数学内容,我正在使用Jekyll和Kramdown来渲染markdown写成的HTML。我使用的是 KaTeX 宝石。这是在我的 _config.yml
文件。
kramdown:
math_engine: katex
它可以工作,但它是缓慢的地狱。整个博客需要250秒左右的时间来渲染。这是由于使用 execjs
库运行 katex.js
. 这是代码的一部分。
ExecJS.compile(open(PATH_TO_JS).read).call("katex.renderToString", toRender, {displayMode: dm))
我发现 github上的人 谁造 Node.JS 它反复。我实施了他的解决方案,渲染时间从250秒下降到6秒。但当我看到代码本身时,我的眼睛开始流血。他的解决方案使用了 stdio
沟通 Node.JS 服务器。这是他的代码的例子。
_pluginskatex.rb:
require 'execjs'
module Jekyll
module Tags
class KatexBlock < Liquid::Block
def initialize(tag, markup, tokens)
super
@markup = markup
end
def render(context)
File.open("scripts/katex_server/in", 'w') {
|file| file.write("#{@markup}\n" + super(context))
}
return File.read("scripts/katex_server/out")
end
end
end
end
Liquid::Template.register_tag('latex', Jekyll::Tags::KatexBlock)
scriptskatex_serverserver:
#!/bin/node
const katex = require('./katex.min.js');
const readline = require('readline');
const fs = require('fs');
const path = require('path');
function recursive_stream() {
var is = fs.createReadStream(path.join(__dirname, 'in'));
is.on("data", function(data) {
request = data.toString();
parameters = request.split("\n")[0];
request = request.substring(parameters.length + 1);
parameters = parameters.trim().split(/\s"/);
os = fs.createWriteStream(path.join(__dirname, 'out'))
os.end(katex.renderToString(request, {
displayMode: parameters.includes("display")
}));
recursive_stream();
});
}
recursive_stream();
如何运行 Node.JS 服务器INSIDE ruby脚本?如何使用它来渲染乳胶?katex.js
? 如何让它作为Kramdown数学引擎而不是Jekyll插件?
谢谢你的帮助
就我从描述中了解到的问题而言,你需要找到一种方法来使用 katex.js
在你的ruby应用程序中。
为此,你不必在你的ruby应用程序中运行node.js。相反,您可以创建另一个 网络服务 在node.js中,它将提供HTTP端点来使用这个库。如果未来你决定使用docker和kubernetes,那么使用这种方法,你将会有一个很好的横向扩展性。这种方法还能很好地将服务解耦,不像将一个嵌入到另一个的解决方案中,这会在你的ruby服务器上引入很多依赖性。
要创建这样一个web服务,你甚至不需要对他的代码进行大量的修改,只需要定义好端点,然后把他的代码封装进去就可以了。
然后,在ruby端你会有一个http调用,比如说 Faraday.get('url_of_your_service').body
来获取渲染的模板。这样做的速度会很快,因为nodejs的web服务器大多会在同一台机器上,或者在同一个集群中,万一你使用类似kubernetesaws的东西呢。
另外,你也可以处理一次markdown,然后缓存最终的结果,然后就显示出来。根据你的读写比,这可以解决你的速度问题。