【问题标题】:Webpack and Web Workers in ionic 2ionic 2 中的 Webpack 和 Web Workers
【发布时间】:2017-12-06 15:20:19
【问题描述】:

我们计划在 ionic 2 应用程序中使用网络工作者。但是 ionic 2 使用 ionic-app-scripts(https://github.com/ionic-team/ionic-app-scripts,我们使用的是 1.0.0 版)和 webpack。我们需要有一个 webworker typescript 文件,该文件编译为 JS,但不与其他文件捆绑为 main.js。

我们想到的是有一个文件名格式,例如

servicetest.worker.ts,其中“.worker”文件扩展名部分将被识别并从 typescript 编译为 javascript,但不会与其他文件捆绑在一起。

对此的任何建议都非常感谢,因为我们似乎必须自定义 appscripts。

【问题讨论】:

    标签: javascript typescript webpack ionic2 web-worker


    【解决方案1】:

    有点晚的答案,但也许它可以帮助其他人。 看看https://www.javascripttuts.com/how-to-use-web-workers-with-ionic-in-one-go/

    我按照那篇文章做了一些调整,因为我必须按需调用工作方法,而不是在构造函数上。

    ./src/assets 文件夹上创建一个名为workers 的新文件夹,您的worker.JS 文件将存放在其中。是的 JS 不是 TS,据我所知 TypeScript 文件不会编译为可用的网络工作者。

    创建一个网络工作者。我将粘贴我的模糊搜索网络工作者 (./assets/workers/fuzzysearch-worker.js) 的主要代码:

    'use strict';
    
    var pattern, originalList;
    self.onmessage = function(event) {
        // Receive a message and answer accordingly
        pattern = event.data.pattern;
        originalList = event.data.originalList;
        self.doFuzzySearch();
    };
    
    self.doFuzzySearch = function() {
        var filteredList;
    
        console.time('internalFastFilter');
        filteredList = self.fastFilter(originalList, (item) => self.hasApproxPattern(item.searchField, pattern));
        console.timeEnd('internalFastFilter');
    
        // Send the results back 
        postMessage({ filteredList: filteredList });    
    };
    
    // The code above is purposely incomplete
    

    在您的 .ts 文件中声明工作变量(通常在构造函数上方):

    private readonly searchWorker: Worker = new Worker('./assets/workers/fuzzysearch-worker.js');
    

    关于构造函数:

    constructor(/* Other injected dependencies here */
        public ngZone: NgZone) {       
    
            this.searchWorker.onmessage = (event) => {
              // Inside ngZone for proper ChangeDetection
              this.ngZone.run(()=> {                        
                this.dataList = event.data.filteredList;
                console.timeEnd('searchWorker');
              })
            };        
    
      }
    

    最后,关于你的“action function”,让我们说doSearch

    doSearch(event) {
        // ... extra code to do some magic
    
        console.time('searchWorker');
        this.searchWorker.postMessage({ command: 'doFuzzySearch', originalList: this.realList, pattern: searchFilter });
    
        // ... extra code to do some other magic
    }
    

    this.searchWorker.postMessage 拨打电话。所有繁重的加载操作都在 webworker 内部解决。

    希望对您有所帮助。 最好的问候。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      • 2013-06-05
      • 1970-01-01
      • 2022-06-13
      • 1970-01-01
      相关资源
      最近更新 更多