Встраивание нескольких экземпляров RunKit REPL на одной веб-странице

Я создаю веб-презентацию, используя RemarkJS, мой любимый инструмент для презентаций. Так как я хочу продемонстрировать небольшие кусочки nodejs код, я хочу использовать возможность встраивания REPL RunKit. Я не мог понять, как встроить несколько экземпляров на одной веб-странице, но мне удалось что-то запутать, запустив следующий код несколько раз

var nb1 = RunKit.createNotebook({
    // the parent element for the new notebook
    element: document.getElementById("div1"),

    // specify the source of the notebook
    source: source1
})

var nb2 = RunKit.createNotebook({
    // the parent element for the new notebook
    element: document.getElementById("div2"),

    // specify the source of the notebook
    source: source2
})

и так далее. Это на самом деле работает, но супер-неэффективно. Когда я запускаю свою презентацию, выполняется несколько вызовов RunKit, хотя вся страница загружается только один раз. Кроме того, каждый раз, когда я меняю слайды, выполняется несколько вызовов RunKit, которые в RemarkJS просто скрывают и отображают различные части одной и той же веб-страницы. Поскольку сама веб-страница загружается только один раз, RunKit следует вызывать только один раз. По крайней мере, я так думаю (очевидно, я ошибаюсь).

Наконец, фактический кадр RunKit REPL занимает некоторое время, прежде чем он будет отрендерен. В начале отображаются только несколько строк усеченного кода, но через некоторое время ожидания весь кадр отображается.

Что я делаю неправильно? Есть ли лучший способ сделать это?

0 ответов

У меня была такая же проблема, и я понял ее. Вот как это сделать для будущих пользователей.

<script src="https://embed.runkit.com"></script>
<style>.embed { overflow: visible; }</style>
<pre class="embed" data-gutter="inside">console.log("hello inside");
1 + 1</pre>
<pre class="embed" data-gutter="outside">console.log("hello outside");
1 + 1</pre>
<pre class="embed" data-gutter="none">console.log("hello none");
1 + 1</pre>
<script>
const elements = [...document.getElementsByClassName('embed')]
const notebooks = elements.reduce((notebooks, element) => {
    const innerText = element.firstChild
    const currentCell = window.RunKit.createNotebook({
        element,
        gutterStyle: element.getAttribute("data-gutter"),
        source: innerText.textContent,
        // Remove the text content of the pre tag after the embed has loaded
        onLoad: () => innerText.remove()
    })
  return notebooks
}, [])
</script>

Образец взят отсюда: https://runkit.com/docs/embed Прокрутите вниз, и вы его найдете.

Другие вопросы по тегам