Проект Ember-cli и веб-воркеры

Ember-cli: 0,33

Как я могу использовать веб-воркеров в проекте на основе ember-cli?

Пример - у меня есть компонент, и я хочу запустить веб-воркер:

import Ember from 'ember';
export default Ember.Component.extend({
  _startWorker: function() {
    var worker = new Worker('path/to/worker.js');
  }.on('didInsertElement')
});

В какую папку мне поместить файл worker.js в структуру проекта ember-cli? Какие еще изменения требуются (Brocfile.js, ...)?


person Steven    schedule 12.06.2014    source источник
comment
Соответствующая проблема: github.com/ember-cli/ember-cli/issues/1011   -  person Steven    schedule 14.04.2015


Ответы (3)


Одно из возможных решений:

1) В корневой папке проекта ember добавьте новую папку с именем «worker».

2) Обновите ваш Brocfile.js (см. Снимок экрана)

3) Пишите рабочие :-)

Необходимые изменения для поддержки веб-работников

person Steven    schedule 20.11.2014
comment
@torazaburo При таком подходе вам нужно будет вручную перенести файлы. Это можно сделать с помощью надстройки в репо. Для примера проекта, в котором что-то похожее работает с сервис-воркерами, оформление заказа: github.com/DockYard/ember-service-worker/blob/master/lib/ - person efx; 14.04.2017

соответствующий код из решения @ Steven для легкого копирования:

/* global require, module, process */

var EmberApp = require('ember-cli/lib/broccoli/ember-app');
var pickFiles = require('broccoli-static-compiler');

var app = new EmberApp();

var workers = pickFiles('workers', {
  srcDir: '/',
  files: ['*.js'],
  destDir: '/assets/workers'
});

if (process.env.EMBER_ENV === 'production') {
  workers = require('broccoli-uglify-js')(workers, {
    mangle: true,
    compress: true
  });
}

module.exports = app.toTree(workers);

person kturney    schedule 19.02.2015

Если это кому-то поможет, мне удалось начать использовать рабочих с конфигурацией ниже, используя ember-cli> = 2.4.2, чтобы иметь возможность использовать outputFile:

//ember-cli-build.js
..
//don't prepend CDN to worker paths (or CORS issue)
fingerprint: {
  exclude: ['worker'],
  ..
}
..
var app = new EmberApp(defaults, {
  ..
  app.import('vendor/localforage.js');//use localforage outside of workers
  app.import('vendor/localforage.js',outputFile:'assets/workers/localforage.js'});//use localforage inside of workers
  app.import('vendor/worker_localforage.js',outputFile:'assets/workers/worker_localforage.js'});
  app.import('vendor/worker_test_indexeddb.js',outputFile:'assets/workers/worker_test_indexeddb.js'});
});

Затем рабочий код:

//vendor/worker_localforage.js
importScripts('localforage.js');

self.onmessage = function(e) {
  var namespace=e.data.namespace;
  var msg=e.data.msg;
  var data=e.data.data;
  //console.log("msg to worker",namespace,msg);
  if (msg==="load") {
    localforage.getItem(namespace).then(function(res){
      self.postMessage({msg:"load",data:res});
    });
  }
  else if (msg==="persist") {
    localforage.setItem(namespace,data).then(function(res){
      self.postMessage({msg:"persist",data:res});
    });
  }
};

Вызов воркеров из любого места вашего приложения:

self.worker=new Worker("assets/workers/worker_localforage.js");
var worker=self.worker;
prom2= new Ember.RSVP.Promise(function(resolve,reject){
  worker.onmessage=function(e){
    if (e.data.msg==="load") {
      resolve(e.data.data);
    }
  }
});
worker.postMessage({namespace:self.adapterNamespace(),msg:"load"});
person Leooo    schedule 10.04.2016
comment
это хорошая идея, но, к сожалению, [email protected] не переносит рабочие файлы. Вероятно, это ожидается и, вероятно, повлияет на другие версии ember-cli. - person efx; 14.04.2017