Загрузка JS из node_modules при монтировании компонента

#javascript #reactjs #codemirror #docusaurus

Вопрос:

Я использую CodeMirror для создания редактора на моем веб-сайте docusaurus, и чтобы использовать CodeMirror, вы должны включить некоторые файлы из самого пакета, который выглядит следующим образом:

 import { UnControlled as CodeMirror } from "react-codemirror2";
import "codemirror/lib/codemirror.css";
import "codemirror/mode/javascript/javascript";
 

Проблема заключается в третьей строке, где я импортирую режим Javascript для code mirror. В этом файле есть ссылки на API-интерфейсы, специфичные для браузера ( navigator ), поэтому, когда я пытаюсь создать веб-сайт Docusaurus, он пытается статически построить весь сайт и выдает ошибку

ReferenceError: navigator is not defined

Очевидно, поскольку в node этого нет. Кстати, веб-сайт отлично работает в режиме разработки…

Итак, что я хочу сделать, это НЕ загружать этот файл во время статического построения веб-сайта, а вместо этого загружать этот файл только при монтировании компонента. Вот что я пробовал:

 useEffect(() => {
  import("codemirror/mode/javascript/javascript");
}, []);
 

Это не сработало.

Как я могу загрузить этот файл только в браузере и только после рендеринга компонента?

Редактировать: я также пытался использовать <BrowserOnly/> компонент, который поставляется с docusaurus, но это тоже не сработало, он по-прежнему показывал ту же ошибку:

 <BrowserOnly>
  <Repl />
</BrowserOnly>
 

Решаемая:
Я получил ответ из комментария к проблеме на Github:

 import React, { useEffect } from "react";
import { UnControlled as CodeMirror } from "react-codemirror2";

if (typeof window !== "undefined") {
  require("codemirror/lib/codemirror.css");
  require("codemirror/mode/javascript/javascript");
}
 

Комментарии:

1. Приятно! Подсказка: вставьте свое решение в качестве ответа, затем примите его.