angular - Angular 7.0.1 中的网络 worker 设置

标签 angular typescript webpack web-worker angular7

我正在尝试在我现有的 Angular 7.0.1 项目(中型项目)中进行网络 worker 设置。通过以下链接后,我进行了设置:

以下是我对每个文件的更改:

./src/main.ts

import 'zone.js';
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();
}

console.log("main.ts file loaded!");
bootstrapWorkerUi('webworker.js');

./src/workerLoader.ts

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

console.log("workerLoader.ts file loaded!");

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

platformWorkerAppDynamic().bootstrapModule(AppModule);

./angular.json

"projects": {
  "[project name]": {
    "architect": {
      "build": {
        "builder": "@angular-builders/custom-webpack:browser",
        "options": {
          "customWebpackConfig": {
            "path": "./extra-webpack.config.js"
          }
          ...
          ...
        }
      }
    }
  }
}

./extra-webpack.config.js

const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    "entry": {
        "webworker": [
            "./src/workerLoader.ts"
        ]
    },
    "plugins": [
        new HtmlWebpackPlugin({
            "excludeChunks": [
                "webworker"
            ],
        })
    ],
    "output": {
        "globalObject": 'this'
    }
}

./tsconfig.json

{
    ...
    ...
    "angularCompilerOptions": {
        "entryModule": "./app/app.module#AppModule"
    }
}

这是 demo .你可能想查看我的 research notes .

我可能会走完全错误的方向,因为我只需要在 Angular 项目中包含并运行一个 Angular Service Worker 库(这应该非常简单)。

我尝试包含 webworker 的主要目的是让 web 应用程序在多线程上运行,以便屏幕上的动画、复选框、自定义下拉列表和滚动效果能够流畅地执行。

最佳答案

这是我的答案的副本 here

伙计们,好消息,我让这个可以与 Angular 7 一起使用! 🎉🎉🎉

要求:npm install --save-dev @angular-builders/custom-webpack html-webpack-plugin 如果您只想从下面复制/粘贴代码,请确保您的 env 文件中有 production:true

第 1 步:按以下方式编辑您的 angular.json 文件:

"architect": {
        "build": {
          "builder": "@angular-builders/custom-webpack:browser",
          "options": {
            "customWebpackConfig": {
                "path": "./webpack.client.config.js",
                "replaceDuplicatePlugins": true
             },
            ...
          }

您只是在编辑 build 部分,因为您实际上并不需要开发服务器中的整个 worker 部分。

第 2 步:在项目的根目录下创建 webpack.client.config.js 文件。 如果您不使用 SSR,您可以删除 exclude: ['./server.ts'],

const path = require('path');
const webpack = require('webpack');

const HtmlWebpackPlugin = require('html-webpack-plugin');
const { AngularCompilerPlugin } = require('@ngtools/webpack');

module.exports = {
  entry: {
    webworker: [
      "./src/workerLoader.ts"
    ],
    main: [
      "./src/main.ts"
    ],
    polyfills: [
      "./src/polyfills.ts"
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html',
      excludeChunks: [
        "webworker"
      ],
      chunksSortMode: "none"
    }),
    new AngularCompilerPlugin({
      mainPath: "./src/main.ts",
      entryModule: './src/app/app.module#AppModule',
      tsConfigPath: "src/tsconfig.app.json",
      exclude: ['./server.ts'],
      sourceMap: true,
      platform: 0
    }),
  ],
  optimization: {
    splitChunks: {
      name: "inline"
    }
  }
}

第 3 步:编辑您的 AppModule:

import { BrowserModule } from '@angular/platform-browser'
import { WorkerAppModule } from '@angular/platform-webworker'
const AppBootstrap =
            environment.production
            ? WorkerAppModule
            : BrowserModule.withServerTransition({ appId: 'myApp' })
    imports: [
        ...
        AppBootstrap,
        ...
    ]

第 4 步:编辑您的 main.ts 文件。

import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
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');
}

else {
  document.addEventListener('DOMContentLoaded', () => {
    platformBrowserDynamic().bootstrapModule(AppModule);
  });
}

第 5 步:它可以正常编译,但由于应用中的 DOM 操作,您可能会遇到运行时问题。此时,您只需要删除任何 DOM 操作并将其替换为其他内容即可。我仍在努力解决这部分问题,稍后会编辑我的答案以指导有关此问题的方向。

如果您不进行野蛮的 DOM 操作,那么您最好使用免费的主线程,并且使用 lighthouse 审核您的应用程序不应再显示 Minimize main-thread work,因为除了 UI 之外,您的大部分应用都在第二个线程中加载。

关于angular - Angular 7.0.1 中的网络 worker 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53100379/

相关文章:

angular - ngbModal 作为通用确认框

html - ionic 3 - 未定义运行时错误函数 - ReferenceError : function is not defined at HTMLButtonElement. onclick

node.js - 如何修复 Typescript 编译错误 ts2345 "Type ' 响应'丢失......来自类型 'Response' : redirected, 预告片,formData!”

javascript - 在带有 webpack 的 React-Router 中使用嵌套路由的问题

javascript - Node .js : webpack : Babel : Unknown substitution "BODY" given

javascript - 如何在 Angular 语法中应用多个 ngIf 条件?

javascript - 使用字符串数组作为路径动态访问嵌套对象

angular - Angular 2子路由会刷新父路由吗

typescript - Vue组件mocha单元测试时基类方法不存在

webpack - 将变量从 html-webpack-plugin 传递给 pug 模板