Самый простой и чистый способ - использовать gatsby-browser.js
. Gatsby предоставляет там несколько API, onClientEntry
соответствует вашим требованиям. Из документации:
onClientEntry
Функция
(_: emptyArg, pluginOptions: pluginOptions) => undefined
Вызывается при первом запуске среды выполнения браузера Gatsby.
Итак, адаптированный к вашему коду, в вашем gatsby-browser.js
просто добавьте:
export const onClientEntry = () => {
useEffect(() => {
require('./scripts/masonry');
}, [])
};
Приведенный выше код предполагает:
- Скрипт масонства принадлежит вашему собственному проекту.
- Кладка будет добавлена на все страницы. Если вы не хотите добавлять его на весь сайт. См. Реализацию ниже.
Если вышеперечисленное не работает должным образом или вам не нужно везде. Я бы попытался добавить пустой deps ([]
) к исходному хуку useEffect
, поскольку это ближайший обходной путь к жизненному циклу componentDidMount
:
useEffect(() => {
require('./scripts/masonry');
}, [])
Если скрипт внешний (сторонний):
useEffect(() => {
const script = document.createElement('script')
script.async = true script.defer = true
script.src = 'https://your_script.com'
document.querySelector('ANY_UNIQUE_DIV').appendChild(script)
}, [])
Приведенный выше код - это всего лишь начальный обходной путь, следует избегать использования document
и других переменных DOM в любом приложении React, поскольку они сильно влияют на производительность браузера, вы можете сделать то же самое с крючком useRef
.