31 votes

Application générée par Angular CLI avec Web Workers

En lisant la documentation d'Angular, vous pouvez trouver plusieurs références pour amor amor amor amor amor l l'ensemble de l'app Ang ang ang ang ang ang ang ang ang ang ang ang à l'intérieur d'un travail Web afin que votre interface utilisateur ne soit pas bloquée par une utilisation intensive de JS.

Cependant, pour l'instant, il n'y a pas d'information officielle sur la façon de le faire, et la seule information dans le Doc. Angular est que c'est une fonctionnalité expérimentale.

Comment puis-je utiliser cette approche pour tirer parti des travailleurs web dans Angular ?

77voto

Enrique Oriol Points 1340

Pour Angular 7, voir la réponse ci-dessous.

J'ai passé beaucoup de temps à trouver comment le faire, donc j'espère cela peut aider quelqu'un .

Conditions préalables

Je suppose que vous avez un projet Angular (version 2 ou 4) généré avec Angular CLI 1.0 ou plus.

Il n'est pas obligatoire de générer le projet avec CLI pour suivre ces étapes, mais les instructions que je vais donner concernant le fichier webpack, sont basées sur la configuration webpack CLI.

Étapes

1. Extraire le fichier webpack

Depuis Angular CLI v1.0, il existe la fonction "eject", qui vous permet d'extraire le fichier de configuration de webpack et de le manipuler comme vous le souhaitez.

  • Exécuter ng eject de sorte qu'Angular CLI génère le webpack.config.js fichier.

  • Exécuter npm install pour que les nouvelles dépendances générées par CLI soient satisfaites

2. Installer les dépendances de webworker bootstrap

Exécuter npm install --save @angular/platform-webworker @angular/platform-webworker-dynamic

3. Changements dans l'amorçage du fil de l'interface utilisateur

3.1 Changements dans app.module.ts

Remplacer BrowserModule par WorkerAppModule dans le fichier app.module.ts. Vous devrez également mettre à jour la déclaration d'importation afin d'utiliser @angular/platform-webworker bibliothèque.

//src/app/app.module.ts

import { WorkerAppModule } from '@angular/platform-webworker';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
//...other imports...

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    WorkerAppModule,
    //...other modules...
  ],
  providers: [/*...providers...*/],
  bootstrap: [AppComponent]
})
export class AppModule { }

3.2 Changements dans src/main.ts

Remplacer le processus d'amorçage par : bootstrapWorkerUI (mettre à jour également l'importation).

Vous devrez passer une URL avec le fichier où le travailleur web est défini. Utilisez un fichier appelé webworker.bundle.js ne vous inquiétez pas, nous allons créer ce fichier bientôt.

//main.ts

import { enableProdMode } from '@angular/core';
import { bootstrapWorkerUi } from '@angular/platform-webworker';

import { AppModule } from './app/app.module';
import { environment } from './environments/environment';

if (environment.production) {
  enableProdMode();
}

bootstrapWorkerUi('webworker.bundle.js');

3.3 Créer le fichier workerLoader.ts

  • Créer un nouveau fichier src/workerLoader.ts .
  • Comme votre Web Worker sera un fichier unique contenant tous les éléments requis, vous devez inclure les éléments suivants polyfills.ts , @angular/core et @angular/common paquets. Lors des prochaines étapes, vous mettrez à jour Webpack afin de transpiler et de construire un bundle avec le résultat.
  • Importation platformWorkerAppDynamic
  • Importez le AppModule (supprimer l'importation de main.ts ) et l'amorcer en utilisant ceci platformWorkerAppDynamic plate-forme.

    // workerLoader.ts

    import 'polyfills.ts'; import '@angular/core'; import '@angular/common';

    import { platformWorkerAppDynamic } from '@angular/platform-webworker-dynamic'; import { AppModule } from './app/app.module';

    platformWorkerAppDynamic().bootstrapModule(AppModule);

4. Mettez à jour webpack pour construire votre webworker

Le fichier de configuration généré automatiquement par webpack est assez long, mais vous devrez simplement concentrer votre attention sur les points suivants :

  • Ajouter un webworker point d'entrée pour notre workerLoader.ts fichier. Si vous regardez la sortie, vous verrez qu'il attache un préfixe bundle.js à tous les chunks. C'est pourquoi pendant l'étape de bootstrap nous avons utilisé webworker.bundle.js

  • Aller à HtmlWebpackPlugin et exclure le webworker de sorte que le fichier Web Worker généré n'est pas inclus dans le fichier index.html.

  • Aller à CommonChunksPlugin et pour le inline commun, définissez les morceaux d'entrée de manière explicite afin d'empêcher webworker à inclure.

  • Aller à AotPlugin et fixer explicitement les entryModule

    // webpack.config.js

    //...some stuff... const HtmlWebpackPlugin = require('html-webpack-plugin'); const { CommonsChunkPlugin } = require('webpack').optimize; const { AotPlugin } = require('@ngtools/webpack'); //...some stuff...

    module.exports = { //...some stuff... "entry": { "main": [ "./src/main.ts" ], "polyfills": [ "./src/polyfills.ts" ], "styles": [ "./src/styles.css" ], "webworker": [ "./src/workerLoader.ts" ] }, "output": { "path": path.join(process.cwd(), "dist"), "filename": "[name].bundle.js", "chunkFilename": "[id].chunk.js" }, "module": { /...a lot of stuff.../ }, "plugins": [ //...some stuff... new HtmlWebpackPlugin({ //...some stuff... "excludeChunks": [ "webworker" ], //...some more stuff... }), new BaseHrefWebpackPlugin({}), new CommonsChunkPlugin({ "name": "inline", "minChunks": null, "chunks": [ "main", "polyfills", "styles" ] }), //...some stuff... new AotPlugin({ "mainPath": "main.ts", "entryModule": "app/app.module#AppModule", //...some stuff... }) ], //...some more stuff... };

Vous êtes prêt

Si vous avez suivi correctement les étapes précédentes, il ne vous reste plus qu'à compiler le code et à essayer les résultats.

Exécuter npm start

Toute la logique de votre application Angular devrait s'exécuter dans un WebWorker, ce qui rend l'interface utilisateur plus fluide.

Notes sur les fourreaux

npm start exécute le serveur webpack-dev et il a un problème avec les webworkers qui envoient un message d'erreur sur le journal de la console. Quoi qu'il en soit, le webworker semble fonctionner correctement. Si vous compilez l'application en utilisant webpack et le servir à partir de n'importe quel serveur http tel que simplehttpserver l'erreur disparaît ;)

Exemple de code et démo

Vous pouvez obtenir le code complet (webpack config, app.module.ts, ...) à l'adresse suivante ce référentiel .

Vous pouvez également regarder ici une Démonstration en direct pour vérifier les différences entre l'utilisation ou non des Web Workers.

2voto

Bonne nouvelle, j'ai réussi à le faire fonctionner avec Angular 7 !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X