Как включить jQuery в проект Gatsby.js?
Я экспериментировал с gatsby.js некоторое время, и все идет хорошо, за исключением этой проблемы, я не могу включить скрипты jQuery в приложение, чтобы оно загружалось после рендеринга приложения gatsby, у меня есть включенные теги скрипта для html.js
файл и загрузил его, но кажется, что код выполняется, прежде чем реагирует, отображает содержимое на экран, который я пытался использовать simple-load-script
а также включить его в componentDidMount
метод на html.js
приложение. Но не повезло, вот исходный код моего html.js
файл:
html.js
import React from "react"
import PropTypes from "prop-types"
export default class HTML extends React.Component {
componentDidMount() {
console.log('hello world');
}
render() {
return (
<html {...this.props.htmlAttributes}>
<head>
<meta charSet="utf-8" />
<meta httpEquiv="x-ua-compatible" content="ie=edge" />
<meta
name="viewport"
content="width=device-width, initial-scale=1, shrink-to-fit=no"
/>
{this.props.headComponents}
</head>
<body>
{this.props.preBodyComponents}
<div
key={`body`}
id="___gatsby"
dangerouslySetInnerHTML={{ __html: this.props.body }}
/>
{this.props.postBodyComponents}
</body>
</html>
)
}
}
HTML.propTypes = {
htmlAttributes: PropTypes.object,
headComponents: PropTypes.array,
bodyAttributes: PropTypes.object,
preBodyComponents: PropTypes.array,
body: PropTypes.string,
postBodyComponents: PropTypes.array,
}
Как видите, я заменил componentDidMount()
метод, чтобы записать на консоль, и это не было что-то, что препятствует выполнению этого метода.
Если у кого-то есть опыт в этом, пожалуйста, поделитесь, спасибо.
1 ответ
Если вы хотите добавить JQuery в качестве внешнего (загрузка из CDN) в Gastby, это немного сложно. Вам необходимо:
- добавить jquery CDN в
html.js
- добавлять
external
конфиг вебпака вgatsby-node.js
Добавить jQuery в html.js
Вы, вероятно, уже сделали это: cp .cache/default-html.js src/html.js
, и добавить
// src/html.js
<head>
<script
src="https://code.jquery.com/jquery-3.3.1.min.js"
integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
crossOrigin="anonymous"
/>
</head>
Но есть одно предостережение: это не так, как вначале, а о происхождении. На данный момент, если вы используете $
даже в componentDidMount
, он по-прежнему выдает ошибку, так как веб-пакет не знает о jquery.
добавлять external
конфиг вебпака в gatsby-node.js
Нам нужно сообщить веб-пакет о JQuery.
//gatsby-node.js
exports.onCreateWebpackConfig = ({
actions,
}) => {
const { setWebpackConfig } = actions;
setWebpackConfig({
externals: {
jquery: 'jQuery', // important: 'Q' capitalized
}
})
}
использование
Сейчас в componentDidMount
ты можешь сделать
import $ from 'jquery' // important: case sensitive.
componentDidMount() {
$('h1').css('color', 'red');
}
Почему регистр чувствителен
Когда мы установим external: { X: Y }
По сути, мы говорим веб-пакету, где бы я ни import X
посмотри на Y
в глобальном масштабе. В нашем случае, веб-пакет будет искать jQuery
в window
, jQuery присоединяется к окну с двумя именами: jQuery
а также $
, Вот почему заглавная буква Q важна.
Также, для иллюстрации, вы также можете сделать: external: { foo: jQuery }
и использовать его как import $ from foo
, Это все еще должно работать.
Надеюсь, это поможет!
Другой способ добавить jQuery в ваш проект Gatsby - использовать gatsby-ssr.js и gatsby-browser.js:
Добавить jQuery в gatsby-ssr.js
Вам нужно создать gatsby-ssr.js в корневом каталоге, если у вас его еще нет.
const React = require("react")
export const onRenderBody = ({ setHeadComponents }, pluginOptions) => {
setHeadComponents([
<script
src="https://code.jquery.com/jquery-3.4.1.min.js"
integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
crossOrigin="anonymous">
</script>,
])
}
Он поместит ваш тег скрипта в верхнюю часть примечания: если вы используете среду разработки, вам нужно запустить ее снова, чтобы gatsby-ssr.js заработал.
Добавьте свой код в gatsby-browser.js
Вам нужно создать gatsby-browser.js в корневом каталоге, если у вас его еще нет. Это будет место для ваших кодов:
const $ = require("jquery")
export const onInitialClientRender = () => {
$(document).ready(function () {
console.log("The answer is don't think about it!")
});
}
Этот метод помещает свой код в common.js Вы можете использовать другие интерфейсы API, а также для запуска кода: Гэтсби Browser API документ
Отказ от ответственности
Это немного взломано, и в целом не рекомендуется использовать jQuery с Gatsby, но для быстрых исправлений он отлично работает.
Более того, html.js не рекомендуется руководствами Gatsby:
Настройка html.js - это временное решение, когда использование соответствующих API-интерфейсов недоступно в gatsby-ssr.js. Рассмотрите возможность использования onRenderBody или onPreRenderHTML вместо описанного выше метода. Кроме того, настройка html.js не поддерживается в теме Gatsby. Вместо этого используйте упомянутые методы API.