এই কেস স্টাডিটি অনুসন্ধান করে যে কিউইক্স, একটি অলাভজনক সংস্থা, কীভাবে ব্যবহারকারীদের অফলাইন ব্যবহারের জন্য বৃহৎ ইন্টারনেট সংরক্ষণাগার ডাউনলোড এবং সংরক্ষণ করতে সক্ষম করতে প্রগতিশীল ওয়েব অ্যাপ প্রযুক্তি এবং ফাইল সিস্টেম অ্যাক্সেস API ব্যবহার করে। অরিজিন প্রাইভেট ফাইল সিস্টেম (OPFS) এর সাথে সম্পর্কিত কোডের প্রযুক্তিগত বাস্তবায়ন সম্পর্কে জানুন, Kiwix PWA-এর মধ্যে একটি নতুন ব্রাউজার বৈশিষ্ট্য যা ফাইল পরিচালনাকে উন্নত করে, অনুমতি প্রম্পট ছাড়াই সংরক্ষণাগারগুলিতে উন্নত অ্যাক্সেস প্রদান করে। নিবন্ধটি চ্যালেঞ্জগুলি নিয়ে আলোচনা করে এবং এই নতুন ফাইল সিস্টেমে সম্ভাব্য ভবিষ্যতের উন্নয়নগুলি হাইলাইট করে৷
কিউইক্স সম্পর্কে
ওয়েবের জন্মের 30 বছরেরও বেশি সময় পরে, আন্তর্জাতিক টেলিকমিউনিকেশন ইউনিয়ন অনুসারে বিশ্বের জনসংখ্যার এক তৃতীয়াংশ এখনও ইন্টারনেটে নির্ভরযোগ্য অ্যাক্সেসের জন্য অপেক্ষা করছে । এখানেই কি গল্পের শেষ? অবশ্যই না। সুইজারল্যান্ড-ভিত্তিক অলাভজনক Kiwix- এর লোকেরা ওপেন সোর্স অ্যাপ এবং বিষয়বস্তুর একটি ইকোসিস্টেম তৈরি করেছে যার লক্ষ্য সীমিত বা ইন্টারনেট অ্যাক্সেস নেই এমন লোকেদের কাছে জ্ঞান উপলব্ধ করা। তাদের ধারণা হল আপনি যদি সহজেই ইন্টারনেট অ্যাক্সেস করতে না পারেন, তাহলে কেউ আপনার জন্য মূল সংস্থানগুলি ডাউনলোড করতে পারে, কোথায় এবং কখন সংযোগ পাওয়া যায় এবং পরবর্তীতে অফলাইন ব্যবহারের জন্য সেগুলি স্থানীয়ভাবে সংরক্ষণ করতে পারে৷ অনেক অত্যাবশ্যক সাইট, যেমন উইকিপিডিয়া, প্রজেক্ট গুটেনবার্গ, স্ট্যাক এক্সচেঞ্জ, বা এমনকি TED টক, এখন উচ্চ-সংকুচিত আর্কাইভে রূপান্তরিত করা যেতে পারে, যাকে বলা হয় ZIM ফাইল, এবং কিউইক্স ব্রাউজার দ্বারা ফ্লাইতে পড়া যায়।
ZIM আর্কাইভগুলি অত্যন্ত দক্ষ Zstandard (ZSTD) কম্প্রেশন ব্যবহার করে (পুরনো সংস্করণগুলি XZ ব্যবহার করা হয়), বেশিরভাগই HTML, JavaScript এবং CSS সংরক্ষণের জন্য, যখন ছবিগুলি সাধারণত সংকুচিত WebP ফর্ম্যাটে রূপান্তরিত হয়। প্রতিটি ZIM একটি URL এবং একটি শিরোনাম সূচী অন্তর্ভুক্ত করে। কম্প্রেশন এখানে মুখ্য, কারণ ইংরেজিতে উইকিপিডিয়ার সম্পূর্ণটি (6.4 মিলিয়ন নিবন্ধ, এবং ছবি) ZIM ফর্ম্যাটে রূপান্তর করার পরে 97 GB তে সংকুচিত হয়, যা আপনি বুঝতে না পারেন যে সমস্ত মানুষের জ্ঞানের যোগফল এখন ফিট হতে পারে। একটি মিড-রেঞ্জ অ্যান্ড্রয়েড ফোনে। উইকিপিডিয়ার থিমযুক্ত সংস্করণগুলি যেমন গণিত, ওষুধ ইত্যাদি সহ অনেক ছোট সংস্থানও দেওয়া হয়।
কিউইক্স ডেস্কটপ (Windows/Linux/macOS) এর পাশাপাশি মোবাইল (iOS/Android) ব্যবহার লক্ষ্য করে দেশীয় অ্যাপের একটি পরিসর অফার করে। এই কেস স্টাডিটি, যাইহোক, প্রগ্রেসিভ ওয়েব অ্যাপ (PWA) এর উপর ফোকাস করবে যার লক্ষ্য একটি আধুনিক ব্রাউজার আছে এমন যেকোনো ডিভাইসের জন্য একটি সর্বজনীন এবং সহজ সমাধান।
আমরা একটি সার্বজনীন ওয়েব অ্যাপ তৈরির ক্ষেত্রে যে চ্যালেঞ্জগুলিকে সামনে আনতে হবে তা দেখব যা সম্পূর্ণ অফলাইনে বড় কন্টেন্ট আর্কাইভগুলিতে দ্রুত অ্যাক্সেস প্রদান করতে হবে এবং কিছু আধুনিক জাভাস্ক্রিপ্ট API, বিশেষ করে ফাইল সিস্টেম অ্যাক্সেস API এবং অরিজিন প্রাইভেট ফাইল সিস্টেম , যা উদ্ভাবনী এবং উত্তেজনাপূর্ণ প্রদান করে। সেই চ্যালেঞ্জগুলোর সমাধান।
অফলাইন ব্যবহারের জন্য একটি ওয়েব অ্যাপ?
কিউইক্স ব্যবহারকারীরা অনেকগুলি বিভিন্ন প্রয়োজনের একটি সারগ্রাহী দল, এবং কিউইক্সের ডিভাইস এবং অপারেটিং সিস্টেমগুলির উপর খুব কম বা কোনও নিয়ন্ত্রণ নেই যেগুলিতে তারা তাদের সামগ্রী অ্যাক্সেস করবে। এই ডিভাইসগুলির মধ্যে কিছু ধীর বা পুরানো হতে পারে, বিশেষ করে বিশ্বের নিম্ন আয়ের এলাকায়। যদিও Kiwix যতটা সম্ভব ব্যবহারের ক্ষেত্রে কভার করার চেষ্টা করে, সংস্থাটি এটিও বুঝতে পেরেছিল যে এটি যেকোনো ডিভাইসে সবচেয়ে সার্বজনীন সফ্টওয়্যার ব্যবহার করে আরও বেশি ব্যবহারকারীদের কাছে পৌঁছাতে পারে: ওয়েব ব্রাউজার। সুতরাং, অ্যাটউডের আইন দ্বারা অনুপ্রাণিত হয়ে, যা বলে যে যেকোন অ্যাপ্লিকেশন যা জাভাস্ক্রিপ্টে লেখা যেতে পারে, অবশেষে জাভাস্ক্রিপ্টে লেখা হবে , প্রায় 10 বছর আগে কিছু কিউইক্স ডেভস, কিউইক্স সফ্টওয়্যারটিকে C++ থেকে জাভাস্ক্রিপ্টে পোর্ট করার বিষয়ে সেট করেছিল।
Kiwix HTML5 নামে এই পোর্টের প্রথম সংস্করণটি ছিল বর্তমানে বিলুপ্ত ফায়ারফক্স ওএস এবং ব্রাউজার এক্সটেনশনের জন্য। এর মূল অংশে ছিল (এবং এটি) একটি C++ ডিকম্প্রেশন ইঞ্জিন (XZ এবং ZSTD) যা ASM.js এর মধ্যবর্তী জাভাস্ক্রিপ্ট ভাষায় সংকলিত হয়েছিল এবং পরে Wasm বা WebAssembly , Emscripten কম্পাইলার ব্যবহার করে। পরে কিউইক্স জেএস নামকরণ করা হয়, ব্রাউজার এক্সটেনশনগুলি এখনও সক্রিয়ভাবে বিকশিত হয়।
প্রগ্রেসিভ ওয়েব অ্যাপ (PWA) লিখুন। এই প্রযুক্তির সম্ভাবনা উপলব্ধি করে, কিউইক্স ডেভেলপাররা Kiwix JS-এর একটি ডেডিকেটেড PWA সংস্করণ তৈরি করেছে এবং OS ইন্টিগ্রেশন যোগ করার জন্য সেট করেছে যা অ্যাপটিকে নেটিভ-এর মতো ক্ষমতা প্রদান করতে দেয়, বিশেষ করে অফলাইন ব্যবহার, ইনস্টলেশন, ফাইল হ্যান্ডলিং এবং ফাইল সিস্টেম অ্যাক্সেস।
অফলাইন-প্রথম পিডব্লিউএগুলি অত্যন্ত লাইটওয়েট, এবং তাই এমন প্রেক্ষাপটের জন্য উপযুক্ত যেখানে মাঝে মাঝে বা ব্যয়বহুল মোবাইল ইন্টারনেট রয়েছে৷ এর পেছনের প্রযুক্তি হল সার্ভিস ওয়ার্কার এপিআই এবং সম্পর্কিত ক্যাশে এপিআই , যা কিউইক্স জেএস-এর উপর ভিত্তি করে সমস্ত অ্যাপ ব্যবহার করে। এই APIগুলি অ্যাপগুলিকে সার্ভার হিসাবে কাজ করার অনুমতি দেয়, দেখা হচ্ছে প্রধান নথি বা নিবন্ধ থেকে আনার অনুরোধগুলিকে বাধা দেয় এবং ZIM সংরক্ষণাগার থেকে একটি প্রতিক্রিয়া বের করতে এবং তৈরি করতে (JS) ব্যাকএন্ডে পুনঃনির্দেশিত করে৷
সঞ্চয়স্থান, সর্বত্র সঞ্চয়স্থান
ZIM আর্কাইভের বড় আকারের কারণে, সঞ্চয়স্থান এবং এটিতে অ্যাক্সেস, বিশেষ করে মোবাইল ডিভাইসে, সম্ভবত কিউইক্স বিকাশকারীদের জন্য সবচেয়ে বড় মাথাব্যথা। অনেক কিউইক্স ব্যবহারকারী পরবর্তীতে অফলাইন ব্যবহারের জন্য ইন্টারনেট উপলব্ধ থাকলে অ্যাপ-মধ্যস্থ সামগ্রী ডাউনলোড করেন। অন্যান্য ব্যবহারকারীরা টরেন্ট ব্যবহার করে একটি পিসিতে ডাউনলোড করে, এবং তারপরে একটি মোবাইল বা ট্যাবলেট ডিভাইসে স্থানান্তর করে এবং প্যাচি বা ব্যয়বহুল মোবাইল ইন্টারনেটের জায়গায় USB স্টিক বা পোর্টেবল হার্ড ড্রাইভে কিছু বিষয়বস্তু বিনিময় করে। নির্বিচারে ব্যবহারকারী-অ্যাক্সেসযোগ্য অবস্থান থেকে সামগ্রী অ্যাক্সেস করার এই সমস্ত উপায়গুলি কিউইক্স জেএস এবং কিউইক্স পিডব্লিউএ দ্বারা সমর্থিত হওয়া দরকার।
প্রাথমিকভাবে কিউইক্স জেএস-এর পক্ষে লো-মেমরির ডিভাইসেও শত শত GB (আমাদের ZIM সংরক্ষণাগারগুলির মধ্যে একটি হল 166 GB!) বিশাল আর্কাইভগুলি পড়া সম্ভব হয়েছিল, সেটি হল ফাইল API ৷ এই API সার্বজনীনভাবে যেকোনো ব্রাউজারে সমর্থিত, এমনকি খুব পুরানো ব্রাউজারেও , এবং তাই এটি সর্বজনীন ফলব্যাক হিসাবে কাজ করে, যখন নতুন API সমর্থিত হয় না। এটি কিউইক্সের ক্ষেত্রে HTML এ একটি input
উপাদান সংজ্ঞায়িত করার মতোই সহজ:
<input
type="file"
accept="application/octet-stream,.zim,.zimaa,.zimab,.zimac, ..."
value="Select folder with ZIM files"
id="archiveFilesLegacy"
multiple
/>
একবার নির্বাচিত হলে, ইনপুট উপাদানটি ফাইল অবজেক্টগুলিকে ধারণ করে যা মূলত মেটাডেটা স্টোরেজের অন্তর্নিহিত ডেটা উল্লেখ করে। টেকনিক্যালি, কিউইক্সের অবজেক্ট-ওরিয়েন্টেড ব্যাকএন্ড, বিশুদ্ধ ক্লায়েন্ট-সাইড জাভাস্ক্রিপ্টে লেখা, প্রয়োজন অনুসারে বড় আর্কাইভের ছোট স্লাইস পড়ে। যদি এই স্লাইসগুলিকে ডিকম্প্রেস করার প্রয়োজন হয়, ব্যাকএন্ড সেগুলিকে Wasm ডিকম্প্রেসারের কাছে পাঠায়, অনুরোধ করা হলে আরও স্লাইস পাওয়া যায়, যতক্ষণ না একটি সম্পূর্ণ ব্লব ডিকম্প্রেস করা হয় (সাধারণত একটি নিবন্ধ বা একটি সম্পদ)। এর মানে হল যে বড় আর্কাইভকে কখনই মেমরিতে পুরোপুরি পড়তে হবে না।
সার্বজনীন, ফাইল এপিআই-এর একটি ত্রুটি রয়েছে যা কিউইক্স জেএস অ্যাপগুলিকে নেটিভ অ্যাপের তুলনায় ক্লাঙ্কি এবং পুরানো ধাঁচের দেখায়: এটির জন্য ব্যবহারকারীকে ফাইল পিকার ব্যবহার করে সংরক্ষণাগার বাছাই করতে হবে, বা অ্যাপে একটি ফাইল টেনে আনতে হবে । , প্রতিবার অ্যাপটি চালু করার সময় , কারণ এই API এর সাথে, এক সেশন থেকে পরবর্তী সেশনে অ্যাক্সেসের অনুমতিগুলি চালিয়ে যাওয়ার কোনও উপায় নেই৷
এই দুর্বল ইউএক্স প্রশমিত করার জন্য, অনেক ডেভেলপারের মতো, কিউইক্স জেএস ডেভস প্রাথমিকভাবে ইলেক্ট্রন রুটে নেমেছিল। ইলেক্ট্রনজেএস হল একটি আশ্চর্যজনক কাঠামো যা নোড এপিআই ব্যবহার করে ফাইল সিস্টেমে সম্পূর্ণ অ্যাক্সেস সহ শক্তিশালী বৈশিষ্ট্য প্রদান করে। যাইহোক, এর কিছু সুপরিচিত ত্রুটি রয়েছে:
- এটি শুধুমাত্র ডেস্কটপ অপারেটিং সিস্টেমে চলে।
- এটি বড় এবং ভারী (70MB–100MB)।
প্রতিটি অ্যাপের সাথে ক্রোমিয়ামের একটি সম্পূর্ণ অনুলিপি অন্তর্ভুক্ত থাকার কারণে ইলেক্ট্রন অ্যাপের আকার, মিনিমাইজ করা এবং বান্ডিল করা PWA-এর জন্য শুধুমাত্র 5.1 MB- এর সাথে তুলনা করা হয়!
সুতরাং, কিউইক্স PWA ব্যবহারকারীদের জন্য পরিস্থিতি উন্নত করতে পারে এমন একটি উপায় ছিল?
উদ্ধারের জন্য ফাইল সিস্টেম অ্যাক্সেস API
2019 সালের দিকে, কিউইক্স একটি উদ্ভূত API সম্পর্কে সচেতন হয়ে ওঠে যা Chrome 78-এ একটি অরিজিন ট্রায়ালের মধ্য দিয়ে যাচ্ছিল, যাকে তখন নেটিভ ফাইল সিস্টেম API বলা হয়। এটি একটি ফাইল বা ফোল্ডারের জন্য একটি ফাইল হ্যান্ডেল পেতে এবং এটি একটি IndexedDB ডাটাবেসে সংরক্ষণ করার ক্ষমতার প্রতিশ্রুতি দেয়। গুরুত্বপূর্ণভাবে, এই হ্যান্ডেলটি অ্যাপ সেশনের মধ্যে টিকে থাকে, তাই অ্যাপটি পুনরায় চালু করার সময় ব্যবহারকারীকে আবার ফাইল বা ফোল্ডার বাছাই করতে বাধ্য করা হয় না (যদিও তাদের একটি দ্রুত অনুমতি প্রম্পটের উত্তর দিতে হবে)। এটি উৎপাদনে পৌঁছানোর সময়, এটি ফাইল সিস্টেম অ্যাক্সেস API হিসাবে পুনঃনামকরণ করা হয়েছিল, এবং মূল অংশগুলি WHATWG দ্বারা ফাইল সিস্টেম API (FSA) হিসাবে প্রমিত হয়েছিল।
সুতরাং, কিভাবে API এর ফাইল সিস্টেম অ্যাক্সেস অংশ কাজ করে? উল্লেখ্য কয়েকটি গুরুত্বপূর্ণ পয়েন্ট:
- এটি একটি অ্যাসিঙ্ক্রোনাস API (ওয়েব ওয়ার্কারদের বিশেষ ফাংশন ব্যতীত)।
- ফাইল বা ডিরেক্টরি বাছাইকারীদের একটি ব্যবহারকারীর অঙ্গভঙ্গি ক্যাপচার করে প্রোগ্রামেটিকভাবে চালু করতে হবে (একটি UI উপাদানে ক্লিক করুন বা আলতো চাপুন)।
- পূর্বে বাছাই করা ফাইল (একটি নতুন সেশনে) অ্যাক্সেস করার জন্য ব্যবহারকারীকে আবার অনুমতি দেওয়ার জন্য, একটি ব্যবহারকারীর অঙ্গভঙ্গিও প্রয়োজন—আসলে ব্রাউজার ব্যবহারকারীর অঙ্গভঙ্গি দ্বারা শুরু না হলে অনুমতি প্রম্পট দেখাতে অস্বীকার করবে।
কোডটি তুলনামূলকভাবে সহজবোধ্য, ফাইল এবং ডিরেক্টরি হ্যান্ডলগুলি সঞ্চয় করতে ক্লাঙ্কি ইনডেক্সডডিবি এপিআই ব্যবহার করা ছাড়াও। ভাল খবর হল যে কয়েকটি লাইব্রেরি রয়েছে যেগুলি আপনার জন্য অনেক ভারী কাজ করে, যেমন ব্রাউজার-এফএস-অ্যাক্সেস । Kiwix JS-এ আমরা সরাসরি API-এর সাথে কাজ করার সিদ্ধান্ত নিয়েছি, যেগুলো খুব ভালোভাবে নথিভুক্ত।
ফাইল এবং ডিরেক্টরি পিকার খোলা হচ্ছে
একটি ফাইল পিকার খোলার মত কিছু দেখায় (এখানে প্রতিশ্রুতি ব্যবহার করে, কিন্তু আপনি যদি চিনির async/await
করতে চান তবে ডেভেলপারদের জন্য Chrome টিউটোরিয়াল দেখুন):
return window
.showOpenFilePicker({ multiple: false })
.then(function (fileHandles) {
return processFileHandle(fileHandles[0]);
})
.catch(function (err) {
// This is normal if app is launching
console.warn(
'User cancelled, or cannot access fs without user gesture',
err,
);
});
মনে রাখবেন যে সরলতার জন্য, এই কোডটি শুধুমাত্র প্রথম বাছাই করা ফাইলটি প্রক্রিয়া করে (এবং একাধিক বাছাই করা নিষিদ্ধ)। আপনি যদি { multiple: true }
দিয়ে একাধিক ফাইল বাছাই করার অনুমতি দিতে চান, তাহলে আপনি কেবল সমস্ত প্রতিশ্রুতি মুড়ে ফেলুন যা প্রতিটি হ্যান্ডেলকে একটি Promise.all().then(...)
বিবৃতিতে প্রসেস করে, উদাহরণস্বরূপ:
let promisesForFiles = fileHandles.map(function (fileHandle) {
return processFileHandle(fileHandle);
});
return Promise.all(promisesForFiles).then(function (arrayOfFiles) {
// Do something with the files array
console.log(arrayOfFiles);
}).catch(function (err) {
// Handle any errors that occurred during processing
console.error('Error processing file handles!', err);
)};
যাইহোক, একাধিক ফাইল বাছাই করা যুক্তিযুক্তভাবে ব্যবহারকারীকে পৃথক ফাইলগুলির পরিবর্তে সেই ফাইলগুলি সম্বলিত ডিরেক্টরি বাছাই করতে বলার দ্বারা ভাল করা হয়, বিশেষত যেহেতু কিউইক্স ব্যবহারকারীরা তাদের সমস্ত ZIM ফাইল একই ডিরেক্টরিতে সংগঠিত করে। ডাইরেক্টরি পিকার চালু করার জন্য কোডটি প্রায় উপরের মতই একই যে আপনি window.showDirectoryPicker.then(function (dirHandle) { … });
.
ফাইল বা ডিরেক্টরি হ্যান্ডেল প্রক্রিয়া করা হচ্ছে
একবার আপনার হ্যান্ডেল হয়ে গেলে, আপনাকে এটি প্রক্রিয়া করতে হবে, তাই ফাংশন processFileHandle
দেখতে এইরকম হতে পারে:
function processFileHandle(fileHandle) {
// Serialize fileHandle to indexedDB
serializeFSHandletoIdxDB('pickedFSHandle', fileHandle, function (val) {
console.debug('IndexedDB responded with ' + val);
});
return fileHandle.getFile().then(function (file) {
// Do something with the file
return file;
});
}
মনে রাখবেন যে ফাইল হ্যান্ডেল সংরক্ষণ করার জন্য আপনাকে ফাংশন প্রদান করতে হবে , এর জন্য কোন সুবিধার পদ্ধতি নেই, যদি না আপনি একটি বিমূর্ত লাইব্রেরি ব্যবহার করেন। কিউইক্সের এটির বাস্তবায়ন cache.js
ফাইলে দেখা যায়, তবে এটি শুধুমাত্র একটি ফাইল বা ফোল্ডার হ্যান্ডেল সংরক্ষণ এবং পুনরুদ্ধার করার জন্য ব্যবহার করা হলে এটি যথেষ্ট সরলীকৃত হতে পারে।
ডাইরেক্টরি প্রসেসিং একটু বেশি জটিল কারণ আপনার পছন্দসই ফাইল বা ফাইলের ধরন খুঁজে পেতে আপনাকে async entries.next()
দিয়ে বাছাই করা ডিরেক্টরির এন্ট্রিগুলির মাধ্যমে পুনরাবৃত্তি করতে হবে। এটি করার বিভিন্ন উপায় রয়েছে, তবে এটি কিউইক্স পিডব্লিউএ-তে ব্যবহৃত কোড, রূপরেখায়:
let iterableEntryList = dirHandle.entries();
return iterateAsyncDirEntries(iterableEntryList, []).then(function (entryList) {
// Do something with the entry list
return entryList;
});
/**
* Iterates FileSystemDirectoryHandle iterator and adds entries to an array
* @param {Iterator} entries An asynchronous iterator of entries
* @param {Array} archives An array to which to add the entries (may be empty)
* @return {Promise<Array>} A Promise for an array of entries in the directory
*/
function iterateAsyncDirEntries(entries, archives) {
return entries
.next()
.then(function (result) {
if (!result.done) {
let entry = result.value[1];
// Filter for the files you want
if (/\.zim(\w\w)?$/i.test(entry.name)) {
archives.push(entry);
}
return iterateAsyncDirEntryArray(entries, archives);
} else {
// We've processed all the entries
if (!archives.length) {
console.warn('No archives found in the picked directory!');
}
return archives;
}
})
.catch(function (err) {
console.error('There was an error processing the directory!', err);
});
}
মনে রাখবেন যে entryList
এ প্রতিটি এন্ট্রির জন্য, আপনাকে পরে entry.getFile().then(function (file) { … })
দিয়ে ফাইলটি পেতে হবে যখন আপনি এটি ব্যবহার করতে হবে, অথবা const file = await entry.getFile()
একটি async function
।
আমরা কি আরও যেতে পারি?
অ্যাপের পরবর্তী লঞ্চের সময় ব্যবহারকারীর অঙ্গভঙ্গির মাধ্যমে অনুমতি দেওয়ার জন্য ব্যবহারকারীর প্রয়োজনীয়তা ফাইল এবং ফোল্ডার (পুনরায়) খোলার ক্ষেত্রে অল্প পরিমাণে ঘর্ষণ যোগ করে, তবে এটি একটি ফাইল পুনরায় বাছাই করতে বাধ্য হওয়ার চেয়ে অনেক বেশি তরল। . Chromium ডেভেলপাররা বর্তমানে এমন কোড চূড়ান্ত করছে যা ইনস্টল করা PWA-এর জন্য অবিরাম অনুমতি দেবে। এটি এমন কিছু যা অনেক পিডব্লিউএ ডেভেলপারদের জন্য আহ্বান করা হয়েছে, এবং গভীরভাবে প্রত্যাশিত।
কিন্তু যদি আমাদের অপেক্ষা করতে না হয়?! Kiwix devs সম্প্রতি খুঁজে পেয়েছে যে ফাইল অ্যাক্সেস API-এর একটি চকচকে নতুন বৈশিষ্ট্য ব্যবহার করে এখনই সমস্ত অনুমতি প্রম্পট মুছে ফেলা সম্ভব যা Chromium এবং Firefox উভয় ব্রাউজার দ্বারা সমর্থিত (এবং আংশিকভাবে Safari দ্বারা সমর্থিত, কিন্তু এখনও FileSystemWritableFileStream
অনুপস্থিত )। এই নতুন বৈশিষ্ট্যটি হল অরিজিন প্রাইভেট ফাইল সিস্টেম ।
সম্পূর্ণরূপে নেটিভ হচ্ছে: অরিজিন প্রাইভেট ফাইল সিস্টেম
অরিজিন প্রাইভেট ফাইল সিস্টেম (OPFS) এখনও কিউইক্স পিডব্লিউএ-তে একটি পরীক্ষামূলক বৈশিষ্ট্য, তবে দলটি ব্যবহারকারীদের এটি ব্যবহার করে দেখতে উত্সাহিত করতে সত্যিই উত্তেজিত কারণ এটি মূলত নেটিভ অ্যাপ এবং ওয়েব অ্যাপের মধ্যে ব্যবধান পূরণ করে। এখানে মূল সুবিধা রয়েছে:
- OPFS-এ আর্কাইভগুলিকে কোনো অনুমতি প্রম্পট ছাড়াই অ্যাক্সেস করা যেতে পারে, এমনকি লঞ্চের সময়ও৷ ব্যবহারকারীরা একটি নিবন্ধ পড়া আবার শুরু করতে পারেন, এবং একটি সংরক্ষণাগার ব্রাউজ করতে পারেন, যেখান থেকে তারা পূর্ববর্তী সেশনে ছেড়ে দিয়েছিলেন, একেবারে কোন ঘর্ষণ ছাড়াই৷
- এটি এতে সঞ্চিত ফাইলগুলিতে অত্যন্ত অপ্টিমাইজ করা অ্যাক্সেস প্রদান করে: অ্যান্ড্রয়েডে আমরা পাঁচ থেকে দশ গুণ দ্রুত গতির উন্নতি দেখতে পাই।
ফাইল এপিআই ব্যবহার করে অ্যান্ড্রয়েডে স্ট্যান্ডার্ড ফাইল অ্যাক্সেস বেদনাদায়কভাবে ধীর, বিশেষ করে (যেমনটি প্রায়শই কিউইক্স ব্যবহারকারীদের ক্ষেত্রে হয়) যদি বড় আর্কাইভগুলি ডিভাইস স্টোরেজের পরিবর্তে একটি মাইক্রোএসডি কার্ডে সংরক্ষণ করা হয়। এই নতুন API এর সাথে সমস্ত পরিবর্তন। যদিও বেশিরভাগ ব্যবহারকারী OPFS-এ একটি 97 GB ফাইল সংরক্ষণ করতে সক্ষম হবেন না (যা ডিভাইস স্টোরেজ ব্যবহার করে, মাইক্রোএসডি কার্ড স্টোরেজ নয়), এটি ছোট থেকে মাঝারি আকারের সংরক্ষণাগার সংরক্ষণের জন্য উপযুক্ত। আপনি WikiProject Medicine থেকে সবচেয়ে সম্পূর্ণ চিকিৎসা বিশ্বকোষ চান? কোন সমস্যা নেই, 1.7 GB এ এটি সহজেই OPFS এ ফিট হয়ে যায়! (টিপ: ইন-অ্যাপ লাইব্রেরিতে অন্যান্য → mdwiki_en_all_maxi সন্ধান করুন।)
কিভাবে OPFS কাজ করে
OPFS হল ব্রাউজার দ্বারা প্রদত্ত একটি ফাইল সিস্টেম, প্রতিটি মূলের জন্য আলাদা, যেটিকে Android-এ অ্যাপ-স্কোপড স্টোরেজের মতোই মনে করা যেতে পারে। ফাইলগুলি ব্যবহারকারী-দৃশ্যমান ফাইল সিস্টেম থেকে OPFS-এ আমদানি করা যেতে পারে, অথবা সেগুলি সরাসরি এতে ডাউনলোড করা যেতে পারে (এপিআইও OPFS-এ ফাইল তৈরি করার অনুমতি দেয়)। একবার OPFS এ, তারা বাকি ডিভাইস থেকে বিচ্ছিন্ন হয়। ডেস্কটপ ক্রোমিয়াম-ভিত্তিক ব্রাউজারগুলিতে, OPFS থেকে ব্যবহারকারী-দৃশ্যমান ফাইল সিস্টেমে ফাইলগুলি আবার রপ্তানি করাও সম্ভব।
OPFS ব্যবহার করার জন্য, প্রথম ধাপ হল navigator.storage.getDirectory()
ব্যবহার করে এটিতে অ্যাক্সেসের অনুরোধ করা (আবার, আপনি যদি await
কোডটি দেখতে চান, তাহলে The Origin Private File System পড়ুন):
return navigator.storage
.getDirectory()
.then(function (handle) {
return processDirHandle(handle);
})
.catch(function (err) {
console.warn('Unable to get the OPFS directory entry', err);
});
এটি থেকে আপনি যে হ্যান্ডেলটি পাবেন তা হল একই ধরণের FileSystemDirectoryHandle
যা আপনি উপরে উল্লিখিত window.showDirectoryPicker()
থেকে পান, যার অর্থ হল আপনি যে কোডটি পরিচালনা করে সেটি পুনরায় ব্যবহার করতে পারেন (এবং করুণার সাথে এটিকে indexedDB
এ সংরক্ষণ করার দরকার নেই – শুধু পান এটি যখন আপনার প্রয়োজন হয়)। ধরা যাক আপনার ইতিমধ্যেই OPFS-এ কিছু ফাইল রয়েছে এবং আপনি সেগুলি ব্যবহার করতে চান, তারপরে, পূর্বে দেখানো iterateAsyncDirEntries()
ফাংশনটি ব্যবহার করে, আপনি কিছু করতে পারেন:
return navigator.storage.getDirectory().then(function (dirHandle) {
let entries = dirHandle.entries();
return iterateAsyncDirEntries(entries, [])
.then(function (archiveList) {
return archiveList;
})
.catch(function (err) {
console.error('Unable to iterate OPFS entries', err);
});
});
আপনি archiveList
অ্যারে থেকে কাজ করতে চান এমন যেকোনো এন্ট্রিতে আপনাকে এখনও getFile()
ব্যবহার করতে হবে তা ভুলে যাবেন না।
OPFS-এ ফাইল আমদানি করা হচ্ছে
তাহলে, আপনি কীভাবে প্রথম স্থানে OPFS-এ ফাইল পাবেন? এত দ্রুত না! প্রথমত, আপনাকে যে পরিমাণ স্টোরেজের সাথে কাজ করতে হবে তা অনুমান করতে হবে এবং নিশ্চিত করুন যে ব্যবহারকারীরা 97 জিবি ফাইলটি ফিট না হলে এটি রাখার চেষ্টা করবেন না।
আনুমানিক কোটা পাওয়া সহজ: navigator.storage.estimate().then(function (estimate) { … });
. ব্যবহারকারীর কাছে এটি কীভাবে প্রদর্শন করা যায় তা একটু কঠিন কাজ করছে। কিউইক্স অ্যাপে, আমরা চেকবক্সের ঠিক পাশে দৃশ্যমান একটি ছোট ইন-অ্যাপ প্যানেল বেছে নিয়েছি যা ব্যবহারকারীদের OPFS ব্যবহার করে দেখতে দেয়:
প্যানেলটি estimate.quota
এবং estimate.usage
ব্যবহার করে জনবহুল করা হয়, উদাহরণস্বরূপ:
let OPFSQuota; // Global variable, so we don't have to keep checking it
return navigator.storage.estimate().then(function (estimate) {
const percent = ((estimate.usage / estimate.quota) * 100).toFixed(2);
OPFSQuota = estimate.quota - estimate.usage;
document.getElementById('OPFSQuota').innerHTML =
'<b>OPFS storage quota:</b><br />Used: <b>' +
percent +
'%</b>; ' +
'Remaining: <b>' +
(OPFSQuota / 1024 / 1024 / 1024).toFixed(2) +
' GB</b>';
});
আপনি দেখতে পাচ্ছেন, একটি বোতামও রয়েছে যা ব্যবহারকারীদের ব্যবহারকারী-দৃশ্যমান ফাইল সিস্টেম থেকে OPFS-এ ফাইল যোগ করতে দেয়। এখানে সুসংবাদটি হল যে আপনি প্রয়োজনীয় ফাইল অবজেক্ট (বা অবজেক্ট) যা আমদানি করতে যাচ্ছেন পেতে ফাইল API ব্যবহার করতে পারেন। আসলে, window.showOpenFilePicker()
ব্যবহার না করা গুরুত্বপূর্ণ কারণ এই পদ্ধতিটি ফায়ারফক্স দ্বারা সমর্থিত নয়, যেখানে OPFS নিশ্চিতভাবে সমর্থিত ।
উপরের স্ক্রিনশটে আপনি যে দৃশ্যমান ফাইল যোগ করুন বোতামটি দেখতে পাচ্ছেন সেটি কোনো লিগ্যাসি ফাইল পিকার নয়, তবে এটি click()
একটি লুকানো লিগ্যাসি পিকার ( <input type="file" multiple … />
উপাদান) ক্লিক করে। বা ট্যাপ অ্যাপটি তারপরে লুকানো ফাইল ইনপুটের change
ইভেন্টটি ক্যাপচার করে, ফাইলগুলির আকার পরীক্ষা করে এবং কোটার জন্য খুব বড় হলে সেগুলি প্রত্যাখ্যান করে। যদি সবকিছু ঠিক থাকে, ব্যবহারকারীকে জিজ্ঞাসা করুন যে তারা সেগুলি যোগ করতে চান কিনা:
archiveFilesLegacy.addEventListener('change', function (files) {
const filesArray = Array.from(files.target.files);
// Abort if user didn't select any files
if (filesArray.length === 0) return;
// Calculate the size of the picked files
let filesSize = 0;
filesArray.forEach(function (file) {
filesSize += file.size;
});
// Check the size of the files does not exceed the quota
if (filesSize > OPFSQuota) {
// Oh no, files are too big! Tell user...
console.log('Files would exceed the OPFS quota!');
} else {
// Ask user if they're sure... if user said yes...
return importOPFSEntries(filesArray)
.then(function () {
// Tell user we successfully imported the archives
})
.catch(function (err) {
// Tell user there was an error (error catching is important!)
});
}
});
কারণ কিছু অপারেটিং সিস্টেমে, যেমন অ্যান্ড্রয়েড, আর্কাইভ আমদানি করা দ্রুততম কাজ নয়, আর্কাইভগুলি আমদানি করার সময় কিউইক্স একটি ব্যানার এবং একটি ছোট স্পিনারও দেখায়৷ এই ক্রিয়াকলাপের জন্য কীভাবে একটি অগ্রগতি সূচক যুক্ত করা যায় তা নিয়ে দলটি কাজ করেনি: আপনি যদি এটি তৈরি করেন তবে দয়া করে একটি পোস্টকার্ডে উত্তর দিন!
তাহলে, কিউইক্স কিভাবে importOPFSEntries()
ফাংশন বাস্তবায়ন করেছে? এতে fileHandle.createWriteable()
পদ্ধতি ব্যবহার করা হয়, যা কার্যকরভাবে প্রতিটি ফাইলকে OPFS-এ স্ট্রিম করার অনুমতি দেয়। সমস্ত কঠোর পরিশ্রম ব্রাউজার দ্বারা পরিচালিত হয়। (কিউইক্স এখানে প্রতিশ্রুতি ব্যবহার করছে আমাদের লিগ্যাসি কোডবেসের সাথে কাজ করার কারণে, কিন্তু এটা বলতে হবে যে এই ক্ষেত্রে await
একটি সহজ সিনট্যাক্স তৈরি করে এবং ডুম ইফেক্টের পিরামিড এড়িয়ে যায়।)
function importOPFSEntries(files) {
// Get a handle on the OPFS directory
return navigator.storage
.getDirectory()
.then(function (dir) {
// Collect the promises for each file that we want to write
let promises = files.map(function (file) {
// Create the file and get a writeable handle on it
return dir
.getFileHandle(file.name, { create: true })
.then(function (fileHandle) {
// Get a writer for the file
return fileHandle.createWritable().then(function (writer) {
// Show a banner / spinner, then write the file
return writer
.write(file)
.then(function () {
// Finished with this writer
return writer.close();
})
.catch(function (err) {
console.error('There was an error writing to the OPFS!', err);
});
});
})
.catch(function (err) {
console.error('Unable to get file handle from OPFS!', err);
});
});
// Return a promise that resolves when all the files have been written
return Promise.all(promises);
})
.catch(function (err) {
console.error('Unable to get a handle on the OPFS directory!', err);
});
}
সরাসরি OPFS-এ একটি ফাইল স্ট্রিম ডাউনলোড করা হচ্ছে
এটির একটি ভিন্নতা হল ইন্টারনেট থেকে একটি ফাইল সরাসরি OPFS-এ বা যেকোনো ডিরেক্টরিতে স্ট্রিম করার ক্ষমতা যার জন্য আপনার একটি ডিরেক্টরি হ্যান্ডেল রয়েছে (অর্থাৎ window.showDirectoryPicker()
দিয়ে বাছাই করা ডিরেক্টরিগুলি)। এটি উপরের কোডের মতো একই নীতিগুলি ব্যবহার করে, তবে একটি ReadableStream
এবং একটি কন্ট্রোলার সমন্বিত একটি Response
তৈরি করে যা দূরবর্তী ফাইল থেকে পড়া বাইটগুলিকে সারিবদ্ধ করে। ফলে Response.body
তারপর OPFS-এর ভিতরে নতুন ফাইলের লেখকের কাছে পাইপ করা হয়।
এই ক্ষেত্রে, কিউইক্স ReadableStream
মধ্য দিয়ে যাওয়া বাইটগুলি গণনা করতে সক্ষম, এবং তাই ব্যবহারকারীকে একটি অগ্রগতি নির্দেশক প্রদান করে এবং ডাউনলোডের সময় অ্যাপটি ছেড়ে না দেওয়ার জন্য তাদের সতর্ক করে। কোডটি এখানে দেখানোর জন্য কিছুটা জটিল, কিন্তু আমাদের অ্যাপটি একটি FOSS অ্যাপ, আপনি যদি অনুরূপ কিছু করতে আগ্রহী হন তবে আপনি উত্সটি দেখতে পারেন। কিউইক্স UI দেখতে এইরকম (নীচে দেখানো বিভিন্ন অগ্রগতি মানগুলি কারণ এটি শুধুমাত্র ব্যানার আপডেট করে যখন শতাংশ পরিবর্তন হয়, তবে ডাউনলোড অগ্রগতি প্যানেলটি আরও নিয়মিত আপডেট করে):
যেহেতু ডাউনলোড করা বেশ দীর্ঘ অপারেশন হতে পারে, Kiwix ব্যবহারকারীদের অপারেশন চলাকালীন অ্যাপটি অবাধে ব্যবহার করার অনুমতি দেয়, তবে ব্যানারটি সর্বদা প্রদর্শিত হয় তা নিশ্চিত করে, যাতে ব্যবহারকারীদের ডাউনলোড অপারেশন সম্পূর্ণ না হওয়া পর্যন্ত অ্যাপটি বন্ধ না করার জন্য স্মরণ করিয়ে দেওয়া হয়।
একটি মিনি ফাইল ম্যানেজার ইন-অ্যাপ বাস্তবায়ন করা
এই মুহুর্তে, Kiwix PWA devs বুঝতে পেরেছে যে OPFS-এ ফাইল যোগ করতে সক্ষম হওয়া যথেষ্ট নয়। অ্যাপটিকে ব্যবহারকারীদের এই স্টোরেজ এলাকা থেকে তাদের আর প্রয়োজন নেই এমন ফাইলগুলি মুছে ফেলার একটি উপায় দিতে হবে এবং আদর্শভাবে, OPFS-এ লক করা ফাইলগুলিকে ব্যবহারকারী-দৃশ্যমান ফাইল সিস্টেমে রপ্তানি করার জন্যও। কার্যকরভাবে, অ্যাপের ভিতরে একটি মিনি ফাইল ম্যানেজমেন্ট সিস্টেম বাস্তবায়ন করা প্রয়োজন হয়ে পড়ে।
ক্রোমের জন্য দুর্দান্ত OPFS এক্সপ্লোরার এক্সটেনশনের জন্য একটি দ্রুত চিৎকার করুন (এটি এজেও কাজ করে)। এটি বিকাশকারী সরঞ্জামগুলিতে একটি ট্যাব যুক্ত করে যা আপনাকে OPFS-এ ঠিক কী আছে তা দেখতে দেয় এবং দুর্বৃত্ত বা ব্যর্থ ফাইলগুলি মুছতে দেয়৷ কোড কাজ করছে কিনা তা পরীক্ষা করা, ডাউনলোডের আচরণ পর্যবেক্ষণ করা এবং সাধারণত আমাদের উন্নয়ন পরীক্ষাগুলি পরিষ্কার করার জন্য এটি অমূল্য ছিল।
ফাইল রপ্তানি একটি বাছাই করা ফাইল বা ডিরেক্টরিতে একটি ফাইল হ্যান্ডেল পাওয়ার ক্ষমতার উপর নির্ভর করে যেখানে Kiwix রপ্তানি করা ফাইল সংরক্ষণ করতে যাচ্ছে, তাই এটি শুধুমাত্র সেই প্রেক্ষাপটে কাজ করে যেখানে এটি window.showSaveFilePicker()
পদ্ধতি ব্যবহার করতে পারে। যদি কিউইক্স ফাইলগুলি কয়েক গিগাবাইটের চেয়ে ছোট হয়, তাহলে আমরা মেমরিতে একটি ব্লব তৈরি করতে, এটিকে একটি URL দিতে এবং তারপর ব্যবহারকারীর-দৃশ্যমান ফাইল সিস্টেমে এটি ডাউনলোড করতে সক্ষম হতাম। দুর্ভাগ্যবশত, এত বড় আর্কাইভের সাথে এটি সম্ভব নয়। সমর্থিত হলে, রপ্তানি করা মোটামুটি সহজবোধ্য: কার্যত একই, বিপরীতভাবে, OPFS-এ একটি ফাইল সংরক্ষণ করার মতো (সংরক্ষিত করার জন্য ফাইলটিতে একটি হ্যান্ডেল পান, ব্যবহারকারীকে window.showSaveFilePicker()
এর মাধ্যমে এটি সংরক্ষণ করার জন্য একটি অবস্থান বেছে নিতে বলুন। , তারপর saveHandle
এ createWriteable()
ব্যবহার করুন)। আপনি রেপোতে কোডটি দেখতে পারেন।
ফাইল মুছে ফেলা সমস্ত ব্রাউজার দ্বারা সমর্থিত, এবং একটি সাধারণ dirHandle.removeEntry('filename')
দিয়ে অর্জন করা যেতে পারে। কিউইক্সের ক্ষেত্রে, আমরা উপরে যেমনটি করেছি, আমরা OPFS এন্ট্রিগুলিকে পুনরাবৃত্তি করতে পছন্দ করেছি, যাতে আমরা পরীক্ষা করতে পারি যে নির্বাচিত ফাইলটি আগে বিদ্যমান আছে এবং নিশ্চিতকরণের জন্য জিজ্ঞাসা করতে পারি, তবে এটি সবার জন্য প্রয়োজনীয় নাও হতে পারে। আবার, আপনি আগ্রহী হলে আমাদের কোড পরীক্ষা করতে পারেন।
এই বিকল্পগুলি অফার করা বোতামগুলির সাথে কিউইক্স UI-কে বিশৃঙ্খল না করার সিদ্ধান্ত নেওয়া হয়েছিল এবং এর পরিবর্তে সরাসরি সংরক্ষণাগার তালিকার নীচে ছোট আইকনগুলি স্থাপন করা হয়েছিল৷ এই আইকনগুলির একটিতে আলতো চাপলে সংরক্ষণাগার তালিকার রঙ পরিবর্তন হবে, ব্যবহারকারীরা কী করতে যাচ্ছেন সে সম্পর্কে একটি ভিজ্যুয়াল ক্লু হিসাবে। ব্যবহারকারী তারপর আর্কাইভগুলির একটিতে ক্লিক করে বা ট্যাপ করে এবং সংশ্লিষ্ট অপারেশন (রপ্তানি বা মুছে ফেলা) করা হয় (নিশ্চিতকরণের পরে)।
অবশেষে, উপরে আলোচনা করা সমস্ত ফাইল পরিচালনার বৈশিষ্ট্যগুলির একটি স্ক্রিনকাস্ট ডেমো রয়েছে— OPFS-এ একটি ফাইল যুক্ত করা , সরাসরি এতে একটি ফাইল ডাউনলোড করা , একটি ফাইল মুছে ফেলা এবং ব্যবহারকারীর দৃশ্যমান ফাইল সিস্টেমে রপ্তানি করা ।
একজন বিকাশকারীর কাজ কখনই সম্পন্ন হয় না
OPFS হল PWA-এর ডেভেলপারদের জন্য একটি দুর্দান্ত উদ্ভাবন, যা সত্যিই শক্তিশালী ফাইল ম্যানেজমেন্ট বৈশিষ্ট্যগুলি প্রদান করে যা নেটিভ অ্যাপ এবং ওয়েব অ্যাপের মধ্যে ব্যবধান বন্ধ করার দিকে অনেক দূর এগিয়ে যায়। কিন্তু ডেভেলপাররা একটি কৃপণ দল—তারা কখনই পুরোপুরি সন্তুষ্ট হয় না! OPFS প্রায় নিখুঁত, কিন্তু পুরোপুরি নয়... এটা দুর্দান্ত যে প্রধান বৈশিষ্ট্যগুলি ক্রোমিয়াম এবং ফায়ারফক্স উভয় ব্রাউজারেই কাজ করে এবং সেগুলি অ্যান্ড্রয়েডের পাশাপাশি ডেস্কটপে প্রয়োগ করা হয়৷ আমরা আশা করি সম্পূর্ণ বৈশিষ্ট্য সেটটি Safari এবং iOS-এও শীঘ্রই প্রয়োগ করা হবে। নিম্নলিখিত সমস্যাগুলি রয়ে গেছে:
- ফায়ারফক্স বর্তমানে OPFS কোটায় 10GB এর ক্যাপ রাখে, ডিস্কে যতই অন্তর্নিহিত স্থান থাকুক না কেন। যদিও বেশিরভাগ PWA লেখকদের জন্য এটি যথেষ্ট হতে পারে, কিউইক্সের জন্য, এটি বেশ সীমাবদ্ধ। সৌভাগ্যবশত, Chromium ব্রাউজারগুলি অনেক বেশি উদার।
- বর্তমানে OPFS থেকে মোবাইল ব্রাউজার বা ডেস্কটপ ফায়ারফক্সের ব্যবহারকারী-দৃশ্যমান ফাইল সিস্টেমে বড় ফাইল রপ্তানি করা সম্ভব নয়, কারণ
window.showSaveFilePicker()
প্রয়োগ করা হয়নি। এই ব্রাউজারগুলিতে, বড় ফাইলগুলি কার্যকরভাবে OPFS-এ আটকে থাকে। এটি বিষয়বস্তুতে উন্মুক্ত অ্যাক্সেসের কিউইক্স নীতির বিরুদ্ধে যায় এবং বিশেষ করে বিরতিহীন বা ব্যয়বহুল ইন্টারনেট সংযোগের ক্ষেত্রে ব্যবহারকারীদের মধ্যে সংরক্ষণাগারগুলি ভাগ করার ক্ষমতা। - OPFS ভার্চুয়াল ফাইল সিস্টেম কোন স্টোরেজ ব্যবহার করবে তা নিয়ন্ত্রণ করার কোনো ব্যবহারকারীর ক্ষমতা নেই। এটি বিশেষত মোবাইল ডিভাইসে সমস্যাযুক্ত, যেখানে ব্যবহারকারীদের একটি মাইক্রোএসডি কার্ডে প্রচুর পরিমাণে স্থান থাকতে পারে, তবে ডিভাইস স্টোরেজের খুব কম পরিমাণ।
কিন্তু সব মিলিয়ে, এগুলি ছোটখাটো সমস্যা যা অন্যথায় PWA-তে ফাইল অ্যাক্সেসের জন্য একটি বিশাল পদক্ষেপ। Kiwix PWA টিম Chromium ডেভেলপারদের এবং অ্যাডভোকেটদের কাছে অত্যন্ত কৃতজ্ঞ যারা প্রথমবার ফাইল সিস্টেম অ্যাক্সেস API-এর প্রস্তাব এবং ডিজাইন করেছিলেন এবং অরিজিন প্রাইভেট ফাইল সিস্টেমের গুরুত্ব সম্পর্কে ব্রাউজার বিক্রেতাদের মধ্যে ঐকমত্য অর্জনের কঠোর পরিশ্রমের জন্য। Kiwix JS PWA-এর জন্য, এটি অনেকগুলি UX সমস্যার সমাধান করেছে যা অতীতে অ্যাপটিকে আটকে রেখেছিল এবং প্রত্যেকের জন্য কিউইক্স সামগ্রীর অ্যাক্সেসযোগ্যতা বাড়ানোর জন্য আমাদের অনুসন্ধানে সাহায্য করে। অনুগ্রহ করে Kiwix PWA-কে একটি স্পিন দিন এবং ডেভেলপারদের বলুন আপনি কী ভাবছেন!
PWA ক্ষমতার উপর কিছু দুর্দান্ত সংস্থানের জন্য, এই সাইটগুলি দেখুন:
- প্রোজেক্ট ফুগু এপিআই শোকেস : ওয়েব অ্যাপের একটি সংগ্রহ যা নেটিভ অ্যাপ এবং পিডব্লিউএ-এর মধ্যে ব্যবধান বন্ধ করে এমন ক্ষমতা প্রদর্শন করে।
- PWA আজ কি করতে পারে : PWAs এর সাথে আজ কি সম্ভব তার একটি প্রদর্শনী।