jquery - 如何在 Gatsby.js 项目中包含 jQuery?
问题描述
我已经用 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()
写入控制台的方法,并且没有阻止该方法执行的东西。
如果有人有这方面的经验,请分享,谢谢。
解决方案
如果您想将 jQuery 作为外部(从 CDN 加载)添加到 gastby,这有点棘手。你需要:
- 将 jquery CDN 添加到
html.js
- 添加
external
到 webpack 配置中gatsby-node.js
将 jQuery 添加到html.js
⚠️编辑:这应该通过 来完成
gatsby-ssr
,请参阅@rosszember 答案以了解上下文。.
您可能已经这样做了: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>
但有一点需要注意:它是crossorigin,而不是 crossorigin。此时,如果你使用$
even in componentDidMount
,它仍然会抛出错误,因为 webpack 不知道 jquery。
添加external
到 webpack 配置中gatsby-node.js
我们需要通知 webpack 关于 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 }
我们实际上是在告诉 webpack '无论我在哪里',在全局范围内import X
寻找。Y
在我们的例子中,webpack 会jQuery
在window
. jQuery 将自身附加到具有 2 个名称的窗口:jQuery
和$
. 这就是为什么大写的 Q 很重要。
此外,为了说明,您还可以:external: { foo: jQuery }
并像import $ from foo
. 它应该仍然有效。
希望有帮助!
推荐阅读
- vb.net - 我可以从文本文件中创建一个子例程吗
- python - TypeError: to_sql() 使用 pd.DataFrame.to_sql 插入 MySQL 数据库时
- javascript - 在一个非常简单的反应练习中获取“无法在尚未安装的组件上调用 setState”
- java - 在 Google Guice 框架中使用 @Named 和 @Singleton
- ruby-on-rails - 一种形式的多个记录 - 强大的参数问题
- android - Android - 通用类作为 Kotlin 中用于改造调用的返回类型
- ksqldb - 如何在 SpringBoot 应用程序中使用 EmbeddedKsql?
- python - 有没有办法将渐变的RGB值转换为python中[0,1]内的值?
- amazon-web-services - 如果我通过 API Gateway RestAPI 将图像上传到 S3 存储桶,会产生哪些 AWS 费用?
- amazon-web-services - AWS 在 1-2 周后教育 Ec2 公钥错误?