【发布时间】:2018-08-15 02:57:43
【问题描述】:
我正在尝试在 nuxt.js framework 中使用 Web Worker,但不断收到引用错误。 ReferenceError: Worker is not defined.
我已经通过 npm 安装了worker-loader 1.1.1,并将以下规则添加到我的nuxt.config.js:
module.exports = {
build: {
extend (config, { isDev, isClient }) {
if (isDev && isClient) {
config.module.rules.push({
enforce: 'pre',
test: /\.(js|vue)$/,
loader: 'eslint-loader',
exclude: /(node_modules)/
})
}
// Web Worker support
config.module.rules.push({
test: /\.worker\.js$/,
use: { loader: 'worker-loader' },
exclude: /(node_modules)/
})
}
}
}
如果我通过 nuxt build 创建构建,它看起来就像创建了 web worker 文件。
Asset Size
2a202b9d805e69831a05.worker.js 632 bytes [emitted]
我将它导入到 vuex 模块中,如下所示:
import Worker from '~/assets/js/shared/Loader.worker.js'
console.log(Worker)
const worker = new Worker // <- this line fails!
在控制台中,我得到了一个看起来像创建工作者的函数:
ƒ () {
return new Worker(__webpack_require__.p + "345c16d02e75e9312f73.worker.js");
}
在worker内部,我只是有一些虚拟代码来看看它是否真的有效:
const msg = 'world!'
self.addEventListener('message', event => {
console.log(event.data)
self.postMessage({ hello: msg })
})
self.postMessage({ hello: 'from web worker' })
【问题讨论】:
-
我也尝试过使用 workerize-loader 但得到了不同的错误。我确定这与我的配置有关,但我仍然不知道该怎么做。 github.com/developit/workerize-loader/issues/27
-
不应该是
new Worker()吗? -
@lukas-reineke 如果您不向 JS 中的构造函数发送参数,那么括号是可选的。 stackoverflow.com/a/3034952/205696 无论如何,我都尝试了(以及许多其他方法),但都失败了。
-
尝试以这种方式导入 import * as Worker from "worker-loader!~/assets/js/shared/Loader.worker.js'"; 这种类型的导入然后创建一个实例。