簡體   English   中英

在 Ruby 中運行 Node.JS 服務器 - Kramdown 數學引擎

[英]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 秒。 但是當我看到代碼本身時,我的眼睛開始流血。 他的解決方案使用stdioNode.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

  • TL;DR:如何讓 node.js 服務器與 ruby 腳本通信?

謝謝您的幫助

據我從描述中了解您的問題,您需要找到一種在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM