是的,有可能,您可能已经在使用像 webpack 或 parcel 这样的流行打包工具,但即使您不是,它仍然是可能的,尽管可能不是直接来自 node_modules
带包裹
main.js
// relative path to the worker from current file
const worker = new Worker('../utils/myWorker.js');
myWorker.js
// use import like you would in any other file
import moment from 'moment';
console.log(`From worker: worker started at ${moment().format('HH:mm:ss')}`);
使用 Webpack(作为入口)
main.js
// relative to the expected public path (have in mind any filename transforms like hashing)
const worker = new Worker('myWorker.bundle.js');
myWorker.js
// use import like you would in any other file
import moment from 'moment';
console.log(`From worker: worker started at ${moment().format('HH:mm:ss')}`);
webpack.config.js
{
entry: {
main: './src/app/main.js'
worker: './src/utils/myWorker.js',
},
output: {
path: `${ROOT_PATH}/public`,
filename: '[name].bundle.js',
}
}
使用 Webpack (worker-loader)
安装加载器
main.js
// relative path to the worker from current file
import Worker from '../utils/myWorker.worker.js';
const worker = new Worker();
myWorker.worker.js
// use import like you would in any other file
import moment from 'moment';
console.log(`From worker: worker started at ${moment().format('HH:mm:ss')}`);
webpack.config.js
{
module: {
rules: [
{
test: /\.worker\.js$/,
use: { loader: 'worker-loader' }
}
]
}
}
使用 CRA (Create React App) (worker-loader) 内联加载器
使用内联加载器
main.js
/* eslint-disable import/no-webpack-loader-syntax */
import Worker from "worker-loader!./myWorker.worker.js";
const worker = new Worker();
myWorker.worker.js
// use import like you would in any other file
import moment from 'moment';
console.log(`From worker: worker started at ${moment().format('HH:mm:ss')}`);
您始终可以从 CDN 导入库
myWorker.js
importScripts('//cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js');
console.log(`From worker: worker started at ${moment().format('HH:mm:ss')}`);
其他捆绑程序
- 出于安全原因,Web 工作人员不能从父文件夹
importScripts
-
node_modules 文件夹通常位于项目的根目录,因此您无法使用importScripts 访问它
- 需要配置捆绑程序,以便内容可以别名或复制到工作人员可以访问的位置
AngularCLI、Ionic、CRA
对于使用 webpack 作为打包器的项目,只要您可以访问 webpack 配置并对其进行自定义,就可以调整 2 个 webpack 解决方案。
如果您无法访问配置 (CRA),您可以使用“With CRA”示例中的内联加载程序
“Webpack (as entry)”的例子其实是从Angular CLI generated app with Web Workers借来的
- 它解释了如何使用 Web Worker 修改设置以引导 Angular
- 它也被称为 Ionic 项目的网络工作者解决方案
TypeScript 说明
{
"extends": "../generic-tsconfig.json",
"compilerOptions": {
"lib": ["esnext", "webworker"],
}
}