Trabajar con NPM Registry desde Java

imagen



NPM es un repositorio de paquetes único del mundo de JavaScript. Básicamente, aquí están las bibliotecas JS que se pueden usar en la interfaz / en el navegador, pero también hay bibliotecas del lado del servidor para usar en node.js y no solo. Si es un programador de Java y necesita integrarse con el repositorio de NPM, lo más probable es que tenga uno de los siguientes dos casos:



  • Está escribiendo una aplicación web en uno de los marcos de Java y se requieren ciertos paquetes de NPM para el lado del cliente
  • Tiene una aplicación Java (por ejemplo, para Android), que necesita poder solicitar dependencias y recursos / paquetes ellos mismos de NPM


Veamos cómo se puede hacer esto en Java.



Recursos de NPM para una aplicación web



Tienes 2 opciones:



  • Empaque los recursos de NPM necesarios dentro de su WAR / JAR
  • Utilice CDN para cargar los recursos necesarios en tiempo de ejecución


Empaquetado de recursos de NPM en WAR / JAR



En primer lugar, necesita aprender más sobre WebJars . Permite que los paquetes de NPM (y no solo) se "reflejen" en el repositorio de Maven. De esta manera, puede trabajar con paquetes de NPM como lo haría con los paquetes regulares de Java en Maven. Por ejemplo, para incluir recursos del conocido Boostrap en su WAR, es suficiente agregar la siguiente dependencia a pom.xml:



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


WebJars refleja paquetes de NPM a Maven junto con todas las dependencias necesarias, de modo que al conectar un JAR por dependencias, se conectarán todos los demás paquetes necesarios.

WebJars también tiene un gran conjunto de bibliotecas para diferentes marcos de Java para facilitar el trabajo con recursos empaquetados y conectados. Leer más en la documentación .



WebJars es una gran herramienta para cualquier desarrollador de backend de Java. Pero también hay alternativas más ligeras: empaquetar los paquetes requeridos de NPM usando complementos de Maven. Aquí hay una lista tal vez no completa:





Por ejemplo, para incluir los paquetes vue y vuex de las versiones requeridas usando jnpm-maven-plugin, agregue las siguientes líneas al 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>


Puede usar la notación NPM para definir el rango de versiones requeridas:



  • Asterisco (* | X | x) - 1. * equivalente a> = 1.0.0 & <2.0.0
  • Tilde (~) - ~ 1.5 es equivalente a> = 1.5.0 & <1.6.0
  • Guión (-) - 1.0-2.0 es equivalente a> = 1.0.0 & <= 2.0.0
  • Caret (^) - ^ 0.2.3 es equivalente a> = 0.2.3 & <0.3.0
  • Rango parcial - 1 es equivalente a 1.X o> = 1.0.0 & <2.0.0
  • Negación -! (1.x) es equivalente a <1.0.0 &> = 2.0.0
  • Difícil - ~ 1.3 | (1.4. * &! = 1.4.5) | ~ 2


Además, puede especificar qué archivos incluir de los paquetes utilizando incluye y excluye. Por ejemplo, normalmente un paquete NPM contiene los archivos "compilados" en el directorio / dist. Otros archivos son archivos de origen y es poco probable que sean necesarios o útiles dentro de una aplicación web Java. Para incluir solo el contenido del directorio dist /, simplemente agregue lo siguiente a la sección:



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


Por defecto, jnpm-maven-plugin empaqueta recursos exactamente en las mismas rutas que WebJars. Esto permite que las bibliotecas WebJars mencionadas anteriormente se utilicen en diferentes marcos para acceder a los recursos. Si necesita cualquier otro formato de embalaje específico, consulte la documentación .



Usando CDN



Hay muchas CDN disponibles públicamente con recursos de NPM. Los más famosos y usados:





También puede usar su propio CDN (por ejemplo, elevado a través de la ventana acoplable) o incluso incrustar la funcionalidad CDN dentro de su aplicación web. Por ejemplo, agregue el siguiente servlet a web.xml para habilitar JNPM CDN. Edite según sea necesario:



<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>


Después de descargar el servlet NPM, los recursos estarán disponibles a través del siguiente formato de URL: http (s): // <dominio>: <puerto> / <ruta a la aplicación web> / cdn / <paquete NPM> / <ruta al archivo>.

Por ejemplo:
localhost : 8080/cdn/vue@2.6.11/dist/vue.js




Trabajar con la API REST de NPM desde Java



Por supuesto, puede usar la API REST de NPM Registry directamente, por ejemplo, a través de Retrofit . La documentación correspondiente te ayudará con esto . Pero es más conveniente utilizar la biblioteca JNPM , que proporciona un contenedor de Java para esta API REST y más.



Incluya el JNPM Jar en pom.xml:



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


Inicialicemos la API JNPM:



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


La API JNPM proporciona 2 opciones: API síncrona y API asíncrona a través de RXJava. Qué usar exactamente depende de usted:



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


Ejemplo de uso:



//   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 tiene un caso específico que no se describió aquí, ¡hágamelo saber!



All Articles