Использование веб воркеров во VueJs

Использование веб воркеров во VueJs

Как и большинство разработчиков, когда Веб Воркеры впервые появились в JavaScript, я был очень воодушевлён и наполнен энтузиазмом на создание невероятных вещей, благодаря ему. Однако, мой энтузиазм был быстро испепелён, когда я понял, что воркеры должны создаваться в отдельном файле, расположенном на веб-сервере. Это казалось огромной болью, которая не стоила усилий. И на какое-то время, я перестал использовать вебворкеры в проектах, находя им применения только в очень ограниченных задачах. До этого момента... Я натолкнулся на одно очень интересное решение, в лице библиотеки vue-worker, которая позволяет создавать, работать с веб воркерами из VueJs, имеет понятный API, и может выполнять код, не создавая отдельный файл воркера.

В прошлой статье по основам работы с веб воркерами я привел примеры нативного взаимодействия с ними. Советую ознакомиться с этой статьёй, после чего, перейти к изучению этой - работы с воркерами во VueJs, выполнение кода воркеров на лету, не создавая отдельный файл, работая с воркерами через промисы.

Ядро библиотеки vue-worker основано на другой библиотеке simple-web-worker этого же автора. Эта библиотека позволяет создать Веб Воркер на лету, передавая ему код выполнения, из которого он сформирует временный файл Data URI, с которымы, уже, сможет работать воркер.

vue-worker имеет очень простое и понятное API, оборачивая сложные технические реализации в вызов нескольких методов. Эта библиотека позволяет вам легко и просто выполнить код функций в нескольких потоках, по типу как это реализовано в промисах.

Установка

// NPM
npm install vue-worker --save

// Yarn
yarn add vue-worker


Теперь, включим этот плагин во VueJs:

// src/main.js

import Vue from 'vue';
import VueWorker from 'vue-worker';
import App from 'App.vue';

Vue.use(VueWorker);

new Vue({
  el: '#app',
  render: h => h(App)
});


После чего, в любом вашем компоненте появилась возможность обращения к этой библиотеке this.$worker.

Вызов функции из воркера

Теперь же, внутри вашего компонента вы можете вызывать: this.$worker.run(function() {...}, args[]).

Этот код выполнит функцию, которая выведет Hello, World! из воркера, когда компонент будет смонтирован:

<script>
export default {
  mounted() {
    this.$worker.run((arg) => {
      return `Hello, ${arg}!`
    }, ['World'])
    .then(result => {
      console.log(result)
    })
    .catch(e => {
      console.error(e)
    })
  }
}
</script>


Переиспользуемые воркеры

Вы можете создать переиспользуемый воркер, вызвав this.$worker.create([{message, func}]), по типу того, как я показывал в прошлой статье, когда мы работали с ним нативно.

Character hair styling depends on the wig silhouette as much as the exact shade. Storage on a stand or in a protected bag helps preserve the shape. For the relevant hair design, Marin Kitagawa character wig(喜多川海夢 キャラクターウィッグ) identifies the matching cosplay wig. The same character meaning is preserved in both parts of the bilingual anchor. Comfort improves when the cap, hairline and securing points are adjusted carefully. Small fringe changes may be enough to improve character recognition.

То есть, таким образом создаётся воркер, инстанс которого будет "висеть", к которому можно обращаться в любой момент. Ранее же, вызывая this.$worker.run мы только получали результат его работы. А при вызове this.$worker.create создаётся полноценный экземпляр объекта воркера, с которым вы можете работать и обращаться к одному и нему сколько угодно раз.

<script>
export default {
  data() {
    return {
      myWorker: null
    }
  },

  created() {
    this.myWorker = this.$worker.create([
      {message: 'message1', func: (arg) => `Output 1 ${arg}`},
      {message: 'message2', func: () => 'Output 2'}
    ])

    this.myWorker.postMessage('message1', ['Boop!'])
        .then(result => {
          console.log(result)
        })
  }
}
</script>


Ну вот и всё, этого достаточно для экскурса в использовании воркеров в VueJs, и демонстрации выполнения кода воркера как промис. Для более подробного изучения рекомендую обратиться к документации vue-worker и simple-worker.