{"componentChunkName":"component---src-templates-docs-js","path":"/docs/optimizing-performance.html","result":{"data":{"markdownRemark":{"html":"<div class=\"scary\">\n<blockquote>\n<p>These docs are old and won’t be updated. Go to <a href=\"https://react.dev/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">react.dev</a> for the new React docs.</p>\n<p>These new documentation pages teach modern React:</p>\n<ul>\n<li><a href=\"https://react.dev/reference/react/memo#skipping-re-rendering-when-props-are-unchanged\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">memo</code>: Skipping re-rendering when props are unchanged\n</a></li>\n</ul>\n</blockquote>\n</div>\n<p>تستخدم React العديد من التقنيّات الذكية داخليًا للتقليل من عدد عمليات DOM المكلفة المطلوبة لتحديث واجهة المستخدم. يؤدي استعمال React إلى الحصول على واجهات مستخدم سريعة دون الحاجة إلى القيام بعمل كبير من أجل تحسين الأداء. بالرغم من ذلك يوجد العديد من الطرق لتسريع تطبيق React الخاص بك</p>\n<h2 id=\"use-the-production-build\"><a href=\"#use-the-production-build\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>استخدام نسخة الإنتاج </h2>\n<p>إذا كنت تقيّم أو تواجه مشاكل في الأداء في تطبيقات React الخاصة بك، تأكد من أنك تختبر باستخدام نسخة الإنتاج المصغّرة من React.</p>\n<p>توفّر React بشكل افتراضي العديد من رسائل التحذير المفيدة أثناء التطوير. ولكنّها تجعل من React أكبر حجما وأبطأ، عليك أن تتأكد من استخدامك لاصدار الإنتاج عند توزيع التطبيق.</p>\n<p>إن لم تكن مُتأكدًا من أن عمليّة بناء التطبيق معُدًّة بشكل صحيح، يُمكنك أن تتحقق بتثبيت أداة <a href=\"https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">أداة تطوير React لمُتصفّح Chrome</a>. إن تَزُر موقعا موقعًا مبنيًّا باستخدام React في وضع الإنتاج، فسيكون للأيقونة خلفية ذاة لون داكن.</p>\n\n  <a class=\"gatsby-resp-image-link\" href=\"/static/d0f767f80866431ccdec18f200ca58f1/0a47e/devtools-prod.png\" style=\"display: block\" target=\"_blank\" rel=\"noopener\">\n  \n  <span class=\"gatsby-resp-image-wrapper\" style=\"position: relative; display: block;  max-width: 600px; margin-left: auto; margin-right: auto;\">\n    <span class=\"gatsby-resp-image-background-image\" style=\"padding-bottom: 20.952380952380953%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAIAAAABPYjBAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAt0lEQVQI143D3W6DIBgAUN//hXrZJku8g1FBsy2ZVORHMSYtfoBgjc2udtuTnGLf95zz9oZnfuaUQ4zg3OnygSpajOMYQvAAwQcAD/+Wv8viPbjHAwDu6z3ltOUtpdXY6bflRVmWlDKM8ffXzycmtKoYq+uaIYQYZRjhpmmuhJArOYuLiy7F1Xt/HIcQouA3LqXSWkspecuV0toYYwYp5TgMfS+V0naa+l7cWm6tNdp0XRdCnOf5BWg72y43Hp2qAAAAAElFTkSuQmCC'); background-size: cover; display: block;\">\n      <img class=\"gatsby-resp-image-image\" style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\" alt=\"أداة تطوير React في موقع يستعمل React في وضع الإنتاج.\" title=\"\" src=\"/static/d0f767f80866431ccdec18f200ca58f1/0a47e/devtools-prod.png\" srcset=\"/static/d0f767f80866431ccdec18f200ca58f1/65ed1/devtools-prod.png 210w,\n/static/d0f767f80866431ccdec18f200ca58f1/d10fb/devtools-prod.png 420w,\n/static/d0f767f80866431ccdec18f200ca58f1/0a47e/devtools-prod.png 600w\" sizes=\"(max-width: 600px) 100vw, 600px\">\n    </span>\n  </span>\n  \n  </a>\n    \n<p>أمّا إن زُرتَ موقعًا مبنيًّا باستخدام React في وضع التطوير، فسيكون لأيقونة هذه الأداة خلفية حمراء: </p>\n\n  <a class=\"gatsby-resp-image-link\" href=\"/static/e434ce2f7e64f63e597edf03f4465694/0a47e/devtools-dev.png\" style=\"display: block\" target=\"_blank\" rel=\"noopener\">\n  \n  <span class=\"gatsby-resp-image-wrapper\" style=\"position: relative; display: block;  max-width: 600px; margin-left: auto; margin-right: auto;\">\n    <span class=\"gatsby-resp-image-background-image\" style=\"padding-bottom: 33.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAABYlAAAWJQFJUiTwAAABNElEQVQY023QyXKCQBSFYd7/pbKJA2jTgGAqRksUQjsgDfZ0ewBSIeUu3/JfnTqem1hrnbPuP/2Lc71zDgDqR3N6fyv3O09O1ERIIaUUQnAhxKsDgFISAIyRfW+HYdBas6qg9d3DIQ78IEk2aZr5vp+laRwnCK2DIIgwDjHGURQitFqh4xdum4sxVkoxDINzzjufC1JVZVHk+ak4F4RcLpcrIdVvLMuiLAkh1+s1z49FWVWEVNX3YX/QoK21Hmj9mi2lEkJyAKGUVCA1KFCKc66U0lorUIwxBTCOo7UWALz5bI6jaJPEm+hjOcNrP4nQFq23abxLo0/fD5aLRYhwiLAfBFm2fTI2TowxHqW0656csY7ypua05vWN1bcnffDmztu25YzRhjZN03WdMWYcR+fc320/DNOCC4EUU1UAAAAASUVORK5CYII='); background-size: cover; display: block;\">\n      <img class=\"gatsby-resp-image-image\" style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\" alt=\"أداة تطوير React في موقع يستعمل React في وضع التطوير\" title=\"\" src=\"/static/e434ce2f7e64f63e597edf03f4465694/0a47e/devtools-dev.png\" srcset=\"/static/e434ce2f7e64f63e597edf03f4465694/65ed1/devtools-dev.png 210w,\n/static/e434ce2f7e64f63e597edf03f4465694/d10fb/devtools-dev.png 420w,\n/static/e434ce2f7e64f63e597edf03f4465694/0a47e/devtools-dev.png 600w\" sizes=\"(max-width: 600px) 100vw, 600px\">\n    </span>\n  </span>\n  \n  </a>\n    \n<p>من المُفترض أن تستخدم وضع التطوير أثناء عملك على تطبيقك، ووضع الإنتاج عند توزيع التطبيق للمتسخدمين.</p>\n<p>يمكنك أن تجد فيما يلي التعليمات لبناء تطبيقك لوضع الإنتاج.</p>\n<h3 id=\"create-react-app\"><a href=\"#create-react-app\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Create React App </h3>\n<p>إذا كان مشروعة مبنية باستخدام <a href=\"https://github.com/facebookincubator/create-react-app\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Create React App</a>, نفّذ:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"gatsby-code-text\"><code class=\"gatsby-code-text\">npm run build</code></pre></div>\n<p>سينشئ هذا الأمر نسخة الإنتاج من تطبيقك في مجلّد  <code class=\"gatsby-code-text\">build/</code> من مشروعك.</p>\n<p>تذكّر أن هذا ضروري قبل نشر تطبيقك للإنتاج. أما بالنسبة للتطوير العادي استخدم الأمر <code class=\"gatsby-code-text\">npm start</code>.</p>\n<h3 id=\"single-file-builds\"><a href=\"#single-file-builds\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>النسخ المبنية المكوّنة من ملف واحد (Single-File Builds) </h3>\n<p> نُوفِّر إصدارات جاهزة للإنتاج من React و React DOM كملف واحد فقط:</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"gatsby-code-html\"><code class=\"gatsby-code-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>https://unpkg.com/react@18/umd/react.production.min.js<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token script\"></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>https://unpkg.com/react-dom@18/umd/react-dom.production.min.js<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token script\"></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>تذكّر أنّ ملفّات React التي تنتهي باللاحقة <code class=\"gatsby-code-text\">.production.min.js</code> هي فقط المُلائِمة للإنتاج.</p>\n<h3 id=\"brunch\"><a href=\"#brunch\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Brunch </h3>\n<p>للحصول على النسخة الأكثر كفاءةً للإنتاج من أجل Brunch، ثبِّت الإضافة <a href=\"https://github.com/brunch/terser-brunch\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">terser-brunch</code></a>:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"gatsby-code-text\"><code class=\"gatsby-code-text\"># إن كنت تستخدم npm\nnpm install --save-dev terser-brunch\n\n#إن كنت تستخدم Yarn\nyarn add --dev terser-brunch</code></pre></div>\n<p>ولإنشاء نسخة للإنتاج بعد ذلك، أضف العَلَم <code class=\"gatsby-code-text\">-p</code> لأمر البناء <code class=\"gatsby-code-text\">build</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"gatsby-code-text\"><code class=\"gatsby-code-text\">brunch build -p</code></pre></div>\n<p>تذكَّر أنَك تحتاج فقط لفعل ذلك من أجل نُسَخ الإنتاج، فلا يجب تمرير العَلَم ‎<code class=\"gatsby-code-text\">-p</code> أو تطبيق هذه الإضافة أثناء التطوير، لأنّها ستُخفي تحذيرات React المُفيدة وتجعل من بناء التطبيق أبطأ. </p>\n<h3 id=\"browserify\"><a href=\"#browserify\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Browserify </h3>\n<p> للحصول على النسخة الأكثر كفاءةً للإنتاج من أجل Browserify، ثبِّت بعض الإضافات:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"gatsby-code-text\"><code class=\"gatsby-code-text\"># إن كنت تستخدم npm\nnpm install --save-dev envify terser uglifyify\n\n# إن كنت تستخدم Yarn\nyarn add --dev envify terser uglifyify</code></pre></div>\n<p>لإنشاء نُسخة للإنتاج، تأكَّد من أن تُضيف هذه المٌحَوّلات <strong>(الترتيب مهم)</strong>:</p>\n<ul>\n<li>يضمن المُحَوّل <a href=\"https://github.com/hughsk/envify\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">envify</code></a> عيين البيئة الصحيحة للبناء. اجعله عامًّا عن طريق العَلَم (‎<code class=\"gatsby-code-text\">-g</code>).</li>\n<li>يُزيل المُحَوّل <a href=\"https://github.com/hughsk/uglifyify\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">uglifyify</code></a> استيرادات التطوير، اجعله عامًّا أيضًا (<code class=\"gatsby-code-text\">-g</code>).</li>\n<li>وأخيرًا نُمرِّر الحزمة الناتجة إلى الأمر <a href=\"https://github.com/terser-js/terser\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">terser</code></a> (<a href=\"https://github.com/hughsk/uglifyify#motivationusage\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">تعرف على السبب من هنا</a>).</li>\n</ul>\n<p>على سبيل المثال:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"gatsby-code-text\"><code class=\"gatsby-code-text\">browserify ./index.js \\\n  -g [ envify --NODE_ENV production ] \\\n  -g uglifyify \\\n  | terser --compress --mangle > ./bundle.js</code></pre></div>\n<blockquote>\n<p><strong>ملاحظة:</strong></p>\n<p>اسم الحزمة هو <code class=\"gatsby-code-text\">uglify-js</code>, ولكن الملف الثنائي الذي تُعطينا إيّاه يُدعى <code class=\"gatsby-code-text\">uglifyjs</code>.<br>\nهذا ليس خطأ في الكتابة هنا. </p>\n</blockquote>\n<p>تذكَّر أنَك تحتاج فقط لفعل ذلك من أجل نُسَخ الإنتاج، فلا يجب تطبيق هذه الإضافات أثناء التطوير، لأنّها ستُخفي تحذيرات React المُفيدة وتجعل من بناء التطبيق أبطأ. </p>\n<h3 id=\"rollup\"><a href=\"#rollup\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Rollup </h3>\n<p> للحصول على النسخة الأكثر كفاءةً للإنتاج من أجل Rollup، ثبِّت بعض الإضافات:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"gatsby-code-text\"><code class=\"gatsby-code-text\"># إن كنت تستخدم npm\nnpm install --save-dev rollup-plugin-commonjs rollup-plugin-replace rollup-plugin-terser \n\n# إن كنت تستخدم Yarn\nyarn add --dev rollup-plugin-commonjs rollup-plugin-replace rollup-plugin-terser </code></pre></div>\n<p>لإنشاء نُسخة للإنتاج، تأكَّد من أن تُضيف هذه الإضافات <strong>(الترتيب مُهم)</strong>:</p>\n<ul>\n<li>تضمن الإضافة <a href=\"https://github.com/rollup/rollup-plugin-replace\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">replace</code></a> تعيين البيئة الصحيحة للبناء.</li>\n<li>تُزوِّد الإضافة <a href=\"https://github.com/rollup/rollup-plugin-commonjs\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">commonjs</code></a> دعمًا لأجل CommonJS في Rollup.</li>\n<li>تضغط الإضافة <a href=\"https://github.com/TrySound/rollup-plugin-terser\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">terser</code></a> الحزمة النهائيّة.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token literal-property property\">plugins</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n  <span class=\"token comment\">// ...</span>\n  <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'rollup-plugin-replace'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    <span class=\"token string-property property\">'process.env.NODE_ENV'</span><span class=\"token operator\">:</span> <span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span><span class=\"token string\">'production'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'rollup-plugin-commonjs'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'rollup-plugin-terser'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token comment\">// ...</span>\n<span class=\"token punctuation\">]</span></code></pre></div>\n<p>للحصول على مثال كامل عن طريقة الإعداد <a href=\"https://gist.github.com/Rich-Harris/cb14f4bc0670c47d00d191565be36bf0\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">انظر هنا</a>.</p>\n<p>تذكَّر أنَك تحتاج فقط لفعل ذلك من أجل نُسَخ الإنتاج، فلا يجب تطبيق الإضافة <code class=\"gatsby-code-text\">terser</code> أو الإضافة <code class=\"gatsby-code-text\">replace</code> أثناء التطوير، لأنّها ستُخفي تحذيرات React المُفيدة وتجعل من بناء التطبيق أبطأ.</p>\n<h3 id=\"webpack\"><a href=\"#webpack\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>webpack </h3>\n<blockquote>\n<p><strong>ملاحظة:</strong></p>\n<p>إن كُنتَ تستخدم الأمر Create React App, رجاءً اتبع <a href=\"#create-react-app\">التعليمات السّابقة</a>.<br>\nهذا القسم يُفيدك فقط إن كنت تريد ضبط إعدادات webpack بشكلٍ مباشر.</p>\n</blockquote>\n<p>نسخة Webpack v4+ ستضغط الشفرة البرمجية الخاصة بك تلقائيًا في طور الإنتاج <code class=\"gatsby-code-text\">Production</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">const</span> TerserPlugin <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'terser-webpack-plugin'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">mode</span><span class=\"token operator\">:</span> <span class=\"token string\">'production'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">optimization</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token literal-property property\">minimizer</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">TerserPlugin</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token comment\">/* additional options here */</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>بإمكانك تعلّم المزيد حول هذا الموضوع في <a href=\"https://webpack.js.org/guides/production/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">webpack توثيق</a>.</p>\n<p>تذكَّر أنَك تحتاج فقط لفعل ذلك من أجل نُسَخ الإنتاج، فلا يجب تطبيق الإضافة <code class=\"gatsby-code-text\">TerserPlugin</code> أثناء التطوير، لأنّها ستُخفي تحذيرات React المُفيدة وتجعل من بناء التطبيق أبطأ.</p>\n<h2 id=\"profiling-components-with-the-chrome-performance-tab\"><a href=\"#profiling-components-with-the-chrome-performance-tab\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>تفحص المكونات باستخدام نافذة الأداء في متصفح Chrome </h2>\n<p>يُمكنِك في <strong>وضع التطوير</strong> إيجاد مخطّطات توضيحية لعمليّة وصل المُكوِّنات (mount)، وتحديثها، وفصلها (unmount)، وذلك باستخدام أدوات الأداء في المتصفحات التي تدعمها. على سبيل المثال: </p>\n<center>\n  <a class=\"gatsby-resp-image-link\" href=\"/static/64d522b74fb585f1abada9801f85fa9d/1ac66/react-perf-chrome-timeline.png\" style=\"display: block\" target=\"_blank\" rel=\"noopener\">\n  \n  <span class=\"gatsby-resp-image-wrapper\" style=\"position: relative; display: block;  max-width: 651px; margin-left: auto; margin-right: auto;\">\n    <span class=\"gatsby-resp-image-background-image\" style=\"padding-bottom: 35.23809523809524%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAAsTAAALEwEAmpwYAAABYUlEQVQY023LS0sCYRTG8fmMLTQFI0ONXHglE9r1AaLAyE2bykVaGeEF2+RtUnRSpps63gU1nbw3o6/OvCdUiqA2fw6c50d0S65cWJsJ6bNhHRPVVeL6OmUYF8wcY+YZ46S0+07Znl26V7eJvjQUPaaS19gLWkYR6zBsJUaNVPJcmrpQvt2oy/5NNrjVi2o7YS0b0rbuNR/k9qjoqHql+euVmkcyJuWzmHxCytDDKiKlxGw8KJH2pFuVcMoSTgXjV+a86wWfko1oetGNbsIicDWUcXBpO0ofovQBoo8ntB3RR+jlhMAYA54KPMU1fNSZmjpdo10q6kqR9Strd/JOag8AsDDGIsKzoYj6eDbE0wEIHIhojjEsAlB53GdCknbWVo2p6ykT+7TDt2/nGIuLPywCyzEAEMsLiwIAdMoBxif/bFH9vH9QDKBmXODZb4x/2B+8qDAZ8E1anPJLAL/Mv/gLorpdmC10NYMAAAAASUVORK5CYII='); background-size: cover; display: block;\">\n      <img class=\"gatsby-resp-image-image\" style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\" alt=\"React components in Chrome timeline\" title=\"\" src=\"/static/64d522b74fb585f1abada9801f85fa9d/1ac66/react-perf-chrome-timeline.png\" srcset=\"/static/64d522b74fb585f1abada9801f85fa9d/65ed1/react-perf-chrome-timeline.png 210w,\n/static/64d522b74fb585f1abada9801f85fa9d/d10fb/react-perf-chrome-timeline.png 420w,\n/static/64d522b74fb585f1abada9801f85fa9d/1ac66/react-perf-chrome-timeline.png 651w\" sizes=\"(max-width: 651px) 100vw, 651px\">\n    </span>\n  </span>\n  \n  </a>\n    </center>\n<p>لفعل ذلك في متصفح Chrome: </p>\n<ol>\n<li>Temporarily <strong>disable all Chrome extensions, especially React DevTools</strong>. They can significantly skew the results!</li>\n<li>عطِّل بشكل مؤقَّت <strong>كافة إضافات Chrome خاصة أدوات تطوير React</strong>، فهي تُفسِد النتائج بالتأكيد.</li>\n<li>تأكّد من تشغيل التطبيق في وضع التطوير.</li>\n<li>افتح نافذة الأداء (<a href=\"https://developers.google.com/web/tools/chrome-devtools/evaluate-performance/timeline-tool\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Performance</a>) في أدوات تطوير المتصفّح Chrome واضغط على تسجيل (Record).</li>\n<li>نفّذ الإجراءات التي ترغب بتفحصها. لا تُسجِّل أكثر من 20 ثانية فقد يتوقّف Chrome عن الاستجابة.</li>\n<li>أوقف التسجيل.</li>\n<li>ستُجمَّع أحداث React تحت العنوان <strong>User Timing</strong>.</li>\n</ol>\n<p>للحصول على دليل مفصّل، راجع <a href=\"https://calibreapp.com/blog/react-performance-profiling-optimization\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">هذه المقالة من طرف Ben Schwarz</a>.</p>\n<p>لاحظ أنّ هذه <strong>الأرقام نسبيّة لذلك ستُصيَّر المُكوِّنات بشكلٍ أسرع في مرحلة الإنتاج</strong>. يُساعدك ذلك على إدراك متى تُحدَّث عناصر واجهة المستخدم عن طريق الخطأ، ومتى تحصل هذه التحديثات. </p>\n<p>المتصفحات التي تدعم هذه الميزة حاليًّا هي Chrome، و Edge، و Internet Explorer، ولكنّنا نستخدم<a href=\"https://developer.mozilla.org/en-US/docs/Web/API/User_Timing_API\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">واجهة توقيت المستخدم (User Timing API)</a> المعياريّة، لذلك نتوقع الدعم من المزيد من المتصفحات.</p>\n<h2 id=\"profiling-components-with-the-devtools-profiler\"><a href=\"#profiling-components-with-the-devtools-profiler\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>تفحص المكونات باستخدام أداة التحليل  من أدوات التطوير</h2>\n<p>يوفر <code class=\"gatsby-code-text\">react-dom</code> <span dir=\"ltr\">16.5+</span> و <code class=\"gatsby-code-text\">react-native</code> <span dir=\"ltr\">0.57+</span> أدوات تحليل مُحسّنة لوضع التطوير مع أداة التحليل في React DevTools.\nيمكن إيجاد لمحة عن أداة التحليل في هذه المقالة <a href=\"/blog/2018/09/10/introducing-the-react-profiler.html\">“مقدمة إلى أداة تحليل React”</a>.\nفيديو عرض تفصيلي لأداة التحليل <a href=\"https://www.youtube.com/watch?v=nySib7ipZdk\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">متوفّر كذلك على YouTube</a>.</p>\n<p>إذا لم تقم بتثبيت أدوات تطوير React بعد، يمكنك إيجادها هنا:</p>\n<ul>\n<li><a href=\"https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=en\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">إضافة متصفّح Chrome</a></li>\n<li><a href=\"https://addons.mozilla.org/en-GB/firefox/addon/react-devtools/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Firefox إضافة متصفّح</a></li>\n<li><a href=\"https://www.npmjs.com/package/react-devtools\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">الإصدار المستقل (حزمة Node)</a></li>\n</ul>\n<blockquote>\n<p>ملاحظة</p>\n<p>حزمة تحليل <code class=\"gatsby-code-text\">react-dom</code> في وضع الإنتاج متوفّر كذلك باسم <code class=\"gatsby-code-text\">react-dom/profiling</code>.\nإقرأ المزيد حول طريقة استعمال هذه الحزمة في <a href=\"https://fb.me/react-profiling\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">fb.me/react-profiling</a></p>\n</blockquote>\n<blockquote>\n<p>Note</p>\n<p>Before React 17, we use the standard <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/User_Timing_API\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">User Timing API</a> to profile components with the chrome performance tab.\nFor a more detailed walkthrough, check out <a href=\"https://calibreapp.com/blog/react-performance-profiling-optimization\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">this article by Ben Schwarz</a>.</p>\n</blockquote>\n<h2 id=\"virtualize-long-lists\"><a href=\"#virtualize-long-lists\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>عرض القوائم الطويلة </h2>\n<p>إن كان تطبيقك يُصيِّر قوائم طويلة من البيانات (مئات أو آلاف الصفوف)، فنوصي باستخدام تقنيّة تدعى النوافذ (windowing)، وهي تقنية تُصيِّر مجموعة صغيرة من الصفوف في أي وقت مُحدَّد، وتستطيع تقليل الزمن الذي تستغرقه إعادة تصيير المُكوِّنات وعدد عُقَد DOM المُنشأة. </p>\n<p>تعتبر <a href=\"https://react-window.now.sh/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">react-window</a> و <a href=\"https://bvaughn.github.io/react-virtualized/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">react-virtualized</a> مكتبات نوافذ شائعة تُزوِّدنا بالعديد من المُكوِّنات القابلة لإعادة الاستخدام لعرض القوائم، الشبكات، وبيانات الجداول. بإمكانك أيضًا إنشاء مُكوِّن النوافذ الخاص بك، مثلما <a href=\"https://medium.com/@paularmstrong/twitter-lite-and-high-performance-react-progressive-web-apps-at-scale-d28a00e780a3\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">فعلت Twitter</a>، إن أردتَ شيئًا مُخصّصًا لأجل تطبيقك. </p>\n<h2 id=\"avoid-reconciliation\"><a href=\"#avoid-reconciliation\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>تجنب المطابقة (Reconciliation) </h2>\n<p>تبني React وتدعم تمثيلًا داخليًّا لواجهة المستخدم المُصيَّرة. يتضمّن ذلك عناصر React التي تُعيدها من المُكوِّنات. يُتيح لك هذا التمثيل تجنّب إنشاء عقد DOM غير الضروريّة والوصول إليها، حيث يكون ذلك عملية بطيئة على كائنات JavaScript. يُشار إلى ذلك أحيانًا بـ DOM الافتراضي، ولكنّه يعمل بنفس الطريقة في React Native. </p>\n<p>عندما تتغيّر خاصيّة أو حالة المُكوِّن، تُقرِّر React أي عقدة DOM هي التي يجب تحديثها عن طريق مقارنة العنصر الجديد المُعاد مع العنصر السابق المُصيَّر. وعندما لا يكونان متطابقين ستُحدِّث React واجهة DOM. </p>\n<p>على الرغم من تحديث React لعُقَد DOM التي تغيّرت، فلا تزال إعادة التصيير تستغرق بعض الوقت. في العديد من الحالات لن تكون هذه مشكلة، ولكن إن كان البطء ملاحظًا فبإمكانك تسريع العملية عن طريق تجاوز تابع دورة حياة المُكوِّن <code class=\"gatsby-code-text\">shouldComponentUpdate</code> والذي يُطلَق قبل بدء عملية إعادة التصيير. يُعيد هذا التابع بشكل افتراضي القيمة <code class=\"gatsby-code-text\">true</code> وبذلك يترك لمكتبة React إنجاز التحديث:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token function\">shouldComponentUpdate</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">nextProps<span class=\"token punctuation\">,</span> nextState</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>إن كانت لديك بعض الحالات التي لا ينبغي فيها تحديث المُكوّن فبإمكانك إعادة القيمة <code class=\"gatsby-code-text\">false</code> من التابع <code class=\"gatsby-code-text\">shouldComponentUpdate</code> وذلك لتجاوز كامل عمليّة التصيير بما في ذلك التابع <code class=\"gatsby-code-text\">render()</code>‎ في هذا المُكوِّن والمُكوِّنات الأدنى منه. </p>\n<p>في معظم الحالات بدلًا من كتابة <code class=\"gatsby-code-text\">shouldComponentUpdate()</code>‎ بشكل يدوي بإمكانك وراثته من <a href=\"/docs/react-api.html#reactpurecomponent\"><code class=\"gatsby-code-text\">React.PureComponent</code></a>. يُكافِئ ذلك تنفيذ التابع <code class=\"gatsby-code-text\">shouldComponentUpdate()‎</code> مع مقارنة صغيرة للخاصيّات والحالة السّابقة مع الحاليّة. </p>\n<h2 id=\"shouldcomponentupdate-in-action\"><a href=\"#shouldcomponentupdate-in-action\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>مخطط لعمل التابع shouldComponentUpdate </h2>\n<p>تجد في الصورة التالية شجرة فرعية من المُكوّنات. تُشير <code class=\"gatsby-code-text\">SCU</code> بالنسبة لكل واحد إلى القيمة التي يجب أن يُعيدها التابع <code class=\"gatsby-code-text\">shouldComponentUpdate،</code> وتدلّنا <code class=\"gatsby-code-text\">vDOMEq</code> إن كانت عناصر React المُصيَّرة متطابقة. وأخيرًا يُشير لون الدائرة إن كان يجب إجراء مُطابَقة على المُكوِّن أم لا: </p>\n<figure>\n  <a class=\"gatsby-resp-image-link\" href=\"/static/5ee1bdf4779af06072a17b7a0654f6db/cd039/should-component-update.png\" style=\"display: block\" target=\"_blank\" rel=\"noopener\">\n  \n  <span class=\"gatsby-resp-image-wrapper\" style=\"position: relative; display: block;  max-width: 555px; margin-left: auto; margin-right: auto;\">\n    <span class=\"gatsby-resp-image-background-image\" style=\"padding-bottom: 66.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAADOklEQVQ4y1WTYWxTVRiGn3t72+12ZbZrCyvWMMHEiTMYCcZosiFK9BcqQsSkQafBkZkxZ+ZgW40drLNLYW50sG4lQLt1tkW3IKGMLLhYWKdzI7KAaAKYKLhgjAn/TPxx9NyB0y/5cs/9znve7z3nvAe3145npYut772AalKQsa1iNRWgzewLdOXefv3VC1AmnqjULgD1ikqw+mme+hgQ8GQdbGhnMRoGtrPdX8nJK0mTEEKWFLNZKwQs4kgUo2b3mgFNjmX+Eu0zzaPzDTAF/Aycv0fYmqyhKbqZz+eOLSz2uiWZKudEakgVf01TDVK62eOwWyXm5qEIt7EyA1wG5v9LeFGMcEvElKNfRjoyH/gqEYJNQB3g8/koKSkBRTGaXQqFONfSsnZ6f3tH4CUemQWb3NMZrwnxEGgUQzofUzsLBIP5iP/c4L7H24QgKH5XJPD2jXGD6EZnUBWZEfWPdIJsQ92aXMAfOm3XH56BpbXAZ6NtKjWgBIDEVDf3zkb8miadO8Dw7BDxmWPMXz2DmBjjWmdw4TheqbII8Sfit/OI8uWwuswi64nJg7ALVEkYn+jtGs71l09cP0lXptUZn+iNZOcyrlNXUnyViapz0RiX9ocDyabXdvrBnhrrWTd8tqf7TmGBc/TaKIdPhddHz4a6ihso0zucOsmp3sbsd+lVYz+m6P96r57M9+4enRxy5X7KcnHkiPrDQB9Xw6Ed37c0bbwJSxInmh89kT/8/qzLe1/28nGS0z0Vg5ORemrxmAOah/RcjE8+DRoX9NzWZwin/Gx5c5PxL7eTO9CofLt3D+PvvkwrUNu4me6knzqbzcB0pptJ5A8at6h9pMLp6+m2mubqBwG71aa7Sh9wuzVNWwrocsGHe+zsrllR1Lij8H4HOCy6pXTZcucyM0hMqavUIa2k8CJobSYYn43H+46HVgAmp9thBaQP5VeamfA6aF9D0c6NVPAWxRoUoBnNrHdTY8GnC3HnUPSLgV315VKhrVCXXV2AU875qqD6efBtwPLOs1S9UcljgM1sMjAS65YqgSX/Ek7Huj2Zo/1SjVLisCt3X4nRUSym9GWRkOoFrF98ucr/1P0TfwMynTKkr7evxAAAAABJRU5ErkJggg=='); background-size: cover; display: block;\">\n      <img class=\"gatsby-resp-image-image\" style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\" alt=\"should component update\" title=\"\" src=\"/static/5ee1bdf4779af06072a17b7a0654f6db/cd039/should-component-update.png\" srcset=\"/static/5ee1bdf4779af06072a17b7a0654f6db/65ed1/should-component-update.png 210w,\n/static/5ee1bdf4779af06072a17b7a0654f6db/d10fb/should-component-update.png 420w,\n/static/5ee1bdf4779af06072a17b7a0654f6db/cd039/should-component-update.png 555w\" sizes=\"(max-width: 555px) 100vw, 555px\">\n    </span>\n  </span>\n  \n  </a>\n    </figure>\n<p>بما أنّ التابع <code class=\"gatsby-code-text\">shouldComponentUpdate</code> أعاد القيمة <code class=\"gatsby-code-text\">false</code> من أجل الشجرة الفرعية التي جذرها هو C2، فلم تُحاول React تصيير C2، وبهذا لم يتوجّب أيضًا استدعاء <code class=\"gatsby-code-text\">shouldComponentUpdate</code> على C4 و C5. </p>\n<p>بالنسبة للجذر C1 و C3 أعاد التابع <code class=\"gatsby-code-text\">shouldComponentUpdate</code> القيمة <code class=\"gatsby-code-text\">true،</code> وبذلك توجّب على React النزول حتى الفروع والتحقّق منها. بالنسبة للجذر C6 أعاد التابع <code class=\"gatsby-code-text\">shouldComponentUpdate</code> القيمة <code class=\"gatsby-code-text\">true،</code> وبما أنّ العناصر المُصيَّرة لم تكن متطابقة فتوجَّب على React تحديث DOM. </p>\n<p>الحالة الأخيرة الهامّة هي الجذر C8. هنا يجب على React تصيير هذا المُكوّن، ولكن بما أنّ عناصر React التي أعادها كانت مطابقةً للعناصر المُصيَّرة سابقًا، فلم يجب عليها تحديث DOM. </p>\n<p>لاحظ أنّه وجبَ على React إجراء تعديلات على DOM من أجل الجذر C6 فقط، والتي لم يكن هناك مفرًّا منها. بالنسبة للجذر C8 أنقذت نفسها من التحديث عن طريق مُقارنة عناصر React المُصيَّرة، ومن أجل التفرّعات C2 و C7 لم يجب عليها حتى مقارنة العناصر حيث أوقفنا ذلك من خلال التابع <code class=\"gatsby-code-text\">shouldComponentUpdate</code> ولم يُستدعى التابع <code class=\"gatsby-code-text\">render</code>. </p>\n<h2 id=\"examples\"><a href=\"#examples\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>أمثلة </h2>\n<p> إن كانت الطريقة الوحيدة لتغيير المُكوِّن هي تغيير <code class=\"gatsby-code-text\">props.color</code> أو <code class=\"gatsby-code-text\">state.count</code>، فبإمكانك أن تدع التابع <code class=\"gatsby-code-text\">shouldComponentUpdate</code> يتحقّق من ذلك:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">CounterButton</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">React<span class=\"token punctuation\">.</span>Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">super</span><span class=\"token punctuation\">(</span>props<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token literal-property property\">count</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">shouldComponentUpdate</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">nextProps<span class=\"token punctuation\">,</span> nextState</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span>color <span class=\"token operator\">!==</span> nextProps<span class=\"token punctuation\">.</span>color<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">.</span>count <span class=\"token operator\">!==</span> nextState<span class=\"token punctuation\">.</span>count<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">return</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span>\n        <span class=\"token attr-name\">color</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span>color<span class=\"token punctuation\">}</span></span>\n        <span class=\"token attr-name\">onClick</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">setState</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">state</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token literal-property property\">count</span><span class=\"token operator\">:</span> state<span class=\"token punctuation\">.</span>count <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        Count: </span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">.</span>count<span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>في هذه الشيفرة يتحقّق التابع <code class=\"gatsby-code-text\">shouldComponentUpdate</code> إن كانت هناك أيّة تغييرات في <code class=\"gatsby-code-text\">props.color</code> أو <code class=\"gatsby-code-text\">state.count</code>. إن كانت قيمها لا تتغير فلن يُحدَّث المُكوِّن. إن أصبح مُكوِّنك أكثر تعقيدًا فيُمكنك إجراء مقارنة بين كافة حقول الخاصيّات <code class=\"gatsby-code-text\">props</code> والحالة <code class=\"gatsby-code-text\">state</code> لتحديد ما إذا كان ينبغي تحديث المُكوّن. طريقة المقارنة هذه شائعة بحيث تُزوّدنا React بمُساعِد لاستخدام هذا المنطق عن طريق الوراثة من الصّنف <code class=\"gatsby-code-text\">React.PureComponent</code>. لذلك الشيفرة التالية هي طريقة أبسط لتحقيق نفس الشيء:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">CounterButton</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">React<span class=\"token punctuation\">.</span>PureComponent</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">super</span><span class=\"token punctuation\">(</span>props<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token literal-property property\">count</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span>\n        <span class=\"token attr-name\">color</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span>color<span class=\"token punctuation\">}</span></span>\n        <span class=\"token attr-name\">onClick</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">setState</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">state</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token literal-property property\">count</span><span class=\"token operator\">:</span> state<span class=\"token punctuation\">.</span>count <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        Count: </span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">.</span>count<span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>في معظم الأوقات يُمكنك استخدام <code class=\"gatsby-code-text\">React.PureComponent</code> بدلًا من كتابة التابع <code class=\"gatsby-code-text\">shouldComponentUpdate</code> الخاص بك. يُجري هذا الصنف مقارنة بسيطة لذلك لا يُمكنك استخدامه إن كانت الخاصيّات والحالة مُعدَّلة بطريقة قد لا تلتقطها المقارنة البسيطة. </p>\n<p>قد يصبح ذلك مشكلة بالنسبة لنا عند استخدامه مع بنى البيانات الأكثر تعقيدًا، فمثلًا لنفترض أنّك تريد من المُكوِّن <code class=\"gatsby-code-text\">ListOfWords</code> تصيير قائمة من الكلمات المنفصلة بينها مع وجود مُكوّن أب يُدعى <code class=\"gatsby-code-text\">WordAdder</code> والذي يُتيح لنا الضغط على زر لإضافة كلمة للقائمة، لن تعمل هذه الشيفرة بشكلٍ صحيح:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">ListOfWords</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">React<span class=\"token punctuation\">.</span>PureComponent</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span>words<span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">','</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">WordAdder</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">React<span class=\"token punctuation\">.</span>Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">super</span><span class=\"token punctuation\">(</span>props<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">words</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'marklar'</span><span class=\"token punctuation\">]</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>handleClick <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">handleClick</span><span class=\"token punctuation\">.</span><span class=\"token function\">bind</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">handleClick</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// يسبب هذا المقطع خطأ</span>\n    <span class=\"token keyword\">const</span> words <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">.</span>words<span class=\"token punctuation\">;</span>\n    words<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token string\">'marklar'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">setState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token literal-property property\">words</span><span class=\"token operator\">:</span> words<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span> <span class=\"token attr-name\">onClick</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>handleClick<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">ListOfWords</span></span> <span class=\"token attr-name\">words</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">.</span>words<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>المشكلة هي قيام المُكوّن <code class=\"gatsby-code-text\">PureComponent</code> بمقارنة بسيطة بين القيم القديمة والجديدة لـ <code class=\"gatsby-code-text\">this.props.words</code>. وبما أنّ هذه الشيفرة تُعدِّل المصفوفة <code class=\"gatsby-code-text\">words</code> في التابع <code class=\"gatsby-code-text\">handleClick</code> الموجود في المُكوِّن <code class=\"gatsby-code-text\">WordAdder،</code> فستُعتبَر القيم القديمة والجديدة للمصفوفة <code class=\"gatsby-code-text\">this.props.words</code> متكافئة، على الرغم من أنّ الكلمات قد تغيّرت فعليًّا في المصفوفة، وبهذا لن يُحدَّث المُكوِّن <code class=\"gatsby-code-text\">ListOfWords</code> على الرغم من أنّه يمتلك كلمات جديدة يجب تصييرها. </p>\n<h2 id=\"the-power-of-not-mutating-data\"><a href=\"#the-power-of-not-mutating-data\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>قوة عدم تعديل البيانات </h2>\n<p> الطريقة الأبسط لتجاوز هذه المشكلة هي تجنّب تعديل القيم التي تستخدمها كخاصيّات أو حالة، فيُمكِن كتابة التابع <code class=\"gatsby-code-text\">handleClick</code> السّابع باستخدام <code class=\"gatsby-code-text\">concat</code> كما يلي:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token function\">handleClick</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">setState</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">state</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    <span class=\"token literal-property property\">words</span><span class=\"token operator\">:</span> state<span class=\"token punctuation\">.</span>words<span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token string\">'marklar'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>تدعم ES6 <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">صياغة النشر</a>  لأجل المصفوفات والذي يُسهِّل هذه العمليّة. إن كنت تستخدم Create React App فهذه الصياغة متوفرة بشكل افتراضي لديك:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token function\">handleClick</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">setState</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">state</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    <span class=\"token literal-property property\">words</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token operator\">...</span>state<span class=\"token punctuation\">.</span>words<span class=\"token punctuation\">,</span> <span class=\"token string\">'marklar'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>تستطيع أيضًا إعادة كتابة الشيفرة التي تُعدِّل الكائنات لتجنّب ذلك بطريقة مماثلة. فلنفترض مثلًا أنّنا لدينا كائن يُدعى <code class=\"gatsby-code-text\">colormap</code> ونريد كتابة دالة لتغيير قيمة <code class=\"gatsby-code-text\">colormap.right</code> لتكون <code class=\"gatsby-code-text\">'blue'</code>، فنكتب ما يلي:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">function</span> <span class=\"token function\">updateColorMap</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">colormap</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  colormap<span class=\"token punctuation\">.</span>right <span class=\"token operator\">=</span> <span class=\"token string\">'blue'</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>لكتابة ذلك بدون تعديل الكائن الأصلي نستخدم التابع <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Object.assign</a>:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">function</span> <span class=\"token function\">updateColorMap</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">colormap</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> Object<span class=\"token punctuation\">.</span><span class=\"token function\">assign</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> colormap<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span><span class=\"token literal-property property\">right</span><span class=\"token operator\">:</span> <span class=\"token string\">'blue'</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>يُعيد التابع  <code class=\"gatsby-code-text\">updateColorMap</code>  الآن كائنًا جديدًا بدلًا من تعديل القديم. <code class=\"gatsby-code-text\">Object.assign</code> موجودة في ES6 وتحتاج إلى polyfill.</p>\n<p><a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">خاصيّة نشر الكائن</a> تسهل تحديث الكائنات بدون تعديلها أيضًا:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">function</span> <span class=\"token function\">updateColorMap</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">colormap</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span><span class=\"token operator\">...</span>colormap<span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">right</span><span class=\"token operator\">:</span> <span class=\"token string\">'blue'</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>تم اصدار هذه الخاصية في JavaScript ES2018.</p>\n<p>إن كنتَ تستخدم Create React App فسيكون التابع <code class=\"gatsby-code-text\">Object.assign</code> وصيغة نشر الكائن متوفرة بشكلٍ افتراضي. </p>\n<p>من المكتبات الأخرى التي تساعد على استخدام البيانات غير القابلة للتعديل نجد <a href=\"https://github.com/mweststrate/immer\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Immer</a> و <a href=\"https://github.com/kolodny/immutability-helper\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">immutability-helper</a> تُزوِّدك بنى البيانات غير القابلة للتعديل بطريقة سهلة لتتبّع التغييرات على الكائنات.</p>","frontmatter":{"title":"تحسين الأداء","next":null,"prev":null},"fields":{"path":"content/docs/optimizing-performance.md","slug":"docs/optimizing-performance.html"}}},"pageContext":{"slug":"docs/optimizing-performance.html"}},"staticQueryHashes":[]}