Bekerja dengan NPM Registry dari Java

gambar



NPM adalah repositori paket unik dari dunia JavaScript. Pada dasarnya di sini adalah pustaka JS yang dapat digunakan di frontend / di browser, tetapi ada juga pustaka sisi server untuk digunakan di node.js dan tidak hanya. Jika Anda seorang programmer Java dan Anda perlu berintegrasi dengan repositori NPM, kemungkinan besar Anda memiliki salah satu dari dua kasus berikut:



  • Anda sedang menulis aplikasi Web di salah satu framework Java dan paket NPM tertentu diperlukan untuk sisi klien
  • Anda memiliki aplikasi Java (misalnya, untuk Android), yang harus dapat meminta dependensi dan resource / paket sendiri dari NPM


Mari kita lihat bagaimana ini bisa dilakukan di Java.



Sumber daya NPM untuk aplikasi web



Anda memiliki 2 pilihan:



  • Kemas sumber daya NPM yang diperlukan di dalam WAR / JAR Anda
  • Gunakan CDN untuk memuat sumber daya yang diperlukan pada waktu proses


Mengemas Sumber Daya NPM dalam WAR / JAR



Pertama-tama, Anda perlu mempelajari lebih lanjut tentang hal-hal seperti WebJars . Ia memungkinkan paket NPM (dan tidak hanya) untuk "direfleksikan" ke dalam repositori Maven. Dengan cara ini Anda dapat bekerja dengan paket NPM seperti yang Anda lakukan dengan paket Java reguler di Maven. Misalnya, untuk menyertakan sumber daya dari Boostrap terkenal ke dalam WAR Anda, cukup menambahkan ketergantungan berikut ke pom.xml:



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


WebJars merefleksikan paket dari NPM ke Maven beserta semua dependensi yang diperlukan, sehingga dengan menghubungkan satu JAR dengan dependensi, semua paket lain yang diperlukan akan terhubung.

WebJars juga memiliki sekumpulan besar pustaka untuk berbagai kerangka kerja Java agar lebih mudah bekerja dengan sumber daya yang dikemas dan terhubung. Baca lebih lanjut di dokumentasi .



WebJars adalah alat yang hebat untuk semua pengembang Java Backend. Tetapi ada juga alternatif yang lebih ringan: mengemas paket yang Anda inginkan dari NPM menggunakan plugin Maven. Berikut daftar yang mungkin tidak lengkap:





Misalnya, untuk menyertakan paket vue dan vuex dari versi yang diperlukan menggunakan plugin jnpm-maven, tambahkan baris berikut ke 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>


Anda dapat menggunakan notasi NPM untuk menentukan kisaran versi yang diperlukan:



  • Asterisk (* | X | x) - 1. * setara dengan> = 1.0.0 & <2.0.0
  • Tilde (~) - ~ 1.5 setara dengan> = 1.5.0 & <1.6.0
  • Tanda hubung (-) - 1.0-2.0 sama dengan> = 1.0.0 & <= 2.0.0
  • Caret (^) - ^ 0.2.3 setara dengan> = 0.2.3 & <0.3.0
  • Rentang parsial - 1 setara dengan 1.X atau> = 1.0.0 & <2.0.0
  • Negasi -! (1.x) setara dengan <1.0.0 &> = 2.0.0
  • Sulit - ~ 1.3 | (1.4. * &! = 1.4.5) | ~ 2


Selain itu, Anda dapat menentukan file mana yang akan disertakan dari paket menggunakan include dan excludes. Sebagai contoh, biasanya sebuah paket NPM berisi file "terkompilasi" di direktori / dist. File lain adalah file sumber dan sepertinya tidak diperlukan atau berguna di dalam aplikasi Web Java. Untuk memasukkan konten direktori dist / saja, tambahkan yang berikut ini ke bagian:



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


Secara default, jnpm-maven-plugin mengemas sumber daya di jalur yang sama persis dengan WebJars. Ini memungkinkan pustaka WebJars yang disebutkan di atas digunakan untuk kerangka kerja yang berbeda untuk mengakses sumber daya. Jika Anda membutuhkan format kemasan khusus lainnya, silakan merujuk ke dokumentasi .



Menggunakan CDN



Ada banyak CDN yang tersedia untuk umum dengan sumber daya NPM. Yang paling terkenal dan digunakan:





Anda juga dapat menggunakan CDN Anda sendiri (misalnya, diangkat melalui pekerja galangan) atau bahkan menyematkan fungsionalitas CDN di dalam Aplikasi Web Anda. Misalnya, tambahkan servlet berikut ke web.xml untuk mengaktifkan JNPM CDN. Edit seperlunya:



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


Setelah mengunduh servlet NPM, sumber daya akan tersedia melalui format URL berikut: http (s): // <domain>: <port> / <path to web application> / cdn / <NPM package> / <path to file>.

Misalnya:
localhost : 8080/cdn/vue@2.6.11/dist/vue.js




Bekerja dengan NPM REST API dari Java



Anda tentu saja dapat menggunakan REST API NPM Registry secara langsung, katakanlah melalui Retrofit . Dokumentasi terkait akan membantu Anda dalam hal ini . Tetapi akan lebih mudah menggunakan pustaka JNPM , yang menyediakan pembungkus Java untuk REST API ini dan banyak lagi.



Sertakan JNPM Jar di pom.xml:



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


Mari kita inisialisasi JNPM API:



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


JNPM API menyediakan 2 opsi: API Sinkron dan API Asinkron melalui RXJava. Apa tepatnya yang akan digunakan terserah Anda:



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


Contoh penggunaan:



//   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);});


Jika Anda memiliki kasus khusus yang tidak dijelaskan di sini - beri tahu saya!



All Articles