javascript - 将导入加载器和导出加载器与覆盖模块变量的库链接起来

标签 javascript webpack emscripten vorbis webpack-loader

我正在尝试加载一个名为 libvorbis.js 的音频编码库,它是 vorbis 的 emscripten 编译版本。

libvorbis.js 需要在其作用域内使用 window 变量来执行,并将类暴露为没有导出声明的 var。

通常情况下,链接imports-loader 和exports-loader 来获取这样的文件是很容易的。 使用-

require 'imports-loader?this=>window!exports-loader?VorbisMediaRecorder!libvorbis.js/build/libvorbis.js'

它将在 libvorbis.js 中将窗口对象公开为“this”,并取出 VorbisMediaRecorder 作为对 this 的返回,这是我稍后运行的其他模块/代码所需要的。

但是,libvorbis.js 本身会覆盖“模块”变量,从而导致导出加载程序无法导出

libvorbis.js 在其代码中进行了此检查

// node.js Environment
var module;
if (module && module.exports) {
    makeVorbisEncoderModule({}, module);
}

// Web Worker Environment
if (!module && this.document === undefined) {
    VorbisWorkerScript.main(this);
}

这会覆盖模块,导致 webpack 抛出此错误

commons.js:142 TypeError: Cannot set property 'exports' of undefined

因为它正在尝试运行

/*** EXPORTS FROM exports-loader ***/
module.exports = VorbisMediaRecorder;

关于如何解决这个问题有什么想法吗?我真的不想 fork libvorbis 并修改它的源代码。

libvorbis.js 库被编写为作为脚本包含在页面上。

最佳答案

所以我通过使用文件加载器解决了我的特殊问题。它将完全像带有 src 等的文件一样加载脚本...因此它可以毫无问题地运行。

# libvorbis must be resolved in window scope, use the file-loader
require 'file-loader?name=[name].[ext]!libvorbis.js/build/libvorbis.js'

关于javascript - 将导入加载器和导出加载器与覆盖模块变量的库链接起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46944132/

相关文章:

javascript - 在 iOS + Javascript 上以高帧率反复交换图像?

javascript - Webpack 中的 "publicPath"有什么作用?

sass - 在每个文件中添加 common.sass 文件

javascript - Webpack + React : pass commit SHA from webpack to JS

llvm - pypy 在浏览器中?

javascript - Vue.js + Express : Cannot get . Prevent/e.preventDefault() 可以工作吗?

Javascript:如何提取字符串中的测量值

javascript - 如何防止子组件重新渲染?

javascript - 将 JS ArrayBuffer 或 TypedArray 传递给 Emscripten,无需复制

javascript - 如何在 vue.js 中调用 webassembly 方法?