You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

本地React应用集成HTML脚本报错:react-helmet遇解析错误

问题:React Helmet集成第三方脚本时出现解析错误

我想把一段第三方HTML脚本加入本地React应用,这段脚本在纯HTML文件中运行正常,但用react-helmet集成时,RemoteCalc函数调用处出现Parsing error: '}' expected解析错误。

原HTML脚本

<div id="position-size-calculator-956132">
  <script type="text/javascript" src="https://www.cashbackforex.com/Content/remote/remote-widgets.js"></script>
  <script type="text/javascript"> RemoteCalc({"Url":"https://www.cashbackforex.com", "TopPaneStyle":"YmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KCMzNDM1NDAgMCUsICMyNDI4MzEgMTAwJSk7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyLWJvdHRvbTogbm9uZTs=","BottomPaneStyle":"YmFja2dyb3VuZDogIzE1MTgxZDsgYm9yZGVyOiBzb2xpZCAwcHggIzJhMmUzOTsgY29sb3I6ICM5MTk0YTE7","ButtonStyle":"YmFja2dyb3VuZDogIzM0MzU0MDsgY29sb3I6IHdoaXRlOyBib3JkZXItcmFkaXVzOiAyMHB4Ow==","TitleStyle":"dGV4dC1hbGlnbjogbGVmdDsgZm9udC1zaXplOiA0MHB4OyBmb250LXdlaWdodDogNTAwOw==","TextboxStyle":"YmFja2dyb3VuZDogIzE1MTgxZDsgYm9yZGVyOiBzb2xpZCAwcHggIzJhMmUzOTsgY29sb3I6ICM5MTk0YTE7IGJvcmRlcjogc29saWQgMHB4ICM5MTk0YTE7","ContainerWidth":"665","DefaultInstrument":"EUR-USD","HighlightColor":"rgba(0,0,0,1.0)","IsDisplayTitle":false,"IsShowChartLinks":true,"IsShowEmbedButton":true,"CompactType":"large","Calculator":"position-size-calculator","ContainerId":"position-size-calculator-956132"});</script>
</div>

原React代码(报错版本)

import {Helmet} from "react-helmet";

const PositionSizeCalculator = () => {
  return (
    <div id="position-size-calculator-956132">
      <Helmet>
      <script type="text/javascript" src="https://www.cashbackforex.com/Content/remote/remote-widgets.js"></script>
      <script type="text/javascript"> RemoteCalc({"Url":"https://www.cashbackforex.com", "TopPaneStyle":"YmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KCMzNDM1NDAgMCUsICMyNDI4MzEgMTAwJSk7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyLWJvdHRvbTogbm9uZTs=","BottomPaneStyle":"YmFja2dyb3VuZDogIzE1MTgxZDsgYm9yZGVyOiBzb2xpZCAwcHggIzJhMmUzOTsgY29sb3I6ICM5MTk0YTE7","ButtonStyle":"YmFja2dyb3VuZDogIzM0MzU0MDsgY29sb3I6IHdoaXRlOyBib3JkZXItcmFkaXVzOiAyMHB4Ow==","TitleStyle":"dGV4dC1hbGlnbjogbGVmdDsgZm9udC1zaXplOiA0MHB4OyBmb250LXdlaWdodDogNTAwOw==","TextboxStyle":"YmFja2dyb3VuZDogIzE1MTgxZDsgYm9yZGVyOiBzb2xpZCAwcHggIzJhMmUzOTsgY29sb3I6ICM5MTk0YTE7IGJvcmRlcjogc29saWQgMHB4ICM5MTk0YTE7","ContainerWidth":"665","DefaultInstrument":"EUR-USD","HighlightColor":"rgba(0,0,0,1.0)","IsDisplayTitle":false,"IsShowChartLinks":true,"IsShowEmbedButton":true,"CompactType":"large","Calculator":"position-size-calculator","ContainerId":"position-size-calculator-956132"});</script>
      </Helmet>
    </div>
  )
}

错误原因

JSX解析器会把<script>标签内的代码当成JSX语法解析,脚本里的大括号{}和引号规则与JSX冲突,导致解析失败。

解决方法

方法1:用dangerouslySetInnerHTML包裹脚本内容

通过该属性直接注入脚本内容,绕开JSX解析器的语法检查:

import { Helmet } from "react-helmet";

const PositionSizeCalculator = () => {
  const scriptContent = `
    RemoteCalc({
      "Url":"https://www.cashbackforex.com", 
      "TopPaneStyle":"YmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KCMzNDM1NDAgMCUsICMyNDI4MzEgMTAwJSk7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyLWJvdHRvbTogbm9uZTs=",
      "BottomPaneStyle":"YmFja2dyb3VuZDogIzE1MTgxZDsgYm9yZGVyOiBzb2xpZCAwcHggIzJhMmUzOTsgY29sb3I6ICM5MTk0YTE7",
      "ButtonStyle":"YmFja2dyb3VuZDogIzM0MzU0MDsgY29sb3I6IHdoaXRlOyBib3JkZXItcmFkaXVzOiAyMHB4Ow==",
      "TitleStyle":"dGV4dC1hbGlnbjogbGVmdDsgZm9udC1zaXplOiA0MHB4OyBmb250LXdlaWdodDogNTAwOw==",
      "TextboxStyle":"YmFja2dyb3VuZDogIzE1MTgxZDsgYm9yZGVyOiBzb2xpZCAwcHggIzJhMmUzOTsgY29sb3I6ICM5MTk0YTE7IGJvcmRlcjogc29saWQgMHB4ICM5MTk0YTE7",
      "ContainerWidth":"665",
      "DefaultInstrument":"EUR-USD",
      "HighlightColor":"rgba(0,0,0,1.0)",
      "IsDisplayTitle":false,
      "IsShowChartLinks":true,
      "IsShowEmbedButton":true,
      "CompactType":"large",
      "Calculator":"position-size-calculator",
      "ContainerId":"position-size-calculator-956132"
    });
  `;

  return (
    <div id="position-size-calculator-956132">
      <Helmet>
        <script type="text/javascript" src="https://www.cashbackforex.com/Content/remote/remote-widgets.js"></script>
        <script type="text/javascript" dangerouslySetInnerHTML={{ __html: scriptContent }} />
      </Helmet>
    </div>
  );
};

方法2:用useEffect在组件挂载后执行脚本

更贴合React生命周期,确保第三方脚本加载完成后再调用函数:

import { Helmet, useEffect } from "react-helmet";

const PositionSizeCalculator = () => {
  useEffect(() => {
    const initCalculator = () => {
      if (window.RemoteCalc) {
        window.RemoteCalc({
          Url: "https://www.cashbackforex.com",
          TopPaneStyle: "YmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KCMzNDM1NDAgMCUsICMyNDI4MzEgMTAwJSk7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyLWJvdHRvbTogbm9uZTs=",
          BottomPaneStyle: "YmFja2dyb3VuZDogIzE1MTgxZDsgYm9yZGVyOiBzb2xpZCAwcHggIzJhMmUzOTsgY29sb3I6ICM5MTk0YTE7",
          ButtonStyle: "YmFja2dyb3VuZDogIzM0MzU0MDsgY29sb3I6IHdoaXRlOyBib3JkZXItcmFkaXVzOiAyMHB4Ow==",
          TitleStyle: "dGV4dC1hbGlnbjogbGVmdDsgZm9udC1zaXplOiA0MHB4OyBmb250LXdlaWdodDogNTAwOw==",
          TextboxStyle: "YmFja2dyb3VuZDogIzE1MTgxZDsgYm9yZGVyOiBzb2xpZCAwcHggIzJhMmUzOTsgY29sb3I6ICM5MTk0YTE7IGJvcmRlcjogc29saWQgMHB4ICM5MTk0YTE7",
          ContainerWidth: "665",
          DefaultInstrument: "EUR-USD",
          HighlightColor: "rgba(0,0,0,1.0)",
          IsDisplayTitle: false,
          IsShowChartLinks: true,
          IsShowEmbedButton: true,
          CompactType: "large",
          Calculator: "position-size-calculator",
          ContainerId: "position-size-calculator-956132"
        });
      }
    };

    // 检查脚本是否已加载
    const existingScript = document.querySelector('script[src="https://www.cashbackforex.com/Content/remote/remote-widgets.js"]');
    if (existingScript) {
      initCalculator();
    } else {
      // 动态加载脚本(可选,增强可靠性)
      const newScript = document.createElement('script');
      newScript.src = "https://www.cashbackforex.com/Content/remote/remote-widgets.js";
      newScript.onload = initCalculator;
      document.body.appendChild(newScript);
    }

    return () => {
      // 组件卸载时可添加清理逻辑(如移除动态脚本)
    };
  }, []);

  return (
    <div id="position-size-calculator-956132">
      <Helmet>
        <script type="text/javascript" src="https://www.cashbackforex.com/Content/remote/remote-widgets.js"></script>
      </Helmet>
    </div>
  );
};

内容的提问来源于stack exchange,提问作者tanjona777

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 14:40:38