توقف عن استيراد حزم JavaScript كاملة

كم مرة قمت باستيراد حزمة JavaScript كاملة في مشروع عندما كنت بحاجة فقط إلى استخدام ميزات قليلة جدًا من هذه الحزمة؟ ربما ستكون قادرًا على تذكر العديد من هذه الحالات.

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



تحتوي مكتبة Lodash على أكثر من 200 وظيفة. هذا يشير إلى أنها بالفعل قادرة على مساعدة المبرمج في حل الكثير من المشاكل. ولكن قد يحدث أنه من خلال استيراد المكتبة بأكملها ، سيتم استدعاء 4-5 وظائف فقط. هذا يقودنا إلى السؤال عن استصواب استيراد الحزمة بأكملها في حالة سيتم فيها استخدام 2-3 ٪ فقط من قدراتها. دعونا نفكر في كيفية التعامل مع هذا.

وظيفة لوداش


إحدى الميزات المفضلة لدي في مكتبة Lodash هي الميزة get. يسمح لك بتنظيم الوصول الآمن إلى الكائنات المتداخلة ويدعم استخدام القيم الافتراضية.

فيما يلي مثال على استخدام هذه الوظيفة:

const _ = require('lodash');

let employee1 = {
  name : "Jon",
  address : {
    street : "North Avenue",
    area : "DAC",
    zip : "87344",
    contact : [ 12444554, 9384847 ]
  },
  designation : "Manager"
};

let employee2 = {
  name : "Jake",
  designation : "Senior Manager"
};

function getHomeContact(employee) {
  return employee.address.contact;
}

getHomeContact(employee1); // [12444554, 9384847]
getHomeContact(employee2); // Uncaught TypeError: Cannot read property 'contact' of undefined

function getHomeContactWithLodash(employee) {
  return  _.get(employee, "address.contact", []);
}

getHomeContactWithLodash(employee1); // [12444554, 9384847]
getHomeContactWithLodash(employee2); // []

يسمح لك استخدام هذه الوظيفة بجعل الرمز أكثر نظافة من ذي قبل. هذا يساعد على تجنب الأخطاء بسبب حقيقة أنه عندما يتوقع صفيف فارغ ، لن تعود الوظيفة null. بفضل هذه الوظيفة ، لا يمكنك ، عن طريق الخطأ ، استدعاء طريقة mapعلى صفيف فارغ. يحمي من مشاكل أخرى.

دعنا نلقي نظرة على كيفية تأثير إدراج مكتبة Lodash في المشروع إذا كان من المخطط لاستخدام الوظيفة فقط على حجم الحزمة get. سيتم إجراء التجارب باستخدام مشروع رد فعل. سيتم تحليل حجم الحزمة قبل استيراد المكتبة وبعد الخيارات المختلفة لربطها بالمشروع.

حجم المشروع قبل استيراد المكتبة


نقوم بتحليل حجم ملفات المشروع قبل استيراد المكتبة.


حجم الملف قبل استخدام Lodash

الآن دعنا نلقي نظرة على عواقب عدة طرق لاستيراد مكتبة إلى مشروع.

حجم المشروع بعد استخدام طرق استيراد مكتبة مختلفة


▍1. الاستيراد التقليدي


يتعلق هذا باستيراد المكتبة بإحدى الطرق التقليدية التالية.

الأول:

import _ from ‘lodash’;

ثانيا:

const _ = require('lodash');

إليك كيفية تأثيرها على الحجم النهائي لملفات المشروع.


تغيير حجم ملفات المشروع عند استيراد حزمة كاملة

▍2. استيراد ES6


هنا ، مرة أخرى ، لدينا خياران.

الأول:

import { get } from 'lodash';

ثانيا:

const { get } = require('lodash');

دعونا نلقي نظرة على تأثير هذه الواردات على حجم ملفات المشروع.


أحجام الملفات عند استيراد دالة get باستخدام التخصيص المدمر

كما ترون ، أدى استخدام كلا النهجين السابقين إلى زيادة في أحجام الملفات بنحو 23 كيلوبايت. وهذه زيادة كبيرة جدًا ، خاصة بالنظر إلى أننا نتحدث عن استخدام وظيفة واحدة من المكتبة ، والتي تتضمن أكثر من 200 وظيفة. ونتيجة لذلك ، اتضح أن حجم الحزمة قد زاد بقدر ما يتوقع المرء أن يزداد إذا تم استخدام جميع هذه الوظائف الـ 200 في المشروع.

ربما 23 كيلوبايت ليس هذا الثمن الكبير لاستخدام الوظيفة الضرورية الوحيدة؟ لا ، هذا كثير جدا. 

هل هناك أي طريقة يمكنك من خلالها استيراد ما تحتاجه فقط في المشروع؟ نعم ، هناك مثل هذه الطريقة.

دعونا نحلل المجلد حيث يتم تخزين مواد Lodash.

للقيام بذلك ، ما عليك سوى السير على طول المسار node_modules/lodash. في هذا المجلد ، يمكنك العثور على العديد من الملفات التي يتم تخزين رمز الوظائف الفردية فيها. من بينها ، من السهل العثور على الملف get.jsالذي يوجد فيه رمز الوظيفة التي نهتم بها get. وهذا يعني أنه إذا كنا بحاجة إلى وظيفة فقط ، getيكفي استيراد هذا الملف فقط إلى المشروع. هذا يقودنا إلى الطريقة الثالثة للاستيراد.

▍3. استيراد ملف get.js من لوداش


هنا ، مرة أخرى ، تتوفر طريقتان.

الأول:

import get from 'lodash/get';

ثانيا:

const get = require('lodash/get');

ألق نظرة على تغيير حجم الحزمة.


أحجام الملفات عند استيراد ملف get.js

يمكن ملاحظة أنه نظرًا لاستيراد الملف فقط إلى المشروعget.js، فقد تمكنا من التخلص من أكثر من 20 كيلوبايت من التعليمات البرمجية غير الضرورية التي تدخل إلى الحزمة عند استخدام طرق أخرى. لكننا نتحدث عن حزمة واحدة فقط. يحتوي مشروع JavaScript النموذجي على الكثير من التبعيات. تخيل كيف يمكن أن يؤثر النهج الحذر في استيراد الحزم والتحكم المستمر في أحجام الحزم على الخادم أو مشروع العميل.

هل تدعم جميع الحزم نهج الاستيراد الانتقائي؟


لا ليس كل. يعتمد ذلك بشكل كامل على تنظيم ملفات الحزمة. ولكن ، لحسن الحظ ، يتم تنظيم معظم الحزم الشعبية الكبيرة إلى حد ما بحيث يسهل العمل معها لاستيراد انتقائي لقدراتها الفردية.

كيف تفعل نفس الشيء أثناء العمل مع مكتبات أخرى؟


تُعرف عملية إزالة التعليمات البرمجية غير المستخدمة باسم اهتزاز الشجرة. إذا كنت تحتاج ، على سبيل المثال ، إلى "هز الشجرة" في مكتبة Ant Design - ابحث في الإنترنت عن الكلمات "antd tree shaking". قد تجد مناقشة حول هذا الموضوع على StackOverflow أو على GitHub. بعد العثور على مثل هذه المناقشة - انظر من خلالها - من المحتمل جدًا أن شخصًا ما قد حل المهمة بالفعل أمامك.

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

مثال للاستيراد الأمثل باستخدام حزمة antd


قبل:

import { Menu} from 'antd';

بعد:

import Menu from 'antd/es/menu';
import 'antd/es/menu/style/css';

مثال للاستيراد الأمثل باستخدام حزمة واجهة المستخدم المادية


قبل:

import { Button } from '@material-ui/core';

بعد:

import Button from '@material-ui/core/Button';

مثال للاستيراد الأمثل باستخدام حزمة اللحظة


يبدو تحسين لحظة استيراد المكتبة أكثر تعقيدًا. لذلك ، إذا كنت بحاجة إليها ، فألق نظرة على المهمة التي أنشأتها في تعقب المهام بهذه المكتبة.

ملخص


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

وكيف تكافح في مشاريع جافا سكريبت الخاصة بك لاستيراد التعليمات البرمجية غير الضرورية؟


All Articles