Reactjs 在React组件中包含外部js脚本

Reactjs 在React组件中包含外部js脚本,reactjs,webpack,Reactjs,Webpack,我有一个react应用程序,使用react脚本进行管理 在我的应用程序中,我使用了一个外部js脚本。外部脚本不执行任何模块导出 外部脚本的结构如下所示(太大,无法完整包含它) 在文件末尾: if (window.TradingView && jQuery) { jQuery.extend(window.TradingView, TradingView) } else { window.TradingView = TradingView } 我的目标是使用外部脚本

我有一个react应用程序,使用react脚本进行管理

在我的应用程序中,我使用了一个外部js脚本。外部脚本不执行任何模块导出

外部脚本的结构如下所示(太大,无法完整包含它)

在文件末尾:

if (window.TradingView && jQuery) {
    jQuery.extend(window.TradingView, TradingView)
} else {
    window.TradingView = TradingView
}
我的目标是使用外部脚本创建一个简单的react组件,并调用函数:
TradingView.widget({…})

我一直在网上搜索在react component/ES6样式中包含外部脚本的方法,并尝试了各种选项:react异步脚本加载程序和各种网页包插件:脚本加载程序、导入加载程序、ProvidePlugin等,但我一直无法使其工作

使用导入加载程序或ProvidePlugin后出现的错误是:

1189:31    error    'jQuery' is not defined                        no-undef
1190:9     error    'jQuery' is not defined                        no-undef
在我的网页包配置中,我有:

装载机
部分:

{
    test: /tv\.exec\.js/,
    loader: 'imports?jQuery=jquery,$=jquery,this=>window'
}
new webpack.ProvidePlugin({
    $: "jquery",
    jQuery: "jquery"
})
插件
部分:

{
    test: /tv\.exec\.js/,
    loader: 'imports?jQuery=jquery,$=jquery,this=>window'
}
new webpack.ProvidePlugin({
    $: "jquery",
    jQuery: "jquery"
})
当我创建一个简单的网页(无反应)并包含脚本,然后调用
TradingView.widget()
,页面就可以正常工作了

我能得到的最接近的帮助是:

但这对我不起作用。我对react,webpack生态系统还很陌生,所以我不确定我在这里遗漏了什么

如果您需要任何其他信息,请告诉我


更新:我测试了上述内容,包括一个简单的react组件中的脚本,但这次没有使用react脚本,而是直接使用webpack配置。我只是能够直接在我的组件中导入外部js,而且它工作正常。我还能够在webpack中使用imports loader插件来公开jQuery,这同样有效。因此,使用react脚本可能需要其他东西才能正常工作。

看起来您的外部脚本正在通过将它们添加为窗口的成员来处理其“导出”。您可以在不定义导出的文件上使用import关键字,如下所示:

  import "modulename";
这种语法没有什么特别之处,只是它并不意味着任何函数或变量都可以通过导入工具使用。“modulename”中为.window分配成员的代码将被执行,这一点很重要

有关访问window.*全局变量的编译器投诉,请尝试将要访问的变量分配给局部变量:

const jquery = window.jquery;
……或者

const TradingView = window.TradingView;

然后,您将在作用域中使用变量,并且它应该是可用的。

我按照建议尝试了,但仍然得到了相同的错误。您是否可以使用调试器或console.log(window.variable)检查您要使用的变量(jquery或TradingView)在导入后是否被指定为window的成员?如果是,那么您应该能够将该值赋给一个局部作用域变量并使用它。但不管怎样,我找到了绕过这个问题的方法。我用新的信息更新了这个问题。