如何使用 webpack 在 js 文件中加载 CDN 或外部供应商 javascript lib,而不是在 html 文件中

问题描述 投票:0回答:6

我正在使用 React 入门套件进行客户端编程。它使用react和webpack。没有index.html或任何要编辑的html,所有js文件。我的问题是,如果我想从云端加载供应商 js 库,我该怎么做?

在 html 文件中很容易做到这一点。

<script src="https://forio.com/tools/js-libs/1.5.0/epicenter.min.js"></script>

但是,在js文件中,它只使用npm安装的包。如何在没有 html 文件的情况下导入上述库?我尝试了 import 和 require,它们仅适用于本地文件。

更新 10/21/15 到目前为止我尝试了两个方向,但都不理想。

  1. @minheq 是的,有一个用于 React 启动套件的 html 文件。它是src/components/Html下的html.js。我可以将云库及其所有依赖项放在那里,如下所示:
        <div id="app" dangerouslySetInnerHTML={{__html: this.props.body}} />
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
        <script src="https://forio.com/tools/js-libs/1.5.0/epicenter.min.js"></script>
        <script src="/app.js"></script>
        <script dangerouslySetInnerHTML={this.trackingCode()} />
    </body>

好消息是它有效,我不需要在 js 文件中做任何其他事情,不需要导入或需要。但是,现在我有两个以不同方式加载的 jquery 库。一个在这里,另一个通过 npm 和 webpack。不知道以后会不会给我带来麻烦。如果我由于服务器端加载而在浏览器窗口中键入无主路径,我使用的反应路由会给我“未定义的变量”错误。所以这个解决方案不太好。

  1. 使用 webpack 外部功能。这被记录为:link。 “当您想要将现有 API 导入到捆绑包中时,您也可以使用应用程序的外部选项。即,您想要使用来自 CDN(单独标签)的 jquery,并且仍然希望在捆绑包中使用 require("jquery")。只需将其指定为 external: { externals: { jquery: "jQuery" } }。" 然而,我发现一些地方的文档都对如何准确地做到这一点很挑剔。到目前为止我不知道如何用它来替换html中的
    <script src="https://forio.com/tools/js-libs/1.5.0/epicenter.min.js"></script>
javascript node.js reactjs webpack
6个回答
23
投票

externals
无意让您这样做。这意味着“不要将此资源编译到最终包中,因为我自己会包含它”

您需要的是一个脚本加载器实现,例如script.js。我还编写了一个简单的应用程序来比较不同的脚本加载器实现:link.


16
投票
var $script = require("scriptjs");
$script("//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js", function() {
  $('body').html('It works!')
});

7
投票

您可以在 JS 中创建一个脚本标签作为

$("body").append($('<script src="https://forio.com/tools/js-libs/1.5.0/epicenter.min.js"></script>'))

2
投票

有一个 html 文件肯定是用来为附加了 js 包的用户提供服务的。也许你可以将脚本标签附加到该 html 文件中


1
投票

使用 webpack 的 externals:

externals
允许您指定库的依赖项 不被 webpack 解析,但成为输出的依赖项。这 意味着它们是在运行时从环境中导入的。


0
投票

我四处寻找解决方案,大多数建议都是基于外部的,这对我来说是无效的。

在另一篇文章中,我发布了我的解决方案:https://stackoverflow.com/a/62603539/8650621

换句话说,我完成了使用一个单独的JS文件,它负责将所需的文件下载到本地目录中。然后 WebPack 扫描该目录并将下载的文件与应用程序捆绑在一起。

© www.soinside.com 2019 - 2024. All rights reserved.