【问题标题】:Gatsby site, Script not available on first page request with HelmetGatsby 网站,使用 Helmet 的首页请求中不提供脚本
【发布时间】:2021-10-07 20:59:06
【问题描述】:

我有一个 Gatsby 网站,我正在尝试向其中添加第三方 js 小部件,但由于某些奇怪的原因,它只有在我手动刷新页面时才会加载。在第一页加载时,它就好像它根本不存在,开发工具中没有错误,什么都没有......但是如果我刷新页面,它就会出现。几乎就好像它是延迟加载?有没有办法强制加载?

我检查了开发工具中的elementsconsolenetwork 选项卡,但没有任何错误提示。 elements 显示我所期望的标签,console 什么都没有显示,network 一切都显示为 200。

这可能是 Gatsby 和/或 Helmet 的问题吗?可能是,但我不认为这是小部件本身的问题(它是第三方,我无法控制它,请参阅最后一段)?

<Helmet
    script={[
        {
            type: 'text/javascript',
            src: '//widget-url.com/path/to/jsfile.min.js',
        },
        {
            type: 'text/javascript',
            innerHTML: `
               (function() {
                   var widget = Stuff.happens.here();
                   widget.Initialise();
                })();
            `,
        },
    ]}
/>

在我的身体里:

<div id='widget-id'></div>

我试图了解问题出在哪里

  • 正如我所提到的,我必须强制刷新小部件所在的页面。如果我强制刷新任何其他页面,它没有帮助。所以我尝试的是:而不是只将 JS 包含在相关页面的头部,我会将它包含在所有页面上。但这并没有什么不同。

  • 我还尝试将小部件添加到一个简单的独立 html 文件中,小部件加载没有问题。这让我认为这可能不是小部件问题?

我不知道从这里去哪里:(

【问题讨论】:

  • 小部件代码是否自动执行?还是你必须手动调用它,比如widget.init()
  • @Akshay 自动显示,它应该只显示一个小日历。
  • 查看小部件是否提供手动调用它的方法。如果它确实在该页面的useEffect 中调用它

标签: javascript gatsby helmet.js


【解决方案1】:

问题是您指向的 DOM 元素在您请求脚本时可能会呈现也可能不会呈现。

在你的情况下,我会尝试:

<Helmet>
    <script async defer src="//widget-url.com/path/to/jsfile.min.js" />
    <script async defer>
     {`
      (function() {
          var widget = Stuff.happens.here();
           widget.Initialise();
         })();   
      `}
    </script>
</Helmet>

或者使用多个服务器端渲染 API 之一。 onRenderBody 应该可以工作:

// gatsby-ssr.js
import React from "react"
export const onRenderBody = ({ setHeadComponents, setPostBodyComponents }) => {
  setHeadComponents([
    <script 
      src="//widget-url.com/path/to/jsfile.min.js"
      type="text/javascript"
      async
    />,
    <script
      dangerouslySetInnerHTML={{
      __html: `
        (function() {
         var widget = Stuff.happens.here();
          widget.Initialise();
        })();   
     `,
    }}
   />, 
 ])
}

【讨论】:

  • 感谢您的回复,这很有意义。但我确实忘记了一块 JS(问题更新:我添加了初始化脚本的 innerHTML 块),我似乎无法弄清楚如何添加该块。
  • 我已经编辑了答案,添加了内部脚本。检查报价,因为使用降价很棘手
猜你喜欢
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-05
  • 2016-02-11
相关资源
最近更新 更多