Blog

Beschleunigung der Require.js-Optimierung in Maven

Sannie Kwakman

Sannie Kwakman

Aktualisiert Oktober 22, 2025
3 Minuten

Bei den letzten Webanwendungen, an denen wir gearbeitet haben, haben wir die Require.js-Bibliothek verwendet, um unseren Javascript-Code zu modularisieren. Dies ermöglicht es Entwicklern, große Mengen an Javascript-Code in kleinere Module aufzuteilen, wodurch der Code viel einfacher zu lesen und zu pflegen ist. Require.js bietet auch ein Optimierungsskript, das diese Module in eine (oder einige wenige) Dateien kompiliert und komprimiert, um sie effizient an den Endbenutzer zu liefern. Wenn Sie den Optimierer als Teil eines Maven-Builds ausführen, kann dieser Prozess leider mehrere Minuten dauern. In diesem Artikel erkläre ich Ihnen, wie Sie die Dinge etwas beschleunigen können.

Das Nashorn im Zimmer

Wir verwenden den Optimierer von Require.js als Teil unseres Paket- und Release-Zyklus für Anwendungen, der derzeit von Maven unterstützt wird. Um den Optimierer mit Maven auszuführen, verwenden wir das requirejs-maven-plugin. Da der Optimierer in Javascript geschrieben ist und Maven Java ausführt, führt dieses Plugin das Optimierer-Skript unter Verwendung der in JRE integrierten Javascript-Engine Rhino aus. So können wir sowohl server- als auch clientseitige Pakete in einem Rutsch erstellen. Es gibt nur ein Problem: Die Rhino Javascript-Engine ist furchtbar langsam. Ich kann der Engine selbst nicht wirklich die Schuld geben, da sie sehr alt ist. Sie stammt aus der Zeit vor dem so genannten 'Engine Race', bei dem Javascript-Engines aggressiv optimiert werden, um Geschwindigkeiten zu erreichen, an die wir in modernen Browsern gewöhnt sind. Aber es macht trotzdem keinen Spaß, mehrere Minuten auf einen Optimierer zu warten, der auf einer uralten Technologie läuft, während Sie wissen, dass es da draußen etwas viel Schnelleres gibt. Wie in der Require.js-Dokumentation bereits erwähnt, ist die bevorzugte Methode zur Ausführung des Optimierers die Verwendung von node.js, das von der viel schnelleren V8-Javascript-Engine von Google angetrieben wird. Bis vor kurzem gab es jedoch keine einfache Möglichkeit, node.js in ein Maven-Build einzubinden. Es ist zwar möglich, davon auszugehen, dass node.js in der Build-Umgebung installiert ist und einige Befehle mit dem maven-ant-plugin auszuführen, aber dadurch wird Ihr Build wesentlich weniger portabel.

Verwendung von node.js in Maven

Nachdem ich mich also lange genug über dieses Problem geärgert hatte, so dass es zu einem Lieblingsärgernis wurde, habe ich beschlossen, es endlich zu lösen. Für mich besteht die ultimative Lösung aus zwei Schritten:

  • requirejs-maven-plugin sollte die Ausführung des Optimierers mit node.js unterstützen
  • Die node.js-Binärdatei sollte der Build-Umgebung ohne einen externen Installationsprozess zugeführt werden.

Um Schritt 1 zu implementieren, habe ich zusammen mit dem Ersteller des requirejs-maven-plugin, Matthew Cheely, die Unterstützung von node.js hinzugefügt. In der neuesten Version ist es möglich, einen Pfad zu einer node.js-Binärdatei anzugeben, woraufhin das Plugin den Optimierer mit node.js ausführt. Um die node.js-Binärdatei an die Build-Umgebung zu übergeben, habe ich ein neues Plugin namens nodejs-maven-plugin erstellt. Dieses Plugin extrahiert eine plattformspezifische nodejs-Binärdatei in ein Verzeichnis Ihrer Wahl. Derzeit werden die Plattformen Windows, Mac und Linux in allen 32- und 64-Bit-Versionen unterstützt. Die Konfiguration dieser beiden Plugins sollte in etwa so aussehen: <plugin> <groupId>com.github.skwakman.nodejs-maven-plugin</groupId> <artifactId>nodejs-maven-plugin</artifactId> <version>1.0.2</version> <executions> <execution> <goals> <goal>extract</goal> </goals> </execution> </executions> <configuration> <targetDirectory> ${project.build.directory}/nodejs/ </targetDirectory> </configuration> </plugin> <plugin> <groupId>com.github.mcheely</groupId> <artifactId>requirejs-maven-plugin</artifactId> <version>2.0.0</version> <executions> <execution> <goals> <goal>optimize</goal> </goals> <phase>prepare-package</phase> <configuration> <filterConfig>true</filterConfig> <nodeExecutable>${project.build.directory}/nodejs/node</nodeExecutable> </configuration> </execution> </executions> </plugin> Diese Konfiguration weist nodejs-maven-plugin an, eine node.js-Binärdatei in das Verzeichnis target/nodejs des Maven-Projekts zu extrahieren. Requirejs-maven-plugin führt dann das Optimierungsskript von Require.js unter Verwendung der neu extrahierten node.js-Binärdatei aus. Mit dieser Konfiguration können Sie node.js auf all Ihren Build-Umgebungen verwenden, ohne es manuell installieren zu müssen.Mit dieser neuen Konfiguration konnte unser Javascript-Optimierungsschritt von 1,5 Minuten auf nur 12 Sekunden reduziert werden. Nicht schlecht für einen Sprung von etwa 10 Jahren in die Zukunft.

Verfasst von

Sannie Kwakman

Contact

Let’s discuss how we can support your journey.