在Ruby中运行Node.JS服务器--Kramdown数学引擎。

问题描述 投票:0回答:1

问题

你好,我正在使用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插件?

谢谢你的帮助

node.js ruby latex jekyll kramdown
1个回答
1
投票

就我从描述中了解到的问题而言,你需要找到一种方法来使用 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的东西呢。


0
投票

另外,你也可以处理一次markdown,然后缓存最终的结果,然后就显示出来。根据你的读写比,这可以解决你的速度问题。

© www.soinside.com 2019 - 2024. All rights reserved.