Utilisation du registre NPM à partir de Java

image



NPM est un référentiel de packages unique du monde JavaScript. En gros, voici les bibliothèques JS qui peuvent être utilisées dans le frontend / dans le navigateur, mais il existe également des bibliothèques côté serveur à utiliser dans node.js et pas seulement. Si vous êtes un programmeur Java et que vous avez besoin d'intégrer le référentiel NPM, vous avez probablement l'un des deux cas suivants:



  • Vous écrivez une application Web dans l'un des frameworks Java et certains packages NPM sont requis côté client
  • Vous avez une application Java (par exemple, pour Android), qui doit être en mesure de demander des dépendances et des ressources / packages eux-mêmes à NPM


Voyons comment cela peut être fait en Java.



Ressources NPM pour une application Web



Vous avez 2 options:



  • Emballez les ressources NPM nécessaires dans votre WAR / JAR
  • Utilisez CDN pour charger les ressources requises au moment de l'exécution


Empaquetage des ressources NPM dans WAR / JAR



Tout d'abord, vous devez en savoir plus sur des WebJars . Il vous permet de «mettre en miroir» des packages NPM (et pas seulement) dans le référentiel Maven. De cette façon, vous pouvez travailler avec les packages NPM comme vous le feriez avec les packages Java standard dans Maven. Par exemple, pour inclure des ressources du célèbre Boostrap dans votre WAR, il suffit d'ajouter la dépendance suivante à pom.xml:



<dependency>
    <groupId>org.webjars.npm</groupId>
    <artifactId>bootstrap</artifactId>
    <version>4.5.0</version>
</dependency>


WebJars reflète les packages de NPM vers Maven avec toutes les dépendances nécessaires, donc en connectant un JAR par dépendances, tous les autres packages nécessaires seront connectés.

WebJars dispose également d'un grand ensemble de bibliothèques pour différents frameworks Java afin de faciliter le travail avec des ressources compactées et connectées. En savoir plus dans la documentation .



Les WebJars sont un excellent outil pour tout développeur Java Backend. Mais il existe également des alternatives plus légères: empaqueter les packages requis de NPM en utilisant les plugins Maven. Voici une liste peut-être incomplète:





Par exemple, pour inclure les packages vue et vuex des versions requises à l'aide de jnpm-maven-plugin, ajoutez les lignes suivantes au pom.xml:



<plugin>
    <groupId>org.orienteer.jnpm</groupId>
    <artifactId>jnpm-maven-plugin</artifactId>
    <version>1.0</version>
	<executions>
		<execution>
			<goals>
				<goal>install</goal>
			</goals>
			<configuration>
				<packages>
					<package>vue@2.6.11</package>
					<package>vuex@~3.4.0</package>
				</packages>
			</configuration>
		</execution>
	</executions>
</plugin>


Vous pouvez utiliser la notation NPM pour définir la plage des versions requises:



  • Astérisque (* | X | x) - 1. * équivalent à> = 1.0.0 & <2.0.0
  • Tilde (~) - ~ 1.5 équivaut à> = 1.5.0 & <1.6.0
  • Trait d'union (-) - 1.0-2.0 équivaut à> = 1.0.0 & <= 2.0.0
  • Caret (^) - ^ 0.2.3 équivaut à> = 0.2.3 & <0.3.0
  • Plage partielle - 1 équivaut à 1.X ou> = 1.0.0 & <2.0.0
  • Négation -! (1.x) équivaut à <1.0.0 &> = 2.0.0
  • Difficile - ~ 1,3 | (1.4. * &! = 1.4.5) | ~ 2


Vous pouvez également spécifier les fichiers à inclure à partir des packages à l'aide des inclusions et des exclusions. Par exemple, un package NPM contient généralement les fichiers "compilés" dans le répertoire / dist. Les autres fichiers sont des fichiers source et il est peu probable qu'ils soient nécessaires ou utiles dans une application Web Java. Pour inclure uniquement le contenu du répertoire dist /, ajoutez simplement ce qui suit à la section:



<includes>
  <include>dist/*</include>
</includes>


Par défaut, jnpm-maven-plugin emballe les ressources exactement dans les mêmes chemins que les WebJars. Cela permet aux bibliothèques WebJars mentionnées ci-dessus d'être utilisées dans différents frameworks pour accéder aux ressources. Si vous avez besoin d'un autre format d'emballage spécifique, veuillez vous référer à la documentation .



Utilisation de CDN



Il existe de nombreux CDN accessibles au public avec des ressources NPM. Le plus connu et utilisé:





Vous pouvez également utiliser votre propre CDN (par exemple, généré via le docker) ou même intégrer la fonctionnalité CDN dans votre Web-App. Par exemple, ajoutez le servlet suivant à web.xml pour activer JNPM CDN. Modifiez au besoin:



<servlet>
  <servlet-name>CDNServlet</servlet-name>
  <servlet-class>org.orienteer.jnpm.cdn.CDNServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>CDNServlet</servlet-name>
  <url-pattern>/cdn/*</url-pattern>
</servlet-mapping>


Après avoir téléchargé le servlet NPM, les ressources seront disponibles via une URL au format suivant: http (s): // <domaine>: <port> / <chemin vers l'application Web> / cdn / <package NPM> / <chemin vers le fichier>.

Par exemple:
localhost : 8080/cdn/vue@2.6.11/dist/vue.js




Utilisation de l'API REST NPM de Java



Vous pouvez bien sûr utiliser l'API REST du registre NPM directement, par exemple via Retrofit . La documentation correspondante vous y aidera . Mais il est plus pratique d'utiliser la bibliothèque JNPM , qui fournit un wrapper Java pour cette API REST et plus encore.



Incluez le JNPM Jar dans le pom.xml:



<dependency>
    <groupId>org.orienteer.jnpm</groupId>
    <artifactId>jnpm</artifactId>
    <version>1.0</version>
</dependency>


Initialisons l'API JNPM:



JNPMService.configure(JNPMSettings.builder()
  .homeDirectory(Paths.get("/home/myuser/.jnpm")) //
  .downloadDirectory(Paths.get("/tmp")) //
  //   - . 
 	.build());


L'API JNPM fournit 2 options: API synchrone et API asynchrone via RXJava. Ce qu'il faut utiliser exactement dépend de vous:



JNPMService jnpmService = JNPMService.instance(); //Synchronous Java API
RxJNPMService rxJnpmService = JNPMService.instance().getRxService() //RXJava API


Exemple d'utilisation:



//   NPM 
System.out.println(JNPMService.instance().getRegistryInfo());
//       VUE
System.out.println(JNPMService.instance().getPackageInfo("vue").getLatest());
//   vue@2.6.11
System.out.println(JNPMService.instance().getVersionInfo("vue", "2.6.11").getDescription());
//      
System.out.println(JNPMService.instance().bestMatch("vue@<2").getVersionAsString());
//   vue@2.6.11    
VersionInfo vueVersion = JNPMService.instance().getVersionInfo("vue", "2.6.11");
vueVersion.downloadTarball().blockingAwait();
System.out.println(vueVersion.getLocalTarball().getAbsolutePath());
// "vue"     
System.out.println(JNPMService.instance().search("vue").getObjects().get(0).getSearchPackage().getDescription());
//       dev    vue 
//            NPM (node_modules/vue  ..)
JNPMService.instance().getRxService()
   .traverse(TraverseDirection.WIDER, TraversalRule.DEV_DEPENDENCIES, "vue")
   .subscribe(t -> {System.out.println(t); t.install(Paths.get("target", "readme"), InstallationStrategy.NPM);});


Si vous avez un cas spécifique qui n'a pas été décrit ici, faites-le moi savoir!



All Articles