Невозможно связать Web Worker для импорта как пакет NPM

Моя цель - иметь возможность публиковать пакет NPM Web Worker, который можно импортировать в обычном режиме (import MyPkg from 'my-pkg') без необходимости импорта пользователем worker-loader (встроенный или другой)

Для этого я попытался использовать скрипт сборки Babel, а также Webpack с worker-loader,

В следующих примерах есть два проекта: пакет Web Worker ("Пакет"), который npm link Редактировать в тестовое приложение ("Приложение").

Пакет разбит на два файла: entry.webpack.js а также index.worker.js, Запись, когда построена и перемещена в /dist обозначается как main файл в package.json, и в настоящее время он выглядит так:

entry.webpack.js

var MyPkg = require('worker-loader!./index.worker.js')
module.exports = MyPkg

index.worker.js

// This is just example code. It doesn't really matter
// what this code does so long as it ends up being run
// as a Web Worker.

var selfRef = self;

function ExampleWorker () {
  console.log('Running Worker...');
  setTimeout(function () {
    // wait 10 seconds then post a message
    selfRef.postMessage({foo: "bar"});
  }, 10000)
}

module.exports = ExampleWorker

Затем я связываю пакет с Webpack:

package.json

"build": "rm -rf dist/*.* && webpack --progress"

webpack.config.js

module.exports = {
  mode: 'production',
  devtool: 'source-map',
  entry: __dirname + '/src/entry.webpack.js',
  output: {
    filename: 'bundle.js',
    path: __dirname + '/dist'
  },
  optimization: {
    minimize: false
  }
}

Это создает два файла: bundle.js и файл Web Worker в виде хэша: [hash].worker.js с кодом, который мы хотим оценить в нем. Они играют ключевую роль в этом, потому что мы использовали worker-loader встроенный в импорт, скомпилированный вывод webpack выглядит примерно так:

module.exports = function() {
  return new Worker(__webpack_require__.p + "53dc9610ebc22e0dddef.worker.js");
};

Наконец, приложение должно иметь возможность импортировать и использовать его следующим образом:

App.js

import MyPkg from 'my-pkg'
// logging MyPkg here produces `{}`

const worker = new MyPkg()
// That throws an Error:
// Uncaught TypeError: _my_pkg__WEBPACK_IMPORTED_MODULE_4___default.a is not a constructor

worker.onmessage = event => {
  // this is where we'd receive our message from the web worker
}

Однако вы можете заставить его работать, если в самом приложении вы импортируете рабочую сборку следующим образом:

import MyPkg from 'my-pkg/dist/53dc9610ebc22e0dddef.worker.js'

Но это требование пакета:

A) НЕ требует, чтобы приложения, использующие пакет, должны были явно установить worker-loader и Б) не должны ссылаться на my-pkg/dist/[hash].worker.js в явном виде.

Я попытался также обозначить встроенный [hash].worker.js' as the main` в package.json, но это тоже не работает.


Редактировать 1: я забыл упомянуть, что я все это основываю на том, как react-pdf Является ли. Если вы посмотрите в /src/entry.webpack.js и следите за тем, как это работает в пакете, вы увидите несколько сходств.

0 ответов

Вы можете попробовать рабочий-загрузчик с опцией:

{
    test: /\.worker\.js$/,
    use: {
        loader: 'worker-loader',
        options: {
            name: '[name].[hash:8].js',
            // notice here
            inline: true,
            fallback: false
        }
    }
},
Другие вопросы по тегам