Вот копия моего ответа здесь
Хорошие новости, ребята, я получил это для работы с 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
, потому что вам действительно не нужна вся рабочая вещь на сервере разработки.
Шаг 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
, так как большая часть вашего приложения, за исключением пользовательского интерфейса, загружается в вторая тема.