【问题标题】:Run Node.JS server in Ruby - Kramdown math engine在 Ruby 中运行 Node.JS 服务器 - Kramdown 数学引擎
【发布时间】:2020-06-09 15:34:37
【问题描述】:

问题

您好,我正在使用 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))

可能的解决方案

我发现guy on 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();

问题

如何运行 Node.JS 服务器 INSIDE ruby​​ 脚本?如何使用katex.js来渲染latex?

  • TL;DR: 如何让 node.js 服务器与 ruby​​ 脚本通信?

感谢您的帮助

【问题讨论】:

    标签: node.js ruby latex jekyll kramdown


    【解决方案1】:

    据我从描述中了解您的问题,您需要找到一种在您的 ruby​​ 应用程序中使用 katex.js 的方法。

    为此,您不必在 ruby​​ 应用程序中运行 node.js。相反,您可以在 node.js 中创建另一个 web 服务,它会提供 HTTP 端点以供使用此库。如果将来您决定使用 docker 和 kubernetes,您将通过这种方法获得开箱即用的出色水平可扩展性。这种方法还可以很好地解耦服务,这与将一个嵌入另一个的解决方案不同,后者会在您的 ruby​​ 服务器上引入很多依赖项。

    要创建这样的 Web 服务,您甚至不需要对他的代码进行大量更改,只需定义端点并将他的代码包装到其中即可。

    然后,在 ruby​​ 方面,您将有一个 http 调用,例如 Faraday.get('url_of_your_service').body 来获取渲染的模板。这会很快工作,因为 nodejs Web 服务器大多位于同一台机器或同一集群中,以防您使用 kubernetes/aws 之类的东西。

    【讨论】:

      【解决方案2】:

      您还可以处理一次降价并缓存最终结果并显示它。根据您的读/写比率,这可以解决您的速度问题。

      【讨论】:

        猜你喜欢
        • 2017-07-02
        • 2019-08-01
        • 1970-01-01
        • 2014-12-31
        • 2012-09-09
        • 2018-04-17
        • 1970-01-01
        • 2017-07-18
        • 1970-01-01
        相关资源
        最近更新 更多