মূল অংশে যান

JavaScript মিনিফাই করুন

বিল্ড টুলগুলো যে ধরনের মিনিফায়ার ব্যবহার করে, সেটিই চলছে এই পেজের ভেতরে। আধুনিক সিনট্যাক্স ও মডিউল বোঝে, আর আপনার সোর্স কখনো সংরক্ষণ করা হয় না।

  • কখনো সংরক্ষণ করা হয় না
  • কোনো লাইন নেই, অপেক্ষা নেই
  • সাইনআপ নেই, ওয়াটারমার্ক নেই
মিনিফায়েড

মিনিফাই করা JavaScript এখানে দেখা যাবে।

যেভাবে কাজ করে

1

আপনার JavaScript পেস্ট করুন

অথবা ফাইলটি এখানে ছাড়ুন। মডিউল, ক্লাস ও আধুনিক সিনট্যাক্স — সবই বোঝে।

2

অপশন বেছে নিন

লোকাল ভেরিয়েবলের নাম বদলানো, console কল বাদ দেওয়া, লাইসেন্স কমেন্ট রাখা — প্রতিটি আলাদা সুইচ।

3

কপি বা ডাউনলোড করুন

আগের ও পরের সাইজসহ।

নাম বদলানো, মুছে ফেলা, আর যাতে কখনো হাত দেওয়া যাবে না

তিনটি জিনিস ঘটে — কতটা সাশ্রয় হয় আর আপনাকে কতটা মূল্য দিতে হয়, সেই ক্রমে। হোয়াইটস্পেস ও কমেন্ট বাদ যায়, যার কোনো মূল্য নেই। অকেজো কোড (ডেড কোড) বাদ যায় — এমন ব্রাঞ্চ যা কখনো চলবে না, এমন ভেরিয়েবল যাতে মান দেওয়া হয় কিন্তু কখনো পড়া হয় না। আর লোকাল নামগুলো ছোট করা হয়, ফলে যত্ন করে রাখা calculateMonthlyTotal হয়ে যায় একটি মাত্র অক্ষর। সাশ্রয়ের বেশিরভাগ এই শেষটিতেই, আর এটিই আউটপুটকে পড়ার অযোগ্য করে তোলে — প্রকাশের জন্য ঠিক আছে, ডিবাগের জন্য অকেজো।

বাইরের জগৎ যেসব জিনিসকে নাম ধরে খোঁজে, সেগুলোর নাম বদলানো যায় না, আর এখানে ভুল করেই মিনিফায়ার কোড ভেঙে ফেলে। এক্সপোর্ট করা ফাংশন, স্ট্রিং হিসেবে অ্যাক্সেস করা অবজেক্ট প্রপার্টি, window দিয়ে পৌঁছানো যেকোনো কিছু, আর eval-এ ব্যবহৃত নাম — সবই অক্ষত থাকতে হবে, কারণ অন্য কোথাও কিছু একটা আপনার লেখা নাম ধরেই সেগুলো খুঁজছে। বিশেষ করে প্রপার্টিগুলো ডিফল্টভাবে অক্ষত রাখা হয়: user.emailAddress-এর নাম বদলালে যে মুহূর্তে অবজেক্টটি JSON-এ সিরিয়ালাইজ হবে বা আলাদাভাবে মিনিফাই করা কোড এটি পড়বে, তখনই সব ভেঙে যাবে।

একটি সোর্স ম্যাপ বা মূল ফাইল রেখে দিন। নাম হারিয়ে গেলে একজন আসল ব্যবহারকারীর কাছ থেকে আসা স্ট্যাক ট্রেস দেখাবে ফাংশন t-এর ৪৮,২১৩ নম্বর অক্ষরে ত্রুটি — যা থেকে কিছুই বোঝা যায় না। সোর্স ম্যাপ ডিবাগার ও এরর রিপোর্টিংয়ে মূল নাম ও লাইন নম্বর ফিরিয়ে আনে, আর এটি তৈরিতে কোনো খরচ নেই, কারণ এটি আলাদা ফাইল হিসেবে থাকে এবং শুধু কেউ ডেভেলপার টুলস খুললেই লোড হয়।

লাইসেন্স কমেন্ট ডিফল্টভাবে রাখা হয়, আর এটি পছন্দের ব্যাপার নয়, আইনি অবস্থান। প্রচুর ওপেন-সোর্স কোড উদার লাইসেন্সে দেওয়া হয় একটিমাত্র শর্তে — কপিরাইট নোটিশটি কোডের সঙ্গে থাকতে হবে; MIT ও BSD দুটোই তা স্পষ্ট বলে। থার্ড-পার্টি কোডসহ বান্ডল থেকে ওই কমেন্টগুলো মুছে দিলে যে লাইসেন্স আপনাকে কোডটি ব্যবহারের অনুমতি দিয়েছে, সেটিই ভঙ্গ হয়। এগুলোর আকার মাত্র কয়েকশো বাইট।

অন্য কিছু দরকার হলে

এই কাজ ব্রাউজারের ট্যাবে নয়, বিল্ডের মধ্যে হওয়া উচিত, আর আধুনিক বান্ডলার তা নিয়মিতভাবেই করে। esbuild --minify এবং Rollup বা Vite বিল্ডের সময় মিনিফাই করে, নিজে থেকেই সোর্স ম্যাপ তৈরি করে, আর — এর চেয়ে অনেক বেশি জরুরি — ট্রি শেকিং করে, অর্থাৎ আপনার ডিপেনডেন্সির যেসব এক্সপোর্ট আপনি কখনো ইমপোর্ট করেন না, সেগুলো বাদ দেয়। একটি বাস্তব অ্যাপ্লিকেশনে এতে যা সাশ্রয় হয়, তৈরি ফাইল মিনিফাই করে তার ধারেকাছেও যাওয়া যায় না।

অপটিমাইজ করার আগে মেপে দেখুন। বান্ডল অ্যানালাইজার সাধারণত দেখিয়ে দেয় যে ফাইলের বেশিরভাগ জুড়ে আছে একটিমাত্র বড় ডিপেনডেন্সি — একটি ডেট লাইব্রেরি, একটি আইকন সেট, একটি চার্টের জন্য পুরোটা টেনে আনা চার্টিং প্যাকেজ। সেটি বদলে ফেলা বা দরকারের সময় লোড (লেজি লোড) করা যেকোনো পরিমাণ মিনিফাইয়ের চেয়ে ভালো, আর কোড স্প্লিটিং — যাতে প্রতিটি পেজ শুধু দরকারি অংশটুকু লোড করে — দুটোর চেয়েই ভালো।

সাধারণ প্রশ্নোত্তর

আমার কোড কি কোথাও সংরক্ষণ করা হয়?

না, আর সোর্স কোডের ক্ষেত্রে এটাই আসল কথা। কিছুই সংরক্ষণ করা হয় না, কোনো সার্ভার কখনো এটি দেখে না। নিজেদের মালিকানাধীন সোর্স এমন কোনো অনলাইন মিনিফায়ারে পেস্ট করা, যা সেটি কোথাও পাঠিয়ে দেয়, আসলে তথ্য ফাঁস করা — সাইটটি ডেটা রাখা নিয়ে যা-ই বলুক। আর ঠিক এই কাজটিই মানুষ তাড়াহুড়োয় না ভেবে করে ফেলে।

এটি কি আমার বিল্ড টুলের মিনিফায়ারের মতোই?

প্রায় নিশ্চিতভাবেই হ্যাঁ। webpack, Rollup, Vite ও বেশিরভাগ বান্ডলার যে ধরনের মিনিফায়ার ব্যবহার করে, এটি সেটিই। পার্থক্য শুধু এটুকু যে এটি ইনস্টল করতে হয় না, এখানেই চলে।

এতে কি আমার কোডের কাজ বদলে যাবে?

যাওয়ার কথা নয়, আর এটি ধরে নেওয়া হয় না, যাচাই করা হয়: আমাদের টেস্ট একটি মডিউল মিনিফাই করে, মূল ও মিনিফাই করা দুটি ভার্সনই ইমপোর্ট করে চালায় এবং ফলাফল মিলিয়ে দেখে। যা বদলায়: লোকাল ভেরিয়েবলের নাম (আপনি বন্ধ না করলে), আগেই হিসাব করে ফেলা যায় এমন কনস্ট্যান্ট এক্সপ্রেশন, আর ডেড কোড। রানটাইমে কোনো ফাংশনের নাম বা Function.prototype.toString-এর ওপর নির্ভর করা যেকোনো কিছু ম্যাঙ্গলিংয়ে ভেঙে যেতে পারে — এর কোনোটির ওপর নির্ভর করলে ম্যাঙ্গলিং বন্ধ রাখুন।

“মডিউল হিসেবে পার্স করুন” মানে কী?

আপনার কোড ES মডিউল হিসেবে পার্স হবে, নাকি সাধারণ স্ক্রিপ্ট হিসেবে। মডিউলে import ও export ব্যবহার করা যায় এবং তা সবসময় strict মোডে চলে। এটি ডিফল্টভাবে চালু, কারণ বেশিরভাগ আধুনিক কোড এমনই; আপনার ফাইল যদি পুরোনো ধাঁচের স্ক্রিপ্ট হয়, যা “with” ব্যবহার করে বা non-strict আচরণের ওপর নির্ভর করে, তাহলে এটি বন্ধ করুন।

console কলগুলো কি বাদ দেওয়া উচিত?

প্রোডাকশনের জন্য সাধারণত হ্যাঁ — এগুলো বাড়তি ঝামেলা, আর ডেভেলপার টুলস খোলা যে কারও কাছে ভেতরের তথ্য ফাঁস করে দিতে পারে। এটি ডিফল্টভাবে বন্ধ, কারণ না বলা পর্যন্ত নিঃশব্দে কোড মুছে ফেলা কোনো টুলের কাজ নয়।

লাইসেন্স কমেন্ট কি রাখা হয়?

হ্যাঁ, ডিফল্টভাবে। /*! দিয়ে শুরু হওয়া কমেন্ট এবং @license বা @preserve থাকা কমেন্ট রাখা হয়, কারণ অন্য কারও MIT লাইসেন্সের লাইব্রেরি থেকে সেগুলো মুছে ফেলা লাইসেন্স লঙ্ঘন। সাধারণ কমেন্টগুলো সরিয়ে ফেলা হয়।

এটি কি সোর্স ম্যাপ তৈরি করতে পারে?

এই পেজে নয়। সোর্স ম্যাপ কাজে লাগে শুধু একটি নির্দিষ্ট URL-এ থাকা মূল ফাইলের পাশে, যা পেস্ট-আর-কপি ধরনের টুলের সঙ্গে খাপ খায় না — এর সঠিক জায়গা আপনার বিল্ড টুল।

সাইজের কোনো সীমা আছে?

নির্দিষ্ট কোনো সীমা নেই। কয়েক হাজার লাইন এক সেকেন্ডেরও অনেক কম সময়ে মিনিফাই হয়; খুব বড় বান্ডল করা ফাইলে বেশি সময় লাগে, কারণ কোনো নাম বদলানোর আগে পুরোটা পার্স করা হয়। পুরো প্রোডাকশন বান্ডল মিনিফাই করতে চাইলে আপনার বিল্ড টুলই ভালো জায়গা — এই পেজ একটি ফাইল বা দ্রুত যাচাইয়ের জন্য।

জেনে রাখুন: লোকাল ভেরিয়েবলের নাম বদলালে ফাইল ছোট হয়, কিন্তু আউটপুট পড়ার অযোগ্য হয়ে যায় — প্রকাশের জন্য ঠিক আছে, ডিবাগের জন্য অকেজো; তাই সোর্স ম্যাপ বা মূল ফাইলটি রেখে দিন। লাইসেন্স কমেন্ট ডিফল্টভাবে রাখা হয়, কারণ সেগুলো সরালে যে কোড ব্যবহারের অনুমতি আপনার আছে, তার লাইসেন্স ভঙ্গ হতে পারে।

এই টুলটি আপনার ওয়েবসাইটে যোগ করুন

যেকোনো ব্লগ, ক্লাসের পেজ বা হেল্প আর্টিকেলের জন্য ফ্রি। একটি স্নিপেট পেস্ট করলেই আপনার ভিজিটররা আপনার পেজেই এটি ব্যবহার করতে পারবেন।