এখানে আরও দৃ concrete় উদাহরণ।
আমি project০ টি ফাইল সহ একটি প্রকল্পে কাজ করছি। এটি চালানোর জন্য আমাদের কাছে 2 টি ভিন্ন পদ্ধতি রয়েছে।
সংক্ষিপ্ত সংস্করণ, 1 টি বড় ফাইল লোড করুন। (উৎপাদন)
সমস্ত 60 ফাইল লোড করুন (বিকাশ)
আমরা একটি লোডার ব্যবহার করছি সুতরাং ওয়েবপৃষ্ঠায় আমাদের কেবল একটি স্ক্রিপ্ট রয়েছে
<script src="loader.js"></script>
এটি মোড # 1 এ ডিফল্ট হয়েছে (একটি বৃহত সংযুক্ত ফাইল লোড হচ্ছে)। মোডে # 2 চালানোর জন্য (পৃথক ফাইল) আমরা কিছু পতাকা সেট করি। এটা কিছু হতে পারে। ক্যোয়ারী স্ট্রিংয়ের একটি কী। এই উদাহরণে আমরা কেবল এটি করি
<script>useDebugVersion = true;</script>
<script src="loader.js"></script>
loader.js দেখতে এরকম কিছু দেখাচ্ছে
if (useDebugVersion) {
injectScript("app.js");
injectScript("somelib.js");
injectScript("someotherlib.js");
injectScript("anotherlib.js");
... repeat for 60 files ...
} else {
injectScript("large-concatinated.js");
}
বিল্ড স্ক্রিপ্টটি কেবল একটি .sh ফাইল যা দেখতে এটির মতো দেখাচ্ছে
cat > large-concantinated.js app.js somelib.js someotherlib.js anotherlib.js
ইত্যাদি ...
যদি কোনও নতুন ফাইল যুক্ত হয় তবে আমরা সম্ভবত # 2 মোড ব্যবহার করব যেহেতু আমরা উন্নয়ন করছি আমাদের একটি অ্যাড করতে হবে injectScript("somenewfile.js") লোডার.জেজে লাইন যুক্ত করতে হবে
তারপরে উত্পাদনের জন্য পরে আমাদের বিল্ড স্ক্রিপ্টে কিছুnewfile.js যুক্ত করতে হবে। এমন একটি পদক্ষেপ যা আমরা প্রায়শই ভুলে যাই এবং তারপরে ত্রুটির বার্তা পাই।
এএমডি স্যুইচ করে আমাদের 2 টি ফাইল সম্পাদনা করতে হবে না। লোডার.জেএস এবং বিল্ড স্ক্রিপ্ট সিঙ্কে রাখার সমস্যা চলে যায়। ব্যবহার r.jsবা webpackএটি নির্মাণের জন্য কোডটি পড়তে পারেlarge-concantinated.js
এটি নির্ভরতাগুলির সাথেও মোকাবিলা করতে পারে, উদাহরণস্বরূপ আমাদের কাছে 2 টি ফাইল ছিল lib1.js এবং lib2.js এর মতো লোড হয়েছে
injectScript("lib1.js");
injectScript("lib2.js");
lib2 এর জন্য lib1 দরকার। এর ভিতরে কোড রয়েছে যা কিছু পছন্দ করে
lib1Api.installPlugin(...);
তবে ইনজেকশিত স্ক্রিপ্টগুলি অবিচ্ছিন্নভাবে লোড হওয়ার সাথে সাথে তারা সঠিক ক্রমে লোড নেওয়ার কোনও গ্যারান্টি নেই। এই 2 টি স্ক্রিপ্টগুলি এএমডি স্ক্রিপ্ট নয় তবে প্রয়োজনীয়.js ব্যবহার করে আমরা এটিকে তাদের নির্ভরতা বলতে পারি
require.config({
paths: {
lib1: './path/to/lib1',
lib2: './path/to/lib2',
},
shim: {
lib1: {
"exports": 'lib1Api',
},
lib2: {
"deps": ["lib1"],
},
}
});
আমি আমাদের মডিউলটি লাইব 1 ব্যবহার করি আমরা এটি করি
define(['lib1'], function(lib1Api) {
lib1Api.doSomething(...);
});
এখন প্রয়োজনীয়.js আমাদের জন্য স্ক্রিপ্টগুলি ইনজেক্ট করবে এবং lib1 লোড না হওয়া পর্যন্ত এটি lib2 ইনজেকশন দেবে না যেহেতু আমরা বলেছিলাম যে lib2 lib1 এর উপর নির্ভর করে। এটি আমাদের মডিউলটি শুরু করবে না যা lib1 ব্যবহার করে যতক্ষণ না lib2 এবং lib1 উভয়ই লোড হয়।
এটি উন্নয়নকে সুন্দর করে তোলে (কোনও বিল্ড স্টেপ নয়, লোডিং অর্ডার সম্পর্কে কোনও উদ্বেগজনক নয়) এবং এটি উত্পাদনকে সুন্দর করে তোলে (প্রতিটি স্ক্রিপ্ট যুক্ত করার জন্য একটি বিল্ড স্ক্রিপ্ট আপডেট করার দরকার নেই)।
একটি যুক্ত বোনাস হিসাবে আমরা পুরানো ব্রাউজারগুলির কোডের উপর বাবেল চালানোর জন্য ওয়েবপ্যাকের ব্যাবেল প্লাগিন ব্যবহার করতে পারি এবং আবার আমাদের সেই বিল্ড স্ক্রিপ্টটি বজায় রাখতে হবে না।
মনে রাখবেন যে যদি ক্রোম (আমাদের পছন্দসই ব্রাউজার) সমর্থন করা শুরু করে import জন্য আমরা সম্ভবত বিকাশের জন্য এটিতে যেতে চাই তবে এটি আসলে কিছুই পরিবর্তন করতে পারে না। আমরা এখনও একটি কনেকেটনেটেড ফাইল তৈরি করতে ওয়েবপ্যাকটি ব্যবহার করতে পারি এবং আমরা এটি সমস্ত ব্রাউজারের কোডের উপর দিয়ে চালাও করতে পারি।
এই সমস্ত কিছুই স্ক্রিপ্ট ট্যাগ ব্যবহার না করে এবং এএমডি ব্যবহার করে অর্জন করা হয়