في الآونة الأخيرة ، تم تسمية Node 12 باسم Erbium
، الذي سيستمر دعمه طويل الأجل (LTS) من أكتوبر 2019 إلى أبريل 2022.
الإصدار الجديد لديه الكثير من الأشياء الجيدة والتحسينات على وقت التشغيل. بالإضافة إلى ذلك ، بالنظر إلى أنه تحت غطاء محرك السيارة V8 ، ستتلقى العقدة أيضًا جميع تحسينات المحرك.

دعم import/export
يدخل العقدة المرحلة 3 في الطريق إلى وحدات ECMAScript . في البداية ، كانت هذه الميزة متاحة فقط مع --experimental-modules
. بحلول الوقت الذي تنتقل فيه العقدة إلى LTS ، من المخطط إزالة الحاجة إلى استخدام هذه العلامة.
أصبح بناء الجملة الذي يستخدم import/export
مفضلاً عند العمل مع الوحدات النمطية من مطوري js منذ التوحيد القياسي في ES6 ، وقد عمل الفريق وراء Node بجد على الدعم الأصلي. كانت هذه الميزة متاحة تجريبيًا مع Node 8.0 من المرحلة 0. الإصدار الحالي هو خطوة كبيرة في هذا الاتجاه. تدعم معظم المتصفحات الشائعة هذه الميزة بالفعل مع <script type="module">
.
من المرحلة 3 ، سيكون هناك دعم لثلاثة خيارات import
من نماذج ES:
لا يمكن تصدير وحدات الفانيليا إلا بالطريقة الافتراضية:
import module from 'cjs-library'
يمكنك استخدام import()
للتحميل في وقت التشغيل. import()
إرجاع Promise
ويعمل مع كل من نماذج ES ومكتبات CommonJS.
V8
سيتم تشغيل Node 12 مبدئيًا على الإصدار V8 7.4 وسيتم ترقيته في النهاية إلى 7.6. وافق فريق V8 على توفير ABI (واجهة التطبيق الثنائية). التحسينات الملحوظة في الإصدار 7.4 من V8 هي تحسينات في الأداء من أجل تنفيذ جافا سكريبت بشكل أسرع وإدارة أفضل للذاكرة ودعم بناء جملة ECMAScript.
آثار مكدس المتزامن
لنلقِ نظرة على هذا الكود:
async function testAsyncStacktrace() { await killme(); return 42; } async function killme() { await Promise.resolve(); throw new Error('#Feelsbadman'); } testAsyncStacktrace().catch(error => console.log(error.stack));
في الإصدارات الأقدم ، ستحصل على شيء مثل هذا:
Error: #Feelsbadman at killme (test.js:8:11) at process._tickCallback (internal/process/next_tick.js:68:7) at Function.Module.runMain (internal/modules/cjs/loader.js:721:11) at startup (internal/bootstrap/node.js:228:19) at bootstrapNodeJSCore (internal/bootstrap/node.js:576:3)
كما ترى ، لا تذكر testAsyncStacktrace
. والآن يتم تمكين علامة --async-stack-traces
افتراضيًا ، وسيظهر السجل بالشكل التالي:
Error: #Feelsbadman at killme (test.js:8:11) at async testAsyncStacktrace (test.js:2:5)
استدعاء سريع عندما لا يتطابق عدد الوسائط
في JavaScript ، من المقبول تمامًا استدعاء وظائف ذات وسيطات أقل / أكثر (أي تمرير معلمات رسمية أقل أو أكثر معلنة). في الحالة الأولى يكون قيد التطبيق ، وفي الحالة الثانية يكون التطبيق الزائد . في حالة عدم كفاية عدد الوسائط ، سيتم تحديد المعلمات ، بينما في حالة وجود عدد كبير من المعلمات يتم تجاهلها ببساطة.
ومع ذلك ، لا يزال بإمكان وظائف JavaScript الحصول على المعلمات الفعلية باستخدام arguments
أو كائن المعلمات الباقي ، أو حتى استخدام Function.prototype.arguments غير الموحد في وظائف الوضع البطيء . نتيجة لذلك ، يجب أن توفر محركات JavaScript طريقة للحصول على المعلمات الفعلية. في V8 ، يتم ذلك باستخدام تقنية تكيف الوسائط . لسوء الحظ ، تؤثر هذه الأساليب على الأداء.
في بعض السيناريوهات ، يتخطى V8 تمامًا تكييف الوسيطات ، مما يقلل النفقات العامة للمكالمات بنسبة تصل إلى 60٪.

يمكن العثور على التفاصيل في المستند .
تحليل متسارع
في Chrome ، يتم تحليل نصوص برمجية كبيرة بما يكفي في مؤشرات ترابط العامل أثناء التحميل. إصلاح V8 7.4 المشكلة مع أداء فك UTF-8 ، مما أدى إلى تسريع 8 ٪.

يمثل كل انخفاض في المخطط أحد تحسينات الأداء في محلل الدفق.
تحسين await
إلى جانب علامة --async-stack-traces
، يتم الآن تمكين --harmony-await-optimization
بشكل افتراضي. التفاصيل هنا .
حقول الصف الخاص
لقد تم ترحيل القدرة على استخدام الحقول الخاصة في V8 إلى العقدة. هذه الحقول غير متوفرة خارج الفصل. لإنشاء هذه ، تحتاج إلى تحديد #
قبل المتغير.
class HelloThere { #hidden = 'Hidden'; get hidden() { return this.#hidden; } set hidden(txt) { this.#hidden = txt; } hi() { console.log(`Hello, ${this.#hidden}`); } }
عندما تحاول الوصول إلى #hidden
من الخارج ، تحصل على خطأ في بناء الجملة.
const hello = new HelloThere(); hello.#hidden = 'Visible';
بداية سريعة
ستستخدم العقدة 12 ذاكرة التخزين المؤقت للمكتبات المضمنة قبل الإنشاء وتضمينها كملفات ثنائية. نظرًا لاستخدام ذاكرة التخزين المؤقت هذه في السلسلة الرئيسية ، سيتم تقليل وقت البدء بنسبة 30٪.
TLS والأمن
يدعم Noda الآن TLS 1.3 ، والذي يوفر أمانًا محسنًا ويقلل من زمن الوصول. لقد غير بروتوكول TLS 1.3 البروتوكول إلى حد كبير وهو يدمج بنشاط في الشبكة. سيؤدي إدخال TLS 1.3 إلى زيادة سرية بيانات المستخدم ، فضلاً عن تسريع معالجة الطلبات عن طريق تقليل وقت المصافحة في HTTPS. بالإضافة إلى ذلك ، يتم تعطيل TLS 1.0 و 1.1 افتراضيًا ، وتمت إزالة الطرق المهملة من crypto
.
حجم الورك الديناميكي
سابقًا ، تم استخدام حجم كومة الذاكرة المؤقتة الافتراضية V8 الذي يبلغ 700 ميجابايت (أنظمة 32 بت) أو 1400 ميجابايت (أنظمة 64 بت). ستحدد العقدة الآن أحجام الكومة استنادًا إلى الذاكرة المتوفرة من أجل تحسين الموارد المستخدمة للجهاز.
القدرة على تفريغ الورك
يوفر Node 12 القدرة على تفريغ أكوام الذاكرة ، مما يسهل اكتشاف مشكلات الذاكرة. التفاصيل يمكن العثور عليها هنا وهنا .
تقارير تشخيصية تجريبية
يوفر Noda أدوات أكثر فعالية لتشخيص المشكلات (الأداء ، واستخدام وحدة المعالجة المركزية ، والذاكرة ، وتعطل ، وما إلى ذلك) مباشرة داخل التطبيق ، مما يوفر ميزة تجريبية للتقارير.
تحسينات عند العمل مع الوحدات النمطية الأصلية
تواصل Node 12 الاتجاه نحو تبسيط العمل باستخدام N-API . قام هذا الإصدار بتحسين الدعم ، خاصة عند العمل مع مؤشرات ترابط العامل.
استنتاج
عقدة 12 لديه الكثير من التحسينات. يمكن الاطلاع على CHANGELOG الكامل على Github وعلى الموقع نفسه.