استفادت Node.js من ميزاتها التي تعتمد على الحدث وغير المتزامن ، وقد كانت قريبًا جدًا. ومع ذلك ، لا يمكن أن تكون سريعًا في الشبكات الحديثة. إذا كنت تخطط لاستخدام Node.js لتطوير تطبيق الويب التالي ، فيجب عليك فعل كل شيء لجعل تطبيقك أسرع وسريعًا بشكل استثنائي. ستقدم هذه المقالة 10 عناصر ، وبعد الاختبار ، يمكنها تحسين مهارات تطبيق العقدة بشكل كبير. بدون مزيد من اللغط ، دعونا نلقي نظرة واحدة تلو الأخرى.
1. موازي
عند إنشاء تطبيق ويب ، قد تضطر إلى استدعاء واجهة برمجة التطبيقات الداخلية عدة مرات للحصول على بيانات مختلفة. على سبيل المثال ، افترض على صفحة لوحة القيادة ، عليك تنفيذ المكالمات التالية:
معلومات المستخدم - getUserProfile ().
النشاط الحالي - getRecentActivity ().
اشترك في المحتوى - getSubscriptions ().
محتوى الإخطار - getNotifications ().
للحصول على هذه المعلومات ، يجب عليك إنشاء برامج وسيطة منفصلة لكل طريقة ثم ربطها بطريق لوحة القيادة. لكن المشكلة هي أن تنفيذ هذه الأساليب خطي ، ولن يبدأ الأمر التالي حتى يتم الانتهاء من المباراة السابقة. الحل الممكن هو استدعاءهم بالتوازي.
كما تعلمون ، Node.js جيدة جدًا في استدعاء طرق متعددة بالتوازي بسبب عدم التزامن. لا يمكننا أن نضيع الموارد الطبيعية. الأساليب التي ذكرتها أعلاه ليس لها أي تبعيات ، حتى نتمكن من تنفيذها بالتوازي. وبهذه الطريقة ، يمكننا تقليل عدد البرامج الوسيطة وزيادة السرعة بشكل كبير.
يمكننا استخدام ASYNC.JS للتعامل مع التوازي ، وهي وحدة عقدة تستخدم خصيصًا لتدريب JavaScript بشكل غير متزامن. يوضح الرمز التالي كيفية استخدام ASYNC.JS لاستدعاء طرق متعددة بالتوازي:
نسخة الكود كما يلي:
وظيفة RunInParallel () {
Async.paralled ([[
getUserProfile ،
GetRecentActivity ،
الوصفات ،
getNotifications
] ، وظيفة (خطأ ، النتائج) {
// يعمل رد الاتصال هذا عند اكتمال جميع الوظائف
}) ؛
}
إذا كنت ترغب في إلقاء نظرة أكثر تعمقًا على Async.js ، فيرجى تحريك صفحة GitHub.
2. غير متزامن
حسب التصميم Node.js هو واحد مترابط. بناءً على ذلك ، سوف يحظر الرمز المتزامن التطبيق بأكمله. على سبيل المثال ، تحتوي معظم واجهات برمجة تطبيقات نظام الملفات على إصداراتها المتزامنة. يوضح الرمز التالي عمليتين: قراءة الملف المتزامن وغير المتزامن:
نسخة الكود كما يلي:
// غير متزامن
fs.readfile ('file.txt' ، function (err ، buffer) {
var content = buffer.toString () ؛
}) ؛
// متزامن
var content = fs.readfilesync ('file.txt'). toString () ؛
ومع ذلك ، إذا قمت بإجراء عمليات حظر طويلة الأجل ، فسيتم حظر الخيط الرئيسي حتى يتم الانتهاء من هذه العمليات. هذا يقلل إلى حد كبير من أداء التطبيق الخاص بك. لذلك ، من الأفضل التأكد من أن الكود الخاص بك يستخدم الإصدار غير المتزامن من واجهة برمجة التطبيقات ، على الأقل يجب أن تكون غير متزامن في عقدة الأداء. علاوة على ذلك ، يجب أن تكون حذراً للغاية عند اختيار وحدات الطرف الثالث. لأنه عندما تحاول إزالة عمليات التزامن من الكود الخاص بك ، فإن مكالمة متزامنة من مكتبة خارجية ستضيع جميع جهودك وتقليل أداء التطبيق الخاص بك.
3. ذاكرة التخزين المؤقت
إذا كنت تستخدم بعض البيانات التي لا تتغير بشكل متكرر ، فيجب عليك ذاكرة التخزين المؤقت لتحسين الأداء. على سبيل المثال ، الرمز التالي هو مثال على الحصول على أحدث مشاركة وعرضه:
نسخة الكود كما يلي:
var Router = Express.Router () ؛
Router.Route ('/أحدث posts'). get (function (req ، res) {
post.getLatest (وظيفة (err ، المنشورات) {
إذا (خطأ) {
رمي الخطأ
}
res.Render ('posts' ، {posts: posts}) ؛
}) ؛
}) ؛
إذا لم تنشر بشكل متكرر ، فيمكنك تخزين قائمة النشر وتنظيفها بعد فترة من الوقت. على سبيل المثال ، يمكننا استخدام وحدة Redis لتحقيق هذا الهدف. بالطبع ، يجب عليك تثبيت redis على الخادم الخاص بك. ثم يمكنك حفظ أزواج المفتاح/القيمة مع عميل يسمى Node_redis. يوضح المثال التالي كيف ننشر ذاكرة التخزين المؤقت:
نسخة الكود كما يلي:
var redis = require ('redis') ،
client = redis.createClient (null ، null ، {detect_buffers: true}) ،
جهاز التوجيه = express.Router () ؛
Router.Route ('/أحدث posts'). get (function (req ، res) {
client.get ('المنشورات' ، الدالة (err ، المنشورات) {
إذا (المشاركات) {
return res.Render ('posts' ، {posts: json.parse (posts)}) ؛
}
post.getLatest (وظيفة (err ، المنشورات) {
إذا (خطأ) {
رمي الخطأ
}
client.set ('posts' ، json.stringify (posts)) ؛
res.Render ('posts' ، {posts: posts}) ؛
}) ؛
}) ؛
}) ؛
انظر ، دعنا نتحقق من ذاكرة التخزين المؤقت Redis أولاً لمعرفة ما إذا كانت هناك أي منشورات. إذا كان الأمر كذلك ، فإننا نأخذ قوائم المنشور هذه من ذاكرة التخزين المؤقت. وإلا فإننا سنقوم باسترداد محتوى قاعدة البيانات وذاكرة التخزين المؤقت للنتائج. بالإضافة إلى ذلك ، بعد فترة زمنية معينة ، يمكننا تنظيف ذاكرة التخزين المؤقت Redis بحيث يمكن تحديث المحتوى.
4. ضغط Gzip
سيكون لتشغيل ضغط GZIP تأثير كبير على تطبيقات الويب الخاصة بك. عندما يطلب المتصفح المضغوط GZIP موارد معينة ، يضغط الخادم قبل إرجاع الاستجابة إلى المتصفح. إذا لم تستخدم GZIP لضغط مواردك الثابتة ، فقد يستغرق الأمر وقتًا أطول حتى يحصل عليه المستعرض.
في التطبيقات السريعة ، يمكننا استخدام البرامج الوسيطة المدمجة express.static () للتعامل مع المحتوى الثابت. بالإضافة إلى ذلك ، يمكن ضغط المحتوى الثابت ومعالجته باستخدام البرامج الوسيطة للضغط. فيما يلي أمثلة الاستخدام:
نسخة الكود كما يلي:
var compression = require ('compression') ؛
app.use (compression ()) ؛ // استخدام الضغط
app.use (express.static (path.join (__ dirname ، 'public')))) ؛
5. إذا كان ذلك ممكنًا ، قم بإعداد العميل
الآن هناك أطر عمل متعددة الاستخدامات وقوية MVC/MVVM ، مثل AngularJS ، Ember ، Meteor ، وما إلى ذلك ، ومن السهل جدًا إنشاء تطبيق من صفحة واحدة. في الأساس ، تحتاج فقط إلى فضح API وإعادة استجابة JSON إلى العميل ، دون تقديم الصفحة على الخادم. على العميل ، يمكنك تنظيم jsons مع الأطر وعرضها على واجهة المستخدم. يمكن فقط إرسال ردود JSON على الخادم حفظ النطاق الترددي وتحسين الأداء ، لأنك لا تحتاج إلى إرجاع علامات التخطيط في كل استجابة ، إلى اليمين ، تحتاج فقط إلى إعادة JSON النقية ثم تقديمها على العميل.
دعنا نلقي نظرة على البرنامج التعليمي الخاص بي ، وهو ما يتعلق بكيفية فضح واجهة برمجة تطبيقات مريحة باستخدام Express 4. لقد كتبت أيضًا برنامجًا تعليميًا آخر يوضح كيفية الجمع بين واجهات برمجة التطبيقات هذه مع AngularJs.
6. لا تخزن الكثير من البيانات في الجلسات
بالنسبة لتطبيقات الصفحات السريعة النموذجية ، يتم حفظ بيانات الجلسة في الذاكرة افتراضيًا. عند توفير الكثير من البيانات في الجلسة ، فإنه سيزيد بشكل كبير من النفقات العامة للخادم. لذلك ، إما أن تقوم بالتبديل إلى طريقة تخزين أخرى لحفظ بيانات الجلسة ، أو محاولة تقليل كمية البيانات المخزنة في الجلسة.
على سبيل المثال ، عندما يقوم المستخدمون بتسجيل الدخول إلى تطبيقك ، يمكنك حفظ معرفاتهم فقط في الجلسة بدلاً من كائن بيانات المستخدم بالكامل. أيضًا ، بالنسبة لتلك الاستعلامات التي يمكنك الحصول عليها من كائنات من ID ، يجب أن ترغب في استخدام MongoDB أو Redis لتخزين بيانات الجلسة.
7. تحسين الاستعلام
لنفترض أن لديك مدونة وتريد عرض أحدث المنشورات على صفحتك الرئيسية. يمكنك الحصول على بيانات عبر mongoose مثل هذا:
نسخة الكود كما يلي:
post.find (). limit (10) .exec (وظيفة (err ، المنشورات) {
// إرسال المنشورات إلى العميل
}) ؛
ومع ذلك ، فإن المشكلة هي أن طريقة Find () Mongoose ستستفسر عن جميع مجالات الكائن ، والعديد من الحقول غير مطلوبة على الصفحة الرئيسية. على سبيل المثال ، يحفظ Commentis الردود على مشاركات محددة. لا نحتاج إلى عرض ردود المقالة ، حتى نتمكن من إزالتها عند الاستعلام. هذا سوف يزيد بلا شك السرعة. يمكن تحسين الاستعلام أعلاه مثل هذا:
نسخة الكود كما يلي:
post.find ()
// إرسال المنشورات إلى العميل
}) ؛
8. استخدم طريقة V8 القياسية
بعض العمليات على مجموعة ، مثل الخريطة ، وتقليل ، و foreach ، لا تدعم بالضرورة جميع المتصفحات. يمكننا حل بعض مشكلات توافق المتصفح من خلال مكتبة المقدمة. ولكن بالنسبة إلى Node.js ، تحتاج إلى معرفة بالضبط عمليات محرك Google V8 JavaScript. وبهذه الطريقة ، يمكنك استخدام هذه الأساليب المدمجة مباشرة لتشغيل المجموعة على جانب الخادم.
9. استخدم nginx أمام العقدة
Nginx هو خادم ويب صغير وخفيف الوزن يمكنه تقليل التحميل على خادم Node.js. يمكنك تكوين الموارد الثابتة على Nginx بدلاً من على العقدة. يمكنك ضغط الاستجابات مع GZIP على Nginx لجعل جميع الردود أصغر. لذلك ، إذا كان لديك منتج يعمل ، أعتقد أنك يجب أن ترغب في استخدام Nginx لتحسين سرعة التشغيل.
10. تعبئة JavaScript
أخيرًا ، يمكنك أيضًا تحسين سرعة تطبيق الصفحة عن طريق تغليف ملفات JS المتعددة. عندما يواجه المتصفح عنصر <script> في عرض الصفحة ، سيتم حظره ولن يستمر في التشغيل حتى يتم الحصول على البرنامج النصي (ما لم يتم تعيين الخاصية غير المتزامنة). على سبيل المثال ، إذا كانت صفحتك تحتوي على خمسة ملفات JavaScript ، فسيصدر المستعرض خمسة طلبات منفصلة HTTP للحصول عليها. إذا تم ضغط هذه الملفات الخمسة وتعبئتها في واحدة ، فسيتم تحسين الأداء الكلي بشكل كبير. الشيء نفسه ينطبق على ملفات CSS. يمكنك استخدام أداة تجميع مثل Grunt/Gulp لتعبئة ملفات الموارد الخاصة بك.
ختاماً
يمكن أن تحسن النصائح العشرة أعلاه بالتأكيد سرعة تطبيقات الويب الخاصة بك. ومع ذلك ، أعرف أن هناك مجالًا للتحسين والتحسين. إذا كان لديك أي نصائح لتحسين الأداء ، فأخبرني في الرد.
شكرا للقراءة!