Tree Shaking: یہ کیا ہے، مردہ کوڈ ہٹانے کا طریقہ کار اور اوزار

مصنف: IT Sectr اشاعت: 2026-05-18 مطالعے کا وقت: 8 منٹ

Tree Shaking — ایپلیکیشن بلڈ مرحلے پر غیر استعمال شدہ کوڈ کو ہٹانے (dead code elimination) کا ایک طریقہ کار ہے۔ Tree Shaking ES-ماڈیولز کی جامد ساخت کا تجزیہ کرتا ہے اور ان برآمد کردہ فنکشنز، کلاسز اور متغیرات کو خارج کرتا ہے جو کہیں بھی درآمد (import) نہیں کیے گئے ہیں۔ Webpack Documentation کے مطابق، Tree Shaking کی صحیح ترتیب ایپلیکیشن کی فعالیت کو تبدیل کیے بغیر بنڈل کے سائز کو 30–60% تک کم کر سکتی ہے۔

اہم نکات

  • Tree Shaking — import/export کے جامد تجزیہ کی بنیاد پر ES-ماڈیولز سے غیر استعمال شدہ برآمدات کا خاتمہ
  • ES-ماڈیولز (import/export) — واحد فارمیٹ جو Tree Shaking کو سپورٹ کرتا ہے؛ CommonJS سپورٹڈ نہیں ہے
  • Webpack اور Rollup — پلگ انز کے ذریعے Tree Shaking سپورٹ والے اہم بنڈلرز
  • Side effects — ماڈیولز میں ضمنی اثرات Tree Shaking کو روکتے ہیں؛ package.json میں sideEffects: false جھنڈا مسئلہ حل کرتا ہے
  • Used exports — درست مردہ کوڈ ہٹانے کے لیے Webpack کے پروڈکشن موڈ میں برآمدات کے استعمال کا تجزیہ

Tree Shaking کیا ہے؟

Tree Shaking ایک کوڈ اصلاحی تکنیک ہے جو حتمی بنڈل سے غیر استعمال شدہ ماڈیولز اور فنکشنز کو خارج کرتی ہے۔ یہ اصطلاح 2015 میں Rollup ٹیم نے متعارف کروائی تھی اور یہ عمل کو استعاراتی طور پر بیان کرتی ہے: انحصار کے درخت کو ہلایا (shake) جاتا ہے اور غیر استعمال شدہ شاخیں گر جاتی ہیں۔ دستی اصلاح کے برعکس، Tree Shaking بلڈ مرحلے پر خود بخود انجام دیا جاتا ہے۔

Tree Shaking صرف ES-ماڈیولز (ECMAScript Modules) کے ساتھ کام کرتا ہے، جہاں انحصار import اور export کے ذریعے جامد طور پر متعین کیا جاتا ہے۔ CommonJS (require/module.exports) Tree Shaking کو سپورٹ نہیں کرتا کیونکہ require متحرک طور پر انجام دیا جاتا ہے — بنڈلر پہلے سے طے نہیں کر سکتا کہ کون سے فنکشنز حقیقت میں استعمال ہوتے ہیں۔ جدید لائبریریاں (Lodash، Moment.js، RxJS) Tree Shaking کو سپورٹ کرنے کے لیے ES ورژن جاری کرتی ہیں۔

Rollup: Tree Shaking کا علمبردار

Rollup پہلا بنڈلر تھا جس نے 2015 میں Tree Shaking کو نافذ کیا۔ Webpack کے برعکس، Rollup شروع سے ES-ماڈیولز کے لیے ڈیزائن کیا گیا تھا اور یہ زیادہ جارحانہ مردہ کوڈ ہٹاتا ہے۔ Rollup نہ صرف انفرادی برآمدات بلکہ پورے ماڈیولز کا تجزیہ کرتا ہے: اگر کسی ماڈیول میں کوئی ضمنی اثر نہیں ہے اور کوئی برآمد استعمال نہیں کی گئی، تو Rollup پورے ماڈیول کو بنڈل سے خارج کر دیتا ہے۔

Rollup خاص طور پر لائبریریوں اور SDKs کے لیے مؤثر ہے جہاں ہر کلو بائٹ اہمیت رکھتا ہے۔ Vue.js فریم ورک اپنے پروڈکشن ورژن کی تعمیر کے لیے Rollup استعمال کرتا ہے۔ React 2020 میں Rollup پر منتقل ہوا۔ ایپلیکیشنز کے لیے، Webpack اپنے زیادہ وسیع پلگ ان ماحولیاتی نظام (Hot Module Replacement، code splitting، CSS modules) کی وجہ سے زیادہ عام طور پر استعمال ہوتا ہے، لیکن لائبریریاں بناتے وقت زیادہ سے زیادہ Tree Shaking کے لیے، Rollup صنعت کا معیار بنا ہوا ہے۔

Tree Shaking سے بچت کا انحصار پروجیکٹ کے فن تعمیر پر بہت زیادہ ہے۔ Ant Design لائبریری استعمال کرنے والی React ایپلیکیشن میں، Tree Shaking UI اجزاء کے 70% تک کوڈ کو ہٹا سکتا ہے۔ ایسے پروجیکٹ میں جہاں تمام import مخصوص اور ہدف شدہ ہوں، بچت 5–15% ہوگی۔ Webpack تحقیق کے مطابق، اوسط بچت بنڈل سائز کا 30–40% ہے۔

مردہ کوڈ کیا ہے

مردہ کوڈ کی قسممثالTree Shaking کا پتہ لگانا
غیر استعمال شدہ برآمدexport function unusedHelper()ہاں
غیر استعمال شدہ درآمدimport { unused } from "lib"ہاں
مردہ شرطی شاخif (false) { ... }نہیں (منیفائر ہٹاتا ہے)
DCE کے بعد غیر کال کردہ فنکشنfunction a(){} a() جہاں a کو کال نہیں کیا گیاجزوی طور پر

Tree Shaking کیسے کام کرتا ہے: ماڈیولز کا جامد تجزیہ

Tree Shaking کا طریقہ کار ایک انحصاری گراف پر مبنی ہے جسے بنڈلر پروجیکٹ میں تمام import/export بیانات سے بناتا ہے۔ پہلے مرحلے میں، بنڈلر اندراج نقطہ (entry point) سے تمام فائلوں کا سفر کرتا ہے اور ماڈیولز کا درخت جمع کرتا ہے۔ دوسرے مرحلے میں، یہ تجزیہ کرتا ہے کہ ہر ماڈیول سے کون سی برآمدات حقیقت میں دوسرے ماڈیولز میں درآمد کی گئی ہیں۔

ہر ماڈیول کے لیے، Webpack یا Rollup برآمدات کو استعمال شدہ یا غیر استعمال شدہ کے طور پر نشان زد کرتا ہے۔ غیر استعمال شدہ برآمدات بنڈل سے خارج کر دی جاتی ہیں۔ تاہم، ماڈیول خود بنڈل میں باقی رہتا ہے اگر اس کی کم از کم ایک برآمد استعمال ہو۔ ماڈیول کو صرف sideEffects جھنڈے کے ذریعے یا اگر ماڈیول میں کوئی ضمنی اثر نہ ہو تو مکمل طور پر خارج کیا جا سکتا ہے۔

مثال: Tree Shaking سے پہلے اور بعد

js
// utils.js — فنکشنز والا ماڈیول
export function formatDate(date) {
  return date.toISOString().slice(0, 10);
}

export function formatCurrency(amount) {
  return "$" + amount.toFixed(2);
}

export function slugify(text) {
  return text.toLowerCase().replace(/\s+/g, "-");
}
js
// app.js — اندراج نقطہ
import { formatDate } from "./utils";

const today = formatDate(new Date());
console.log(today);
js
// Tree Shaking کے بعد — بنڈل میں صرف formatDate
function formatDate(date) {
  return date.toISOString().slice(0, 10);
}
const today = formatDate(new Date());
console.log(today);

Tree Shaking نے app.js میں درآمد نہ ہونے کی وجہ سے formatCurrency اور slugify کو حتمی بنڈل سے خارج کر دیا۔ utils.js ماڈیول کا سائز 3 فنکشنز سے کم ہو کر 1 رہ گیا۔ اگر utils.js میں ضمنی اثرات ہوں (مثال کے طور پر، عالمی ابتدائیہ)، Tree Shaking غیر استعمال شدہ برآمدات کو بھی نہیں ہٹا سکتا۔

Webpack میں Tree Shaking: ترتیب اور اصلاح

Webpack پروڈکشن موڈ میں TerserPlugin کے ذریعے بلٹ ان Tree Shaking سپورٹ شامل کرتا ہے۔ Tree Shaking کو فعال کرنے کے لیے، دو شرائط کافی ہیں: mode کو production پر سیٹ کیا گیا ہو (mode: "production") اور ماڈیولز ES نحو (import/export) استعمال کریں۔ Webpack خود بخود غیر استعمال شدہ برآمدات کو نشان زد کرتا ہے اور ہٹانے کے لیے Terser کو بھیجتا ہے۔

optimization.webpack.config.js میں اضافی usedExports: true ترتیب ایک ماڈیول کے اندر برآمدات کے استعمال کا تفصیلی تجزیہ فعال کرتی ہے۔ یہ اختیار طے کرتا ہے کہ کون سی برآمدات حقیقت میں استعمال ہوتی ہیں اور کون سی صرف فراہم کی گئی ہیں (provided)۔ usedExports اور Terser کا امتزاج زیادہ سے زیادہ مردہ کوڈ ہٹانے کی کارکردگی دیتا ہے۔

Tree Shaking کے لیے Webpack ترتیب

js
// webpack.config.js — Tree Shaking ترتیب
module.exports = {
  mode: "production",
  entry: "./src/app.js",
  output: {
    filename: "bundle.js",
  },
  optimization: {
    usedExports: true,
    minimize: true,
    concatenateModules: true,
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules\/(?!(my-lib)\/).*/,
        use: {
          loader: "babel-loader",
          options: {
            presets: [
              ["@babel/preset-env", { modules: false }],
            ],
          },
        },
      },
    ],
  },
};

اہم پیرامیٹر @babel/preset-env میں modules: false ہے۔ ڈیفالٹ طور پر، Babel ES-ماڈیولز کو CommonJS میں تبدیل کرتا ہے، جو Tree Shaking کو ختم کر دیتا ہے۔ modules: false Babel کو import/export تبدیل کرنے سے روکتا ہے، Webpack کے لیے ES نحو کو محفوظ رکھتا ہے۔ concatenateModules اضافی طور پر ماڈیولز کو مشترکہ دائرہ کار میں ضم کرتا ہے، IIFE کی تعداد کم کرتا ہے اور بنڈل سائز گھٹاتا ہے۔

Side effects کا مسئلہ اور sideEffects جھنڈا

Side effects (ضمنی اثرات) — ماڈیول کے درآمد ہونے پر کیے جانے والے اعمال جو برآمد کردہ اقدار سے متعلق نہیں ہیں: عالمی اسٹائل (import "./styles.css")، polyfills (import "core-js/stable")، عالمی متغیرات کی ابتدا یا Service Worker رجسٹریشن۔ اگر کسی ماڈیول میں ضمنی اثرات ہیں، تو بنڈلر اسے بنڈل سے محفوظ طریقے سے نہیں ہٹا سکتا، چاہے اس کی کوئی بھی برآمد استعمال نہ کی گئی ہو۔

package.json میں sideEffects جھنڈا بنڈلر کو بتاتا ہے کہ پیکیج کے کن ماڈیولز میں کوئی ضمنی اثرات نہیں ہیں۔ ایک پیکیج کے لیے جہاں تمام ماڈیولز خالص ہیں (صرف فنکشن برآمدات)، آپ کو "sideEffects": false بتانا چاہیے۔ CSS یا polyfills والے پیکیج کے لیے — ضمنی اثرات والی فائلوں کے راستوں کی ایک صف: "sideEffects": ["*.css"]۔ اس جھنڈے کے بغیر، Tree Shaking غیر استعمال شدہ فنکشنز کو بھی نہیں ہٹائے گا۔

اپنے کوڈ میں ضمنی اثرات کی نشاندہی کیسے کریں

یہ جاننے کے لیے کہ آیا کسی ماڈیول میں ضمنی اثرات ہیں، یہ سوال پوچھیں: کیا یہ import اقدار برآمد کرنے سے غیر متعلق کوئی اقدامات کرے گا؟ import "./styles.css" DOM میں CSS شامل کرتا ہے — یہ ایک ضمنی اثر ہے۔ import { throttle } from "lodash-es" میں کوئی ضمنی اثرات نہیں ہیں — یہ صرف throttle فنکشن کو دستیاب کرتا ہے۔ Polyfills (import "core-js/stable") میں ضمنی اثرات ہیں — یہ عالمی پروٹوٹائپس میں ترمیم کرتے ہیں۔

اپنے ماڈیولز کے لیے، سفارش کی جاتی ہے: اسٹائل اور polyfills کو علیحدہ اندراج پوائنٹس میں نکالیں، خالص افادیت (بغیر ضمنی اثرات والے فنکشنز) کو ضمنی اثرات والے ماڈیولز (ابتداء، لاگنگ، Service Worker رجسٹریشن) سے الگ کریں۔ اوپری سطح کے پروجیکٹ package.json میں، صرف اس صورت میں "sideEffects": false بتائیں جب تمام ماڈیولز خالص ہوں۔ اگر اسٹائل ہیں، تو عین مطابق "sideEffects": ["*.css"] بتائیں۔

sideEffects ترتیب کی مثال

json
{
  "name": "my-ui-lib",
  "version": "2.1.0",
  "sideEffects": [
    "*.css",
    "polyfills.js"
  ],
  "module": "dist/index.esm.js",
  "main": "dist/index.cjs.js"
}

"sideEffects": ["*.css", "polyfills.js"] کا مطلب ہے: تمام CSS فائلوں کے ضمنی اثرات ہیں (انہیں نہیں ہٹایا جا سکتا) اور polyfills.js کے بھی ہیں۔ پیکیج کی دیگر تمام JS فائلیں خالص ہیں — انہیں محفوظ طریقے سے shake کیا جا سکتا ہے۔ module فیلڈ پیکیج کے ES ورژن کا راستہ بتاتا ہے جسے بنڈلر Tree Shaking کے لیے CommonJS ورژن (main) کی بجائے استعمال کرے۔

React Native اور Metro میں Tree Shaking

React Native Metro Bundler کے ساتھ Tree Shaking کے ایک محدود ورژن کو سپورٹ کرتا ہے۔ Metro Webpack کی طرح استعمال شدہ برآمدات (usedExports) کا مکمل جامد تجزیہ نہیں کرتا۔ اس کے بجائے، Metro منیفیکیشن کے دوران ماڈیولز کے غیر استعمال شدہ حصوں کو ہٹانے کے لیے Terser پر انحصار کرتا ہے۔ اس نقطہ نظر کی تاثیر Webpack میں مکمل Tree Shaking سے کم ہے۔

React Native پروجیکٹس کی زیادہ سے زیادہ اصلاح کے لیے، سفارش کی جاتی ہے: ES-ماڈیولز والی لائبریریاں استعمال کریں (package.json میں module فیلڈ)، ڈیبگ کوڈ ہٹانے کے لیے babel-plugin-transform-remove-console شامل کریں، اور Terser کے لیے Metro transformer.minifierConfig ترتیب دیں۔ اس کے علاوہ، Ram Bundle (بنڈل کو ماڈیولز میں تقسیم کرنا) غیر استعمال شدہ اسکرینوں کی لوڈنگ کو کم کرتا ہے۔

اکثر پوچھے جانے والے سوالات

Tree Shaking CommonJS کے ساتھ کیوں کام نہیں کرتا؟

CommonJS (require/module.exports) جامد تجزیہ کو سپورٹ نہیں کرتا — require کو شرائط اور فنکشنز کے اندر متحرک طور پر کال کیا جا سکتا ہے۔ بنڈلر طے نہیں کر سکتا کہ ماڈیول کے کون سے حصے حقیقت میں استعمال ہوتے ہیں۔ صرف جامد import/export والے ES-ماڈیولز Tree Shaking کی اجازت دیتے ہیں۔

کیا TypeScript کے ساتھ Tree Shaking استعمال کیا جا سکتا ہے؟

TypeScript Tree Shaking کے ساتھ مکمل طور پر مطابقت رکھتا ہے بشرطیکہ tsconfig.json ES-ماڈیولز کے لیے ترتیب دیا گیا ہو: "module": "esnext"۔ TypeScript مرتب کرنے والے کو import/export کو CommonJS میں تبدیل کیے بغیر محفوظ رکھنا چاہیے۔ @babel/preset-typescript اور modules: false والا Babel بھی ES-ماڈیولز کو Webpack میں درست طریقے سے منتقل کرتا ہے۔

کیسے چیک کریں کہ Tree Shaking نے کام کیا؟

Webpack Bundle Analyzer ایک پلگ ان ہے جو بنڈل کی ساخت کو ایک انٹرایکٹو ڈایاگرام کے طور پر دکھاتا ہے۔ اگر کوئی لائبریری بنڈل میں موجود ہے لیکن اس کے فنکشنز استعمال نہیں ہو رہے، تو Tree Shaking نے کام نہیں کیا۔ آپ آؤٹ پٹ فائل کا بھی تجزیہ کر سکتے ہیں: grep کے ذریعے بنڈل متن میں غیر استعمال شدہ برآمدات تلاش کریں۔

Lodash ڈیفالٹ طور پر tree-shake کیوں نہیں ہوتا؟

Lodash v4 ایک CommonJS پیکیج کے طور پر تقسیم کیا جاتا ہے۔ Tree Shaking کے لیے، آپ کو lodash-es — لائبریری کا ES ورژن — استعمال کرنا ہوگا۔ import throttle from "lodash/throttle" کو import { throttle } from "lodash-es" سے تبدیل کریں اور lodash کو lodash-es سے تبدیل کرنے کے لیے Webpack میں resolve.alias ترتیب دیں۔

کیا Tree Shaking بلڈ وقت کو متاثر کرتا ہے؟

Tree Shaking بلڈ وقت میں معمولی اضافہ کرتا ہے (5–15% تک) کیونکہ یہ انحصاری گراف تجزیہ اور استعمال شدہ برآمدات کو نشان زد کرنے کا مرحلہ شامل کرتا ہے۔ ڈیولپمنٹ موڈ میں، Tree Shaking عموماً رفتار کے لیے غیر فعال کیا جاتا ہے۔ پروڈکشن میں، اضافی وقت بنڈل سائز میں نمایاں کمی سے جائز ہے۔

خلاصہ

  • Tree Shaking — بلڈ وقت پر غیر استعمال شدہ ES برآمدات کا خودکار خاتمہ، بنڈل سائز 30–60% کم کرتا ہے
  • ES-ماڈیولز — واحد فارمیٹ جو جامد تجزیہ کو سپورٹ کرتا ہے؛ CommonJS Tree Shaking کے لیے موزوں نہیں ہے
  • Webpack اور Rollup پروڈکشن موڈ میں usedExports اور Terser کے ذریعے Tree Shaking فراہم کرتے ہیں
  • ضمنی اثرات ماڈیول ہٹانے کو روکتے ہیں؛ خالص لائبریریوں کے لیے package.json میں sideEffects: false جھنڈا مسئلہ حل کرتا ہے
  • Babel کو ES-ماڈیولز کو CommonJS میں تبدیل ہونے سے روکنے کے لیے modules: false کے ساتھ ترتیب دیا جانا چاہیے
  • React Native Metro میں محدود Tree Shaking ہے، منیفیکیشن مرحلے پر Terser پر انحصار کرتا ہے

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں