如何使用webpack从外部文件加载AMD模块

6

在一个项目中,我遇到了这样的情况:我需要使用脚本标签加载一个作为AMD模块编写的第三方文件:<script type="text/javascript" src="https://cdn.host.com/external.js"></script>

该文件包含多个模块,示例代码如下所示:

require(['src/module/MyObject'], (myObject) => {
 // Use myObject
});

示例包含 RequireJS 作为脚本标签,以启用这种语法。 现在……我的项目是一个使用 Webpack 的 React 应用程序,在其中我想要在某个组件中访问 'myObject',但我似乎无法使其工作。
仅使用 require() 语法会失败,因为 Webpack 尝试将代码添加到 bundle 中。我尝试了 'non_webpack_require' 替代方案,保持 RequireJS 脚本标签,但似乎这会在代码的其他地方添加各种冲突(所有地方都有未定义的东西)。我还尝试了调整 webpack 的 External 属性,但似乎也不能按预期工作。后者似乎是正确的方法,但最终我会遇到 'src/module/MyObject' 未定义错误。
感谢任何帮助。 编辑: 如请求所示,这是我的 webpack.config 相关部分:
{
  entry: './src/index.tsx',

  output: {
    path: path.join(__dirname, 'dist'),
    publicPath: '/',
    filename: `js/[name].[contenthash].bundle.js`,
    chunkFilename: 'js/[name].[contenthash].js',
  },

  resolve: {
    // Add '.ts' and '.tsx' as resolvable extensions.
    extensions: ['.ts', '.tsx', '.js', '.json'],
    plugins: [
      new TsconfigPathsPlugin(),
    ],
  },

  module: {
    rules: [
      {
        test: /\.tsx?$/,
        use: {
          loader: "babel-loader",
        },
        exclude: [/node_modules/],
      },
    ],
  },
}

如果您在HTML中包含库,则与Webpack无关。在加载应用程序后,请检查浏览器的开发控制台,以查看myObject是否为全局变量。 - kkkkkkk
是的,我可以下载文件并将其包含在我的捆绑包中。但仍然不知道如何做到这一点。而且,似乎没有全局对象。还有...我不想在脚本标记中包含RequireJS库,因为它会破坏其他东西。 - Bas Slagter
如果你使用Webpack本地引入,就不需要RequireJS了,因为Webpack应该支持它。你在使用哪个库?我可以看一下。 - kkkkkkk
这是文件链接:https://cdn.bitmovin.com/player/cast/8.1.0/bitmovinplayer-remotereceiver.js - Bas Slagter
你能同时发布你的Webpack配置相关部分吗? - kkkkkkk
@kkkkkkk 不确定是否有用,但我已经将其添加到帖子中。 - Bas Slagter
1个回答

0

我认为您使用了错误的示例。

RequireJS是一种不同的旧模块解析器。通常情况下,您不应该在同一个项目中同时使用webpackRequirejs。虽然有一些例外情况,但这不是其中之一。

我稍微看了一下您提供的库,他们确实有ES6模块包,您应该参考以下示例:

https://github.com/bitmovin/bitmovin-player-web-samples/tree/master/webpack-demo

这将是最好的选择。

如果出于某种原因您仍然想使用他们的CDN,那么适合您的是:

https://cdn.bitmovin.com/player/web/8/bitmovinplayer.js

在这里可以查看完整的演示库(其中也包括React)

https://github.com/bitmovin/bitmovin-player-web-samples


嗨,@jony89。感谢你的深度探究!非常感激。问题是我想使用他们的Chromecast库(不仅仅是播放器),目前只能以我提供的格式获得。我知道RequireJS和Webpack之间的区别,但不幸的是现在就是这样。 - Bas Slagter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接