NPM هو مستودع فريد للحزم من عالم JavaScript. توجد هنا مكتبات JS التي يمكن استخدامها في الواجهة الأمامية / في المتصفح ، ولكن توجد أيضًا مكتبات من جانب الخادم للاستخدام في node.js وليس فقط. إذا كنت مبرمج Java وتحتاج إلى الاندماج مع مستودع NPM ، فعلى الأرجح لديك إحدى الحالتين التاليتين:
- أنت تكتب تطبيق ويب في أحد أطر عمل Java وهناك حاجة إلى حزم NPM معينة من جانب العميل
- لديك تطبيق Java (على سبيل المثال ، لنظام Android) ، والذي يجب أن يكون قادرًا على طلب التبعيات والموارد / الحزم نفسها من NPM
دعونا نرى كيف يمكن القيام بذلك في Java.
موارد NPM لتطبيق ويب
لديك خياران:
- قم بتعبئة موارد NPM الضرورية داخل WAR / JAR
- استخدم CDN لتحميل الموارد المطلوبة في وقت التشغيل
تعبئة موارد NPM في WAR / JAR
بادئ ذي بدء ، تحتاج إلى معرفة المزيد عن شيء مثل WebJars . يتيح لك "عكس" حزم NPM (وليس فقط) إلى مستودع Maven. بهذه الطريقة يمكنك العمل مع حزم NPM كما تفعل مع حزم Java العادية في Maven. على سبيل المثال ، لتضمين موارد من Boostrap المعروف في الحرب الخاصة بك ، يكفي إضافة التبعية التالية إلى pom.xml:
<dependency>
<groupId>org.webjars.npm</groupId>
<artifactId>bootstrap</artifactId>
<version>4.5.0</version>
</dependency>
يعكس WebJars الحزم من NPM إلى Maven جنبًا إلى جنب مع جميع التبعيات الضرورية ، بحيث يتم توصيل جميع الحزم الضرورية الأخرى عن طريق توصيل JAR واحد بالتبعيات.
يحتوي WebJars أيضًا على مجموعة كبيرة من المكتبات لأطر عمل Java مختلفة من أجل تسهيل العمل مع الموارد المعبأة والمتصلة. اقرأ المزيد في الوثائق .
WebJars هي أداة رائعة لأي مطور Java Backend. ولكن هناك أيضًا بدائل أخف: تعبئة الحزم المطلوبة من NPM باستخدام مكونات Maven الإضافية. إليك قائمة ربما ليست كاملة:
على سبيل المثال ، لتضمين حزمتي vue و vuex للإصدارات المطلوبة باستخدام jnpm-maven-plugin ، أضف الأسطر التالية إلى 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>
يمكنك استخدام تدوين NPM لتحديد نطاق الإصدارات المطلوبة:
- النجمة (* | X | x) - 1. * مكافئة لـ> = 1.0.0 & <2.0.0
- تيلدا (~) - ~ 1.5 تعادل> = 1.5.0 & <1.6.0
- الواصلة (-) - 1.0-2.0 تعادل> = 1.0.0 & <= 2.0.0
- علامة الإقحام (^) - ^ 0.2.3 يكافئ> = 0.2.3 & <0.3.0
- النطاق الجزئي - 1 يعادل 1.X أو> = 1.0.0 & <2.0.0
- النفي -! (1.x) يساوي <1.0.0 &> = 2.0.0
- صعب - ~ 1.3 | (1.4. * &! = 1.4.5) | ~ 2
أيضًا ، يمكنك تحديد الملفات المراد تضمينها من الحزم باستخدام التضمين والاستبعاد. على سبيل المثال ، عادةً ما تحتوي حزمة NPM على الملفات "المترجمة" في الدليل / dist. الملفات الأخرى هي ملفات مصدر ومن غير المحتمل أن تكون مطلوبة أو مفيدة داخل تطبيق Java Web. لتضمين محتويات مجلد dist / فقط ، ما عليك سوى إضافة ما يلي إلى القسم:
<includes>
<include>dist/*</include>
</includes>
بشكل افتراضي ، يحزم jnpm-maven-plugin الموارد في نفس المسارات تمامًا مثل WebJars. يتيح ذلك استخدام مكتبات WebJars المذكورة أعلاه لأطر عمل مختلفة للوصول إلى الموارد. إذا كنت بحاجة إلى أي تنسيق تغليف محدد آخر ، يرجى الرجوع إلى الوثائق .
باستخدام CDN
هناك العديد من شبكات CDN المتاحة للجمهور مع موارد NPM. أشهرها واستعمالها:
يمكنك أيضًا استخدام CDN الخاص بك (على سبيل المثال ، مرفوع من خلال عامل إرساء) أو حتى تضمين وظيفة CDN داخل تطبيق الويب الخاص بك. على سبيل المثال ، أضف servlet التالي إلى web.xml لتمكين JNPM CDN. تحرير حسب الحاجة:
<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>
بعد تنزيل NPM servlet ، ستتوفر الموارد من خلال تنسيق URL التالي: http (s): // <domain>: <port> / <path to web application> / cdn / <NPM package> / <path to file>.
على سبيل المثال:
المضيف المحلي: 8080/cdn/vue@2.6.11/dist/vue.js
العمل مع NPM REST API من Java
يمكنك بالطبع استخدام واجهة برمجة تطبيقات NPM Registry REST مباشرةً ، على سبيل المثال عبر التحديثية . سوف تساعدك الوثائق المقابلة في هذا . ولكن من الأنسب استخدام مكتبة JNPM ، التي توفر غلاف Java لواجهة برمجة تطبيقات REST وأكثر.
قم بتضمين جرة JNPM في ملف pom.xml:
<dependency>
<groupId>org.orienteer.jnpm</groupId>
<artifactId>jnpm</artifactId>
<version>1.0</version>
</dependency>
لنبدأ تهيئة JNPM API:
JNPMService.configure(JNPMSettings.builder()
.homeDirectory(Paths.get("/home/myuser/.jnpm")) //
.downloadDirectory(Paths.get("/tmp")) //
// - .
.build());
توفر JNPM API خيارين: واجهة برمجة تطبيقات متزامنة وواجهة برمجة تطبيقات غير متزامنة عبر RXJava. ما عليك استخدامه بالضبط يعود إليك:
JNPMService jnpmService = JNPMService.instance(); //Synchronous Java API
RxJNPMService rxJnpmService = JNPMService.instance().getRxService() //RXJava API
مثال على الاستخدام:
// 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);});
إذا كانت لديك حالة معينة لم يتم وصفها هنا - فيرجى إبلاغي بذلك!