From 00b55696bd824916981d8b17f0555bc06226d515 Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Thu, 26 Sep 2019 20:27:42 -0400
Subject: [PATCH 1/2] refactor(@angular-devkit/build-angular): improve
performance of parallel bundle processing
---
.../angular_devkit/build_angular/package.json | 2 +-
.../src/browser/action-executor.ts | 53 +++++++++++++++++++
.../build_angular/src/browser/index.ts | 52 ++++++++----------
.../build_angular/src/utils/process-bundle.ts | 9 +---
yarn.lock | 5 +-
5 files changed, 78 insertions(+), 43 deletions(-)
create mode 100644 packages/angular_devkit/build_angular/src/browser/action-executor.ts
diff --git a/packages/angular_devkit/build_angular/package.json b/packages/angular_devkit/build_angular/package.json
index 8475fc0d3f1a..a4ea8568a8bc 100644
--- a/packages/angular_devkit/build_angular/package.json
+++ b/packages/angular_devkit/build_angular/package.json
@@ -27,6 +27,7 @@
"find-cache-dir": "3.0.0",
"glob": "7.1.4",
"istanbul-instrumenter-loader": "3.0.1",
+ "jest-worker": "24.9.0",
"karma-source-map-support": "1.4.0",
"less": "3.10.3",
"less-loader": "5.0.0",
@@ -61,7 +62,6 @@
"webpack-merge": "4.2.2",
"webpack-sources": "1.4.3",
"webpack-subresource-integrity": "1.3.3",
- "worker-farm": "1.7.0",
"worker-plugin": "3.2.0"
},
"devDependencies": {
diff --git a/packages/angular_devkit/build_angular/src/browser/action-executor.ts b/packages/angular_devkit/build_angular/src/browser/action-executor.ts
new file mode 100644
index 000000000000..29f9d7a39b89
--- /dev/null
+++ b/packages/angular_devkit/build_angular/src/browser/action-executor.ts
@@ -0,0 +1,53 @@
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+import JestWorker from 'jest-worker';
+import * as os from 'os';
+
+export class ActionExecutor {
+ private largeWorker: JestWorker;
+ private smallWorker: JestWorker;
+
+ private smallThreshold = 32 * 1024;
+
+ constructor(actionFile: string, private readonly actionName: string) {
+ // larger files are processed in a separate process to limit memory usage in the main process
+ this.largeWorker = new JestWorker(actionFile, {
+ exposedMethods: [actionName],
+ });
+
+ // small files are processed in a limited number of threads to improve speed
+ // The limited number also prevents a large increase in memory usage for an otherwise short operation
+ this.smallWorker = new JestWorker(actionFile, {
+ exposedMethods: [actionName],
+ numWorkers: os.cpus().length < 2 ? 1 : 2,
+ // Will automatically fallback to processes if not supported
+ enableWorkerThreads: true,
+ });
+ }
+
+ execute(options: Input): Promise