【问题标题】:How to include jQuery in a Gatsby.js project?如何在 Gatsby.js 项目中包含 jQuery?
【发布时间】:2019-06-25 08:47:12
【问题描述】:

我已经用 gatsby.js 试验了一段时间,除了这个问题外,一切都很顺利,我不能在应用程序中包含 jQuery 脚本,以便在 gatsby 应用程序渲染后加载,我已经包含脚本标记到html.js 文件并加载它,但似乎代码是在react 将内容呈现到屏幕之前执行的@ 应用程序。但是没有运气,这是我的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() 方法以写入控制台,但没有阻止此方法执行。

如果有人有这方面的经验,请分享,谢谢。

【问题讨论】:

  • 不应该在 } 之后和 render() 之前加逗号吗?
  • @muka.gergely 你在说什么? JS中的方法之间没有逗号。

标签: jquery reactjs gatsby jamstack


【解决方案1】:

如果您想将 jQuery 作为外部(从 CDN 加载)添加到 gastby,这有点棘手。您需要:

  • 将jquery CDN添加到html.js
  • external 添加到gatsby-node.js 中的webpack 配置中

添加jQuery到html.js

⚠️ 编辑:这应该通过gatsby-ssr完成,请参考@rosszember answer for context.

您可能已经这样做了: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>

但有一点需要注意:它是交叉Origin,而不是crossorigin。 此时,如果你在componentDidMount中使用$,它仍然会抛出错误,因为webpack不知道jquery。

external 添加到gatsby-node.js 中的webpack 配置中

我们需要通知 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 会在 window 中寻找 jQuery。 jQuery 将自己附加到具有 2 个名称的窗口:jQuery$。这就是为什么大写的 Q 很重要。

另外,为了说明,你也可以这样做:external: { foo: jQuery } 并像import $ from foo 一样使用它。它应该仍然有效。

希望有帮助!

【讨论】:

  • 值得注意的是,这些说明可以在 WebPack 文档中找到。 webpack.js.org/configuration/externals/#root 。另外,stackoverflow.com/users/871874/jonathan-kumar,你应该接受这个答案。
  • 我同意 DaveKanter 的观点,但是,我认为 DerekNguyen 加倍努力,并详细说明了必须针对 Gatsby 做什么。文档讨论了一个通用的解决方案,而这个答案是正确的。例如,有些新人不知道在文档中添加exports.onCreateWebpackConfig vs module.exports。
  • 我在构建 Cannot find module 'jQuery' 时遇到 webpack 错误,有人知道为什么会这样吗?
【解决方案2】:

另一种将 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 来运行您的代码:Gatsby Browser API doc

免责声明

这有点 hacky,一般来说,不建议将 jQuery 与 Gatsby 一起使用,但为了快速修复,它工作得很好。

此外,盖茨比指南不推荐使用 html.js:

当 gatsby-ssr.js 中无法使用适当的 API 时,自定义 html.js 是一种解决方案。考虑使用 onRenderBody 或 onPreRenderHTML 代替上述方法。作为进一步考虑,在 Gatsby 主题中不支持自定义 html.js。请改用提到的 API 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 2017-11-13
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    相关资源
    最近更新 更多