Firebase JS SDK-এর মডুলার ডিজাইন আপনার অ্যাপ কীভাবে তৈরি করা হয় তার উপর অনেক বেশি নিয়ন্ত্রণ দেয়। এই নমনীয়তা আপনাকে নিজের প্ল্যাটফর্মের জন্য নির্ভরতা কাস্টমাইজ করতে এবং আপনার বান্ডেল সাইজ অপ্টিমাইজ করতে দেয়। এর জন্য আপনাকে সেইসব ফিচার সরিয়ে দিতে হবে যেগুলি আপনার প্রয়োজন নেই।
Auth লাইব্রেরি ইনিশিয়ালাইজ করার দুটি উপায় আছে: getAuth() ফাংশন এবং
initializeAuth() ফাংশন। প্রথমটি, getAuth(), আপনার অ্যাপকে Auth লাইব্রেরির
সব ফিচার ব্যবহার করার জন্য প্রয়োজনীয়
সবকিছু প্রদান করে। এর অসুবিধা হল, এটি এমন অনেক কোড নিয়ে আসে যা আপনার অ্যাপ হয়ত ব্যবহার করে না। এছাড়াও, এটি এমন কোডও নিয়ে আসতে পারে যা আপনার টার্গেট করা প্ল্যাটফর্মে কাজ করে না, যার ফলে সমস্যা হতে পারে। এইসব সমস্যা এড়াতে, আপনি
initializeAuth() ব্যবহার করতে পারেন, যা নির্ভরতা সংক্রান্ত ম্যাপ নেয়। getAuth()
ফাংশনটি নির্দিষ্ট করা সবকটি ডিপেন্ডেন্সি সহ initializeAuth()-কে কল করে।
উদাহরণস্বরূপ, ব্রাউজার এনভায়রনমেন্টে getAuth()-এর সমতুল্য কোড এখানে দেওয়া হল:
import {initializeAuth, browserLocalPersistence, browserPopupRedirectResolver, browserSessionPersistence, indexedDBLocalPersistence} from "firebase/auth";
import {initializeApp} from "firebase/app";
const app = initializeApp({/** Your app config */});
const auth = initializeAuth(app, {
persistence: [indexedDBLocalPersistence, browserLocalPersistence, browserSessionPersistence],
popupRedirectResolver: browserPopupRedirectResolver,
});
ডিপেন্ডেন্সি পছন্দমতো করে নেওয়া
সব অ্যাপ signInWithPopup বা signInWithRedirect ফাংশনের ফ্যামিলি ব্যবহার করে
না। অনেক অ্যাপের indexedDB-এর দেওয়া নমনীয়তা প্রয়োজন হবে না অথবা
indexedDB ও localStorage দু'টিই কাজ করে এমন সুবিধা প্রয়োজন হবে না, যদি একটি
উপলভ্য না থাকে। এইসব ক্ষেত্রে, ডিফল্ট getAuth()-এ অনেক
অব্যবহৃত কোড থাকে যা কোনও কারণ ছাড়াই বান্ডেলের সাইজ বাড়িয়ে দেয়। পরিবর্তে, এইসব অ্যাপ
তাদের ডিপেন্ডেন্সি কাস্টমাইজ করতে পারে। যেমন, আপনার অ্যাপ যদি শুধুমাত্র ইমেল লিঙ্ক
যাচাইকরণ ব্যবহার করে এবং localStorage যথেষ্ট হয় (কারণ আপনি ওয়েব বা
সার্ভিস ওয়ার্কার স্ক্রিপ্ট ব্যবহার করছেন না), তাহলে আপনি Auth
এইভাবে ইনিশিয়ালাইজ করে অনেক কোড ব্লোট সরিয়ে দিতে পারবেন:
import {initializeAuth, browserLocalPersistence} from "firebase/auth";
import {initializeApp} from "firebase/app";
const app = initializeApp({/** Your app config */});
const auth = initializeAuth(app, {
persistence: browserLocalPersistence,
// No popupRedirectResolver defined
});
এই কোডের মাধ্যমে, আপনি তিনটি বড় ডিপেন্ডেন্সি সরিয়ে দিয়েছেন যেগুলি আপনার অ্যাপের প্রয়োজন নেই। এর ফলে, আপনার ব্যবহারকারীরা যখনই আপনার সাইট ভিজিট করেন, তখন তারা যে পরিমাণ ব্যান্ডউইথ ব্যবহার করেন তা উল্লেখযোগ্যভাবে কমে যায়।
প্ল্যাটফর্ম-নির্দিষ্ট বিবেচনা
অনেক ক্ষেত্রে, ইনিশিয়ালাইজেশনের সময়
সমস্যা এড়াতে আপনাকে ম্যানুয়ালি Auth নির্ভরতা নির্ধারণ করতে হবে। getAuth() ফাংশন একটি নির্দিষ্ট
প্ল্যাটফর্মের উপর ভিত্তি করে কাজ করে। ডিফল্ট এন্ট্রি পয়েন্টের জন্য, এটি হল ব্রাউজার এনভায়রনমেন্ট এবং
Cordova এন্ট্রি পয়েন্টের জন্য, এটি হল Cordova এনভায়রনমেন্ট। কিন্তু কখনও কখনও আপনার নির্দিষ্ট অ্যাপ্লিকেশনের
প্রয়োজনীয়তা এইসব পূর্বানুমানের সাথে সাংঘর্ষিক হয়। ওয়েব ও সার্ভিস
ওয়ার্কার স্ক্রিপ্টের ক্ষেত্রে, যেমন, ডিফল্ট getAuth() ইমপ্লিমেন্টেশন এমন কোড
পুল করে যা window অবজেক্ট থেকে রিড করে, এর ফলে সমস্যা হবে। সেইসব
ক্ষেত্রে, আপনার নির্ভরতা কাস্টমাইজ করা প্রয়োজন। সার্ভিস ওয়ার্কার কনটেক্সটে Auth লাইব্রেরি
ইনিশিয়ালাইজ করার জন্য নিম্নলিখিত কোডটি উপযুক্ত:
import {initializeAuth, indexedDBLocalPersistence} from "firebase/auth";
import {initializeApp} from "firebase/app";
const app = initializeApp({/** Your app config */});
const auth = initializeAuth(app, {
persistence: indexedDBLocalPersistence,
// No popupRedirectResolver defined
});
এই কোডটি Auth-কে indexedDB পারসিস্টেন্স (যা
ওয়ার্কার কনটেক্সটে উপলভ্য) দিয়ে ইনিশিয়ালাইজ করতে এবং popupRedirectResolver ডিপেন্ডেন্সি বাদ দিতে নির্দেশ দেয়,
যা ধরে নেয় যে DOM কনটেক্সট উপলভ্য।
অন্যান্য কারণেও আপনি হয়ত নির্দিষ্ট কিছু
প্ল্যাটফর্মে ম্যানুয়ালি নির্ভরতা নির্ধারণ করতে পারেন। Auth ইনিশিয়ালাইজেশনে popupRedirectResolver ফিল্ডকে সংজ্ঞায়িত করার মাধ্যমে,
কিছু ক্ষেত্রে লাইব্রেরি ইনিশিয়ালাইজেশনের উপর অতিরিক্ত কাজ করবে। মোবাইল
ব্রাউজারে, লাইব্রেরি আপনার Auth
ডোমেনে আগে থেকেই একটি iframe অটোমেটিক খুলবে। বেশিরভাগ ব্যবহারকারীর জন্য অভিজ্ঞতা নিরবচ্ছিন্ন করতে এটি করা হয়, তবে অ্যাপ শুরু হওয়ার সাথে সাথেই অতিরিক্ত কোড লোড করার মাধ্যমে এটি পারফর্ম্যান্সকে প্রভাবিত করতে পারে। initializeAuth() ব্যবহার করে এবং
যেসব ফাংশনের browserPopupRedirectResolver নির্ভরতা প্রয়োজন সেগুলিতে
ম্যানুয়ালি পাস করে এই আচরণ এড়ানো যেতে পারে:
import {initializeAuth, browserLocalPersistence, browserPopupRedirectResolver, indexedDBLocalPersistence, signInWithRedirect, GoogleAuthProvider} from "firebase/auth";
import {initializeApp} from "firebase/app";
const app = initializeApp({/** Your app config */});
const auth = initializeAuth(app, {
persistence: [indexedDBLocalPersistence, browserLocalPersistence],
});
// Later
signInWithRedirect(auth, new GoogleAuthProvider(), browserPopupRedirectResolver);
আমরা যদি browserPopupRedirectResolver-এর ডিপেন্ডেন্সিতে
initializeAuth() প্রদান করে থাকি, তাহলে signInWithRedirect()-এ কল করার সময়
তৃতীয় প্যারামিটারটির প্রয়োজন হবে না। কিন্তু সেই নির্ভরতা সরাসরি
signInWithRedirect()-এ কল করার মাধ্যমে সরিয়ে দিলে, ইনিশিয়ালাইজেশনের
সময় পারফর্ম্যান্সের উপর যে প্রভাব পড়ে তা আর থাকে না। ডিপেন্ডেন্সি সরানোর সাথে সাথে কিছু ট্রেড-অফও করতে হয়, তবে গুরুত্বপূর্ণ বিষয় হল, লাইব্রেরি ম্যানুয়ালি ইনিশিয়ালাইজ করে আপনি
সেইসব ট্রেড-অফ সম্পর্কে সিদ্ধান্ত নিতে পারেন।
কাস্টম ইনিশিয়ালাইজেশন কখন ব্যবহার করতে হয়
সংক্ষেপে বলতে গেলে, কাস্টম ইনিশিয়ালাইজেশন আপনাকে Auth SDK-এর
ব্যবহারের উপর অনেক বেশি নিয়ন্ত্রণ দেয়। শুরু করার জন্য স্ট্যান্ডার্ড getAuth() ফাংশনটি ভালো
এবং এটি বেশিরভাগ ব্যবহারিক ক্ষেত্রে কাজে লাগে। বেশিরভাগ অ্যাপের ক্ষেত্রে, getAuth()-ই আপনার
প্রয়োজন হতে পারে। তবে, ম্যানুয়াল ডিপেন্ডেন্সি ম্যানেজমেন্টে পাল্টানোর (বা পাল্টানোর প্রয়োজন হওয়ার) অনেক কারণ থাকতে পারে:
- যেসব অ্যাপের ক্ষেত্রে বান্ডেল সাইজ ও লোড টাইম অত্যন্ত গুরুত্বপূর্ণ, সেখানে কাস্টম Auth ইনিশিয়ালাইজেশন সম্ভাব্যভাবে অনেক কিলোবাইট ডেটা কমিয়ে দিতে পারে। এছাড়াও, এটি প্রাথমিক লোড করার সময় কমিয়ে দিতে পারে, কারণ এটি নির্ভরতাগুলিকে ইনিশিয়ালাইজ করার সময়ের পরিবর্তে ব্যবহার করার সময় নিয়ে যায়।
- DOM-এর বাইরে (যেমন, ওয়েব ও সার্ভিস ওয়ার্কার) রান করে এমন কোডের ক্ষেত্রে,
initializeAuth()অবশ্যই ব্যবহার করতে হবে, তা না হলে সমস্যা হতে পারে।