javascript - 如何在 webpack 的生产版本中引用 Web Workers?

标签 javascript angular webpack web-worker webpack-3

我正在使用 Angular 的 webpack 模板,由 Angular 启动种子提供 Angular Webpack Starter 。这使用 chunkhashing 进行生产构建(请参阅 webpack.prod.js)。

我修改了 webpack 配置,为 webworker 生成单独的包(请参阅 webpack.common.js)。文件名在 dist 目录中生成,并命名为 worker.[chunkhash].bundle.js

是否有任何方法可以确定包的 chunkhash,以便可以将其正确导入到 Worker 构造函数中,例如

let w: Worker = new Worker('worker' + chunkhash_variable + '.bundle.js')

或者,更好的做法是

  1. 将 Web Worker 的 javascript 存储在 asset 文件夹中,let w: Worker = new Worker('assets/js/worker.js')

  2. 使用CopyWebPackPlugin将 Web Worker javascript 从源文件夹复制到构建文件夹。

任何人都可以建议引用网络 worker 的最佳实践吗?

webpack.common.js

module.exports = function (options) {
    ...
    const entry = {
      polyfills: './src/polyfills.browser.ts',
      main:      './src/main.browser.ts',
      worker:    './src/app/documents/webworkers/documentupload.webworker.js'
    };
    ...
}

webpack.prod.js

module.exports = function (env) {

  ...

  return webpackMerge(commonConfig({env: ENV, metadata: METADATA}), {

    output: {
      path: helpers.root('dist'),
      filename: '[name].[chunkhash].bundle.js',
      sourceMapFilename: '[file].map',
      chunkFilename: '[name].[chunkhash].chunk.js'
    },

    module: {
      rules: [
      {
        test: /\.css$/,
        loader: ExtractTextPlugin.extract({
          fallback: 'style-loader',
          use: 'css-loader'
        }),
        include: [helpers.root('src', 'styles')]
      },

      {
        test: /\.scss$/,
        loader: ExtractTextPlugin.extract({
          fallback: 'style-loader',
          use: 'css-loader!sass-loader'
        }),
        include: [helpers.root('src', 'styles')]
      },
      ]
   },

   plugins: [

    new SourceMapDevToolPlugin({
      filename: '[file].map[query]',
      moduleFilenameTemplate: '[resource-path]',
      fallbackModuleFilenameTemplate: '[resource-path]?[hash]',
      sourceRoot: 'webpack:///'
    }),

    ...
}

最佳答案

尝试使用 webpack 加载器。

npm install worker-loader --save-dev

在模块文件夹中,使用

{test: /\.worker\.js$/, use: { loader: 'worker-loader' }}

然后运行您的 webpack 构建。 Webpack 将在您的捆绑文件中创建 [hash].worker.js。如果您运行应用程序并监控网络,您会注意到您的 [hash].worker.js 文件正在被提供和缓存。

您现在可以通过导入来使用 Web Worker。注意 worker 装载机!调用worker.js 文件需要该前缀。

import Worker from 'worker-loader!./worker.js'

const myWorker = new Worker();

myWorker.postMessage();

myWorker.onmessage = function(){...}

关于javascript - 如何在 webpack 的生产版本中引用 Web Workers?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50491959/

相关文章:

javascript - 有没有一种方法可以使用 Angular 中的路线来自动滚动到 ng-repeat 中的数据

vue.js - 获取 : ERR_SSL_PROTOCOL_ERROR nginx + vue. js

javascript - 未捕获的类型错误 : Cannot read property 'locals' of undefined

javascript - iPhoto 相册过渡

php - 如何将文本框的值存储到数据库中?

angular - 如何清除提供者缓存以在 Angular 7 中与 useFactory 一起使用

javascript - 浏览器可能不使用缓存

node.js - 如何将 webpack 与 monorepo 一起使用(yarnpkg 工作区)

javascript - Express.js 中设置和获取 cookie 失败

mongodb - 在 Meteor MongoObservable 中获取插入的文档 ID