将 webpack worker-loader 与 nuxt.js 一起使用
Using webpack worker-loader with nuxt.js
我正在尝试在 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' })
让我们先解决一些问题:
- workers 仅在客户端可用 -> 无 ssr
所以要么你需要使用 no ssr component, or need to set the the application to no ssr
有了这些知识,我们将nuxt.config.js
修改如下:
mode: 'spa',
build: {
extend(config, { isDev, isClient }) {
...
// Web Worker support
if (isClient) {
config.module.rules.push({
test: /\.worker\.js$/,
use: { loader: 'worker-loader' },
exclude: /(node_modules)/
})
}
}
}
在 npm run build
和 npm run start
之后,它应该很有魅力。
我为你创建了一个 repo,它是一个标准的 nuxt 模板,worker-loader 使用了:Github Repo
对于 worker-loader,有 the fallback option 但就我个人而言(这就是我正在做的)我只会将通信代码保留在直接工作文件中,导入具有实际工作量的第二个文件。这样第二个文件也可以导入服务器端。
很可能在分叉 thread/threadpool 中,除非您处于 FaaS 上下文中并且您的主线程实际上没有其他事情可做。
此外,您是否必须在 nuxt.config.js
中使用以下内容?对我来说,没有它,就是 "window is undefined"。 (在浏览器中,尝试实例化 worker 时)
extend(config, ctx) {
/*
** Required for HotModuleReloading to work with worker-loader
*/
config.output.globalObject = 'this'
}
我正在尝试在 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' })
让我们先解决一些问题:
- workers 仅在客户端可用 -> 无 ssr
所以要么你需要使用 no ssr component, or need to set the the application to no ssr
有了这些知识,我们将nuxt.config.js
修改如下:
mode: 'spa',
build: {
extend(config, { isDev, isClient }) {
...
// Web Worker support
if (isClient) {
config.module.rules.push({
test: /\.worker\.js$/,
use: { loader: 'worker-loader' },
exclude: /(node_modules)/
})
}
}
}
在 npm run build
和 npm run start
之后,它应该很有魅力。
我为你创建了一个 repo,它是一个标准的 nuxt 模板,worker-loader 使用了:Github Repo
对于 worker-loader,有 the fallback option 但就我个人而言(这就是我正在做的)我只会将通信代码保留在直接工作文件中,导入具有实际工作量的第二个文件。这样第二个文件也可以导入服务器端。 很可能在分叉 thread/threadpool 中,除非您处于 FaaS 上下文中并且您的主线程实际上没有其他事情可做。
此外,您是否必须在 nuxt.config.js
中使用以下内容?对我来说,没有它,就是 "window is undefined"。 (在浏览器中,尝试实例化 worker 时)
extend(config, ctx) {
/*
** Required for HotModuleReloading to work with worker-loader
*/
config.output.globalObject = 'this'
}