[英]Run Node.JS server in Ruby - Kramdown math engine
嗨,我正在使用 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服務器通信。 這是他的代碼示例:
_plugins/katex.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)
腳本/katex_server/服務器:
#!/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();
如何在ruby腳本中運行 Node.JS 服務器? 如何使用它來使用katex.js
?
謝謝您的幫助
據我從描述中了解您的問題,您需要找到一種在 ruby 應用程序中使用katex.js
的方法。
為此,您不必在 ruby 應用程序中運行 node.js。 相反,您可以在 node.js 中創建另一個web 服務,該服務將提供 HTTP 端點以供使用此庫。 如果將來您決定使用 docker 和 kube.netes,您將通過這種方法獲得開箱即用的出色水平可擴展性。 這種方法也很好地解耦了服務,這與將一個服務嵌入另一個服務的解決方案不同,后者會在您的 ruby 服務器上引入很多依賴項。
要創建這樣一個 web 服務你甚至不需要對他的代碼改動很多,只需要定義端點並將他的代碼包裝進去即可。
然后,在 ruby 端,您將有一個 http 調用,例如Faraday.get('url_of_your_service').body
以獲取呈現的模板。 這會很快工作,因為 nodejs web 服務器大多在同一台機器上或在同一集群中,以防您使用 kube.netes/aws 之類的東西。
您也可以處理一次 markdown 並緩存最終結果並只顯示它。 根據您的讀/寫比率,這可以解決您的速度問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.