# هل يجب تحميل مكتبات الطرف الثالث من البائع أو CDN؟

**URL:** https://meta.discourse.org/t/should-i-load-third-party-libraries-from-vendor-or-cdn/205357
**Category:** Development
**Created:** [6 أكتوبر 2021، 2:16م UTC](https://meta.discourse.org/t/should-i-load-third-party-libraries-from-vendor-or-cdn/205357 "2021-10-06T14:16:40Z")
**Posts on this page:** 5
**Page:** 1

<div class="post-metadata">

### Author: ![Nacho\_Caballero](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nacho_caballero/32/130189_2.png) [@Nacho\_Caballero](https://meta.discourse.org/u/Nacho_Caballero)
#### Post date: [6 أكتوبر 2021، 2:16م UTC](https://meta.discourse.org/t/should-i-load-third-party-libraries-from-vendor-or-cdn/205357/1 "2021-10-06T14:16:40Z")

</div>

لقد رأيت إضافات تقوم بتنزيل مكتبات تابعة لجهات خارجية وتحميلها كملفات محلية من `/vendor`، وأخرى تتطلب المكتبة عبر CDN.

هل هناك نهج أفضل من الآخر من حيث النطاق الترددي/السرعة؟

---

<div class="post-metadata">

### Author: ![Johani](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/johani/32/176920_2.png) [@Johani](https://meta.discourse.org/u/Johani)
#### Post date: [6 أكتوبر 2021، 4:51م UTC](https://meta.discourse.org/t/should-i-load-third-party-libraries-from-vendor-or-cdn/205357/2 "2021-10-06T16:51:46Z")

</div>

هناك منطقة رمادية صغيرة بينهما. يمكنك إعداد Discourse لخدمة الأصول، بما في ذلك ملفات JS الخاصة بالمواضيع/الإضافات، عبر [شبكة توصيل محتوى (CDN)](https://meta.discourse.org/t/enable-a-cdn-for-your-discourse/14857). لذا، حتى لو قام الإضافة بتحميل المكتبة الخارجية في `/vendor`، فسيتم تحميلها من شبكة CDN التي قمت بإعداد Discourse لاستخدامها. ومع ذلك، فإن هذه شبكة CDN خاصة.

ومع ذلك، لا أعتقد أن هذا هو ما تقصده. أنت تقصد خدمات مثل [https://cdnjs.com](https://cdnjs.com) و [https://www.jsdelivr.com](https://www.jsdelivr.com)، وهذا موضوع مختلف قليلاً - شبكة CDN عامة.

تتمتع خدمات مثل cdnjs بشبكة واسعة من الخوادم المخصصة لهذا النوع من الأمور.

 ![خوادم cdnjs](https://global.discourse-cdn.com/meta/original/3X/5/f/5f94d1d8913466bf6ab9cbb4e8b53e3358a20a27.png)

لذا،

> [@Nacho\_Caballero](#):
>
> هل إحدى الطريقتين أفضل من الأخرى من حيث النطاق الترددي/السرعة؟

يمكن أن تكون أسرع، وتساعد بالفعل في تقليل الحمل على خادمك.

لكن… هذه الفائدة في السرعة متاحة أيضًا إذا استخدمت `/vendor` في موقع قام بإعداد Discourse لاستخدام شبكة CDN خاصة.

أيضًا، فيما يتعلق بالنطاق الترددي، فإن معظم مكتبات JS الخارجية أصغر من 20 كيلوبايت. لذا، بينما تحصل على بعض التوفير… فهذا ليس نقطة رئيسية حقًا ما لم يحصل موقعك على مئات الآلاف من المشاهدات يوميًا.

إحدى فوائد استخدام شيء مثل cdnjs هي أنهم يخدمون نفس الملف ويحتويون على رؤوس تخزين مؤقت.

ماذا يعني ذلك؟ حسنًا، لنستخدم jQuery كمثال.

تستخدم العديد من المواقع jQuery، وكثير منها يستخدم cdnjs لتقديم jQuery. عندما يقدم cdnjs ملف jQuery للمستخدم، فإنه يتضمن رؤوس تخزين مؤقت - الافتراضي هو سنة واحدة.

هذا يعني أنه إذا زار المستخدم الموقع أ - الذي يستخدم cdnjs لـ jQuery - ثم زار الموقع ب، والذي يستخدم أيضًا نفس الملف بنفس الإصدار، فلن يحتاج متصفحه إلى تنزيل jQuery مرة أخرى، لأنه مخزن مؤقتًا - مما يؤدي إلى تحميل أسرع للصفحة.

النقطة المذكورة أعلاه هي أكبر ميزة لاستخدام شيء مثل cdnjs لمكتباتك الخارجية.  
ومع ذلك، فإن عددًا قليلًا جدًا من المكتبات شائع مثل jQuery، لذا يعتمد الأمر حقًا على مدى شيوع المكتبة.

عند تحميل الملفات من cdnjs، ستحتاج أيضًا إلى التأكد من إضافتها إلى [إعدادات سياسة أمان المحتوى (CSP)](https://meta.discourse.org/t/mitigate-xss-attacks-with-content-security-policy/104243).

لذا، أعتقد أن الإجابة هنا هي… الأمر يعتمد.

هل تقوم بتحميل المكتبة كما هي؟  
هل هي شائعة؟  
هل هي كبيرة الحجم؟

إذا كان الأمر كذلك، _ربما_ استخدم شبكة CDN. وإذا لم يكن كذلك، فاحتفظ بالأمر بسيطًا وأضفها ببساطة في `/vendor`

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [6 أكتوبر 2021، 5:27م UTC](https://meta.discourse.org/t/should-i-load-third-party-libraries-from-vendor-or-cdn/205357/3 "2021-10-06T17:27:46Z")

</div>

> [@Johani](#):
>
> هذا يعني أنه إذا زار مستخدم الموقع أ — الذي يستخدم cdnjs لمكتبة jQuery — ثم زار الموقع ب، والذي يستخدم نفس الملف بنفس الإصدار، فلن يحتاج متصفحه إلى تحميل jQuery مرة أخرى، لأنه مخزن في الذاكرة المؤقتة (cache)، مما يؤدي إلى تحميل أسرع للصفحات.

تحديث صغير هنا: لم يعد Chrome وSafari وFirefox يعملان بهذه الطريقة بعد الآن. لم يعد هناك ذاكرة تخزين مؤقت مشتركة بين المواقع:

> **[Shared Cache is Going Away](https://www.jefftk.com/p/shared-cache-is-going-away)**
>
> Browsers historically have had a single HTTP Cache. This meant that if www.a.example and www.b.example both used cdn.example/jquery-1.2.1.js then JQuery would only be downloaded once. Since it's the same resource regardless of which site initiates...

---

<div class="post-metadata">

### Author: ![peter.be](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/peter.be/32/314243_2.png) [@peter.be](https://meta.discourse.org/u/peter.be)
#### Post date: [12 يوليو 2023، 9:58م UTC](https://meta.discourse.org/t/should-i-load-third-party-libraries-from-vendor-or-cdn/205357/4 "2023-07-12T21:58:30Z")

</div>

هل يمكن لأحد مشاركة رابط لمكون إضافي يستخدم طريقة إضافة مكتبات الطرف الثالث إما عبر مجلد `/vendor` أو شبكة توصيل المحتوى (CDN)؟

لم أتمكن من العثور على أي وثائق حول هذا الموضوع، وأواجه صعوبة في تضمين مكتبة طرف ثالث في المكون الإضافي الخاص بي، وتسجيلها بشكل صحيح، والامتثال لهيكل المجلد المحدد، وكتابة عبارة الاستيراد بشكل صحيح في ملفات وحدة التحكم.

شكراً جزيلاً للمساعدة مقدماً!

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [12 يوليو 2023، 11:00م UTC](https://meta.discourse.org/t/should-i-load-third-party-libraries-from-vendor-or-cdn/205357/5 "2023-07-12T23:00:25Z")

</div>

قد يكون [discourse-math](https://github.com/discourse/discourse-math) مرجعًا جيدًا - فهو يحتوي على عدد من البرامج النصية “المُباعة” ضمن الدليل `/public`. أو يمكن أن يكون مثال أبسط هو [discourse-client-performance](https://github.com/discourse/discourse-client-performance).
