راهنمای جامع درک و پیادهسازی پُلیفیلهای جاوااسکریپت، بررسی چالشهای سازگاری مرورگرها و قدرت تشخیص ویژگی برای مخاطبان جهانی.
پُلیفیلهای جاوااسکریپت: پر کردن شکاف سازگاری مرورگرها با تشخیص ویژگی
در چشمانداز همواره در حال تحول توسعه وب، تضمین یک تجربه کاربری یکپارچه در میان انبوهی از مرورگرها و دستگاهها یک چالش همیشگی است. در حالی که جاوااسکریپت مدرن ویژگیهای قدرتمند و سینتکس زیبایی ارائه میدهد، واقعیت وب حکم میکند که ما باید طیف متنوعی از محیطها را پوشش دهیم که برخی از آنها ممکن است به طور کامل از آخرین استانداردها پشتیبانی نکنند. اینجاست که پُلیفیلهای جاوااسکریپت وارد عمل میشوند. آنها به عنوان پلهای ضروری عمل میکنند و به توسعهدهندگان اجازه میدهند تا از ویژگیهای پیشرفته استفاده کنند و در عین حال سازگاری با مرورگرهای قدیمیتر یا با قابلیت کمتر را حفظ کنند. این پست به بررسی مفاهیم حیاتی پُلیفیلها، سازگاری مرورگرها، و عمل هوشمندانه تشخیص ویژگی میپردازد و چشماندازی جهانی برای توسعهدهندگان در سراسر جهان ارائه میدهد.
چالش همیشگی: سازگاری مرورگرها
اینترنت موزاییکی از دستگاهها، سیستمعاملها و نسخههای مرورگر است. از جدیدترین گوشیهای هوشمند پرچمدار گرفته تا کامپیوترهای رومیزی قدیمی، هر کدام موتور رندرینگ و مفسر جاوااسکریپت خاص خود را دارند. این ناهمگونی یک جنبه بنیادین وب است، اما مانع بزرگی برای توسعهدهندگانی است که به دنبال یک برنامه کاربردی یکنواخت و قابل اعتماد هستند.
چرا سازگاری مرورگر اینقدر مهم است؟
- تجربه کاربری (UX): وبسایت یا برنامهای که در مرورگرهای خاصی دچار مشکل میشود یا به درستی کار نمیکند، منجر به ناامیدی شده و میتواند کاربران را دور کند. برای مخاطبان جهانی، این میتواند به معنای از دست دادن بخشهای قابل توجهی از کاربران باشد.
- دسترسیپذیری: اطمینان از اینکه کاربران دارای معلولیت میتوانند به محتوای وب دسترسی داشته باشند و با آن تعامل کنند، یک ضرورت اخلاقی و اغلب قانونی است. بسیاری از ویژگیهای دسترسیپذیری به استانداردهای مدرن وب متکی هستند.
- برابری ویژگیها: کاربران انتظار عملکرد یکسانی را بدون توجه به مرورگری که انتخاب میکنند، دارند. مجموعههای ویژگی ناهماهنگ میتوانند منجر به سردرگمی و تصور کیفیت پایین شوند.
- دسترسی و سهم بازار: در حالی که کاربران جدیدترین مرورگرها در حال افزایش هستند، بخش قابل توجهی از جمعیت جهانی هنوز به دلیل محدودیتهای سختافزاری، سیاستهای شرکتی یا ترجیحات شخصی به نسخههای قدیمیتر تکیه میکنند. نادیده گرفتن این کاربران میتواند به معنای از دست دادن بازار قابل توجهی باشد.
استانداردهای وب در حال تغییر
توسعه استانداردهای وب، که توسط سازمانهایی مانند کنسرسیوم وب جهانی (W3C) و اکما اینترنشنال (برای ECMAScript) هدایت میشود، یک فرآیند مستمر است. ویژگیهای جدید پیشنهاد، استانداردسازی و سپس توسط فروشندگان مرورگر پیادهسازی میشوند. با این حال، این فرآیند نه آنی است و نه پذیرش آن یکنواخت است.
- تأخیر در پیادهسازی: حتی پس از استانداردسازی یک ویژگی، ممکن است ماهها یا حتی سالها طول بکشد تا به طور کامل در تمام مرورگرهای اصلی پیادهسازی و پایدار شود.
- پیادهسازیهای خاص فروشنده: گاهی اوقات، مرورگرها ممکن است ویژگیها را کمی متفاوت پیادهسازی کنند یا نسخههای آزمایشی را قبل از استانداردسازی رسمی معرفی کنند که منجر به مشکلات سازگاری ظریف میشود.
- مرورگرهای پایان عمر یافته: برخی از مرورگرهای قدیمیتر، در حالی که دیگر به طور فعال توسط فروشندگان خود پشتیبانی نمیشوند، ممکن است هنوز توسط بخشی از کاربران جهانی مورد استفاده قرار گیرند.
معرفی پُلیفیلهای جاوااسکریپت: مترجمان جهانی
در هسته خود، یک پُلیفیل جاوااسکریپت قطعه کدی است که عملکرد مدرن را در مرورگرهای قدیمیتری که به طور بومی از آن پشتیبانی نمیکنند، فراهم میکند. آن را به عنوان یک مترجم در نظر بگیرید که کد جاوااسکریپت مدرن شما را قادر میسازد تا به زبانی که توسط مرورگرهای قدیمیتر فهمیده میشود، «صحبت» کند.
پُلیفیل چیست؟
یک پُلیفیل اساساً اسکریپتی است که بررسی میکند آیا یک API وب یا ویژگی جاوااسکریپت خاص در دسترس است یا خیر. اگر نباشد، پُلیفیل آن ویژگی را تعریف میکند و رفتار آن را تا حد امکان نزدیک به استاندارد شبیهسازی میکند. این به توسعهدهندگان اجازه میدهد تا با استفاده از ویژگی جدید کد بنویسند، و پُلیفیل تضمین میکند که حتی زمانی که مرورگر به طور بومی از آن پشتیبانی نمیکند، کار کند.
پُلیفیلها چگونه کار میکنند؟
گردش کار معمول برای یک پُلیفیل شامل موارد زیر است:
- تشخیص ویژگی: پُلیفیل ابتدا بررسی میکند که آیا ویژگی مورد نظر (مثلاً، یک متد روی یک شیء داخلی، یک API سراسری جدید) در محیط فعلی وجود دارد یا خیر.
- تعریف شرطی: اگر ویژگی به عنوان ناموجود تشخیص داده شود، پُلیفیل آن را تعریف میکند. این ممکن است شامل ایجاد یک تابع جدید، گسترش یک پروتوتایپ موجود، یا تعریف یک شیء سراسری باشد.
- شبیهسازی رفتار: ویژگی تعریف شده در پُلیفیل با هدف تقلید از رفتار پیادهسازی بومی مطابق با استاندارد وب است.
مثالهای رایج از پُلیفیلها
بسیاری از ویژگیهای جاوااسکریپت که امروزه به طور گسترده استفاده میشوند، زمانی تنها از طریق پُلیفیلها در دسترس بودند:
- متدهای آرایه: ویژگیهایی مانند
Array.prototype.includes()،Array.prototype.find()وArray.prototype.flat()قبل از پشتیبانی بومی گسترده، کاندیداهای رایج برای پُلیفیلها بودند. - متدهای رشته:
String.prototype.startsWith()،String.prototype.endsWith()وString.prototype.repeat()نمونههای دیگری هستند. - پُلیفیلهای Promise: قبل از پشتیبانی بومی از Promise، کتابخانههایی مانند `es6-promise` برای مدیریت عملیات ناهمزمان به روشی ساختاریافتهتر ضروری بودند.
- Fetch API: API مدرن `fetch`، جایگزینی برای `XMLHttpRequest`، اغلب برای مرورگرهای قدیمیتر به پُلیفیل نیاز داشت.
- متدهای Object:
Object.assign()وObject.entries()ویژگیهای دیگری هستند که از پُلیفیلها بهرهمند شدند. - ویژگیهای ES6+: با انتشار نسخههای جدید ECMAScript (ES6, ES7, ES8, etc.)، ویژگیهایی مانند توابع پیکانی (arrow functions) (اگرچه اکنون به طور گسترده پشتیبانی میشوند)، لیترالهای قالب (template literals)، و تخصیص ساختارشکن (destructuring assignment) ممکن است برای APIهای خاص به ترنسپایلینگ (که مرتبط اما متمایز است) یا پُلیفیلها نیاز داشته باشند.
مزایای استفاده از پُلیفیلها
- دسترسی گستردهتر: به برنامه شما اجازه میدهد تا برای طیف وسیعتری از کاربران، صرف نظر از انتخاب مرورگرشان، به درستی عمل کند.
- توسعه مدرن: توسعهدهندگان را قادر میسازد تا از سینتکس و APIهای مدرن جاوااسکریپت بدون محدودیت بیش از حد توسط نگرانیهای سازگاری با نسخههای قدیمیتر استفاده کنند.
- تجربه کاربری بهبود یافته: تجربه یکپارچه و قابل پیشبینی را برای همه کاربران تضمین میکند.
- آیندهنگری (تا حدودی): با استفاده از ویژگیهای استاندارد و پُلیفیل کردن آنها، کد شما با تکامل مرورگرها سازگارتر میشود.
هنر تشخیص ویژگی
در حالی که پُلیفیلها قدرتمند هستند، بارگذاری کورکورانه آنها برای هر کاربر میتواند منجر به حجم اضافی غیرضروری کد و کاهش عملکرد شود، به خصوص برای کاربرانی که از مرورگرهای مدرن استفاده میکنند و از قبل پشتیبانی بومی دارند. اینجاست که تشخیص ویژگی اهمیت پیدا میکند.
تشخیص ویژگی چیست؟
تشخیص ویژگی تکنیکی است که برای تعیین اینکه آیا یک مرورگر یا محیط خاص از یک ویژگی یا API خاص پشتیبانی میکند یا خیر، استفاده میشود. به جای فرض قابلیتهای مرورگر بر اساس نام یا نسخه آن (که شکننده و مستعد خطا است و به آن browser sniffing میگویند)، تشخیص ویژگی مستقیماً وجود عملکرد مورد نظر را بررسی میکند.
چرا تشخیص ویژگی حیاتی است؟
- بهینهسازی عملکرد: فقط زمانی پُلیفیلها یا پیادهسازیهای جایگزین را بارگذاری کنید که واقعاً مورد نیاز باشند. این کار میزان جاوااسکریپتی که باید دانلود، تجزیه و اجرا شود را کاهش میدهد و منجر به زمان بارگذاری سریعتر میشود.
- استحکام: تشخیص ویژگی بسیار قابل اعتمادتر از browser sniffing است. Browser sniffing به رشتههای user agent متکی است که به راحتی میتوانند جعل یا گمراهکننده باشند. از سوی دیگر، تشخیص ویژگی، وجود و عملکرد واقعی ویژگی را بررسی میکند.
- قابلیت نگهداری: کدی که به تشخیص ویژگی متکی است، نگهداری آسانتری دارد زیرا به نسخههای خاص مرورگر یا ویژگیهای خاص فروشندگان وابسته نیست.
- تنزل تدریجی (Graceful Degradation): این امکان را فراهم میکند که یک تجربه کامل برای مرورگرهای مدرن ارائه شود و یک تجربه سادهتر، اما کاربردی، برای مرورگرهای قدیمیتر ارائه گردد.
تکنیکهای تشخیص ویژگی
رایجترین روش برای انجام تشخیص ویژگی در جاوااسکریپت، بررسی وجود خصوصیات یا متدها روی اشیاء مربوطه است.
۱. بررسی خصوصیات/متدهای شیء
این سادهترین و پرکاربردترین روش است. شما بررسی میکنید که آیا یک شیء دارای یک خصوصیت خاص است یا آیا پروتوتایپ یک شیء دارای یک متد خاص است.
مثال: تشخیص پشتیبانی ازArray.prototype.includes()
```javascript
if (Array.prototype.includes) {
// مرورگر به صورت بومی از Array.prototype.includes پشتیبانی میکند
console.log('Native includes() is supported!');
} else {
// مرورگر از Array.prototype.includes پشتیبانی نمیکند. یک پُلیفیل بارگذاری کنید.
console.log('Native includes() is NOT supported. Loading polyfill...');
// اسکریپت پُلیفیل includes خود را اینجا بارگذاری کنید
}
```
مثال: تشخیص پشتیبانی از Fetch API
```javascript
if (window.fetch) {
// مرورگر به صورت بومی از Fetch API پشتیبانی میکند
console.log('Fetch API is supported!');
} else {
// مرورگر از Fetch API پشتیبانی نمیکند. یک پُلیفیل بارگذاری کنید.
console.log('Fetch API is NOT supported. Loading polyfill...');
// اسکریپت پُلیفیل fetch خود را اینجا بارگذاری کنید
}
```
۲. بررسی وجود شیء
برای اشیاء سراسری یا APIهایی که متدهای اشیاء موجود نیستند.
مثال: تشخیص پشتیبانی از Promises ```javascript if (window.Promise) { // مرورگر به صورت بومی از Promises پشتیبانی میکند console.log('Promises are supported!'); } else { // مرورگر از Promises پشتیبانی نمیکند. یک پُلیفیل بارگذاری کنید. console.log('Promises are NOT supported. Loading polyfill...'); // اسکریپت پُلیفیل Promise خود را اینجا بارگذاری کنید } ```۳. استفاده از عملگر `typeof`
این به ویژه برای بررسی اینکه آیا یک متغیر یا تابع تعریف شده و دارای نوع خاصی است، مفید است.
مثال: بررسی اینکه آیا یک تابع تعریف شده است ```javascript if (typeof someFunction === 'function') { // someFunction تعریف شده و یک تابع است } else { // someFunction تعریف نشده یا یک تابع نیست } ```کتابخانههایی برای تشخیص ویژگی و پُلیفیلینگ
در حالی که میتوانید منطق تشخیص ویژگی و پُلیفیلهای خود را بنویسید، چندین کتابخانه این فرآیند را ساده میکنند:
- Modernizr: یک کتابخانه قدیمی و جامع برای تشخیص ویژگی. این کتابخانه مجموعهای از تستها را اجرا میکند و کلاسهای CSS را روی عنصر
<html>ارائه میدهد که نشان میدهد کدام ویژگیها پشتیبانی میشوند. همچنین میتواند پُلیفیلها را بر اساس ویژگیهای شناسایی شده بارگذاری کند. - Core-js: یک کتابخانه ماژولار قدرتمند که پُلیفیلهایی را برای طیف گستردهای از ویژگیهای ECMAScript و APIهای وب فراهم میکند. این کتابخانه بسیار قابل تنظیم است و به شما امکان میدهد فقط پُلیفیلهایی را که نیاز دارید، شامل کنید.
- Polyfill.io: سرویسی که به صورت پویا پُلیفیلها را بر اساس مرورگر کاربر و ویژگیهای شناسایی شده ارائه میدهد. این یک راه بسیار راحت برای اطمینان از سازگاری بدون مدیریت مستقیم کتابخانههای پُلیفیل است. شما به سادگی یک تگ اسکریپت را اضافه میکنید و سرویس بقیه کارها را انجام میدهد.
استراتژیهای پیادهسازی پُلیفیلها به صورت جهانی
هنگام ساخت برنامهها برای مخاطبان جهانی، یک استراتژی پُلیفیل خوب برای ایجاد تعادل بین سازگاری و عملکرد ضروری است.
۱. بارگذاری شرطی با تشخیص ویژگی (توصیه شده)
این قویترین و کارآمدترین رویکرد است. همانطور که قبلاً نشان داده شد، شما از تشخیص ویژگی برای تعیین اینکه آیا یک پُلیفیل قبل از بارگذاری آن ضروری است یا خیر، استفاده میکنید.
گردش کار مثال:- مجموعهای حداقلی از پُلیفیلهای اصلی را که برای عملکرد اولیه برنامه شما در قدیمیترین مرورگرها ضروری هستند، شامل کنید.
- برای ویژگیهای پیشرفتهتر، با استفاده از دستورات `if` بررسیها را پیادهسازی کنید.
- اگر یک ویژگی وجود نداشت، اسکریپت پُلیفیل مربوطه را به صورت پویا با استفاده از جاوااسکریپت بارگذاری کنید. این تضمین میکند که پُلیفیل فقط در صورت نیاز دانلود و اجرا میشود.
۲. استفاده از ابزار ساخت با ترنسپایلینگ و باندل کردن پُلیفیل
ابزارهای ساخت مدرن مانند Webpack، Rollup و Parcel، همراه با ترنسپایلرهایی مانند Babel، راهحلهای قدرتمندی ارائه میدهند.
- ترنسپایلینگ: Babel میتواند سینتکس مدرن جاوااسکریپت (ES6+) را به نسخههای قدیمیتر جاوااسکریپت (مثلاً ES5) که به طور گسترده پشتیبانی میشوند، تبدیل کند. این با پُلیفیل یکسان نیست؛ ترنسپایلینگ سینتکس را تبدیل میکند، نه APIهای گمشده را.
- پُلیفیلهای Babel: Babel همچنین میتواند به طور خودکار پُلیفیلها را برای ویژگیهای ECMAScript و APIهای وب گمشده تزریق کند. برای مثال، پریست `@babel/preset-env` میتواند برای هدف قرار دادن نسخههای خاص مرورگر پیکربندی شود و به طور خودکار پُلیفیلهای لازم را از کتابخانههایی مانند `core-js` شامل کند.
در پیکربندی Babel خود (مثلاً `.babelrc` یا `babel.config.js`)، ممکن است پریستها را مشخص کنید:
```json { "presets": [ [ "@babel/preset-env", { "useBuiltIns": "usage", "corejs": 3 } ] ] } ```گزینه `"useBuiltIns": "usage"` به Babel میگوید که به طور خودکار پُلیفیلها را از `core-js` فقط برای ویژگیهایی که واقعاً در کد شما استفاده میشوند و در مرورگرهای هدف تعریف شده در پیکربندی Webpack شما (مثلاً در `package.json`) وجود ندارند، شامل کند. این یک رویکرد بسیار کارآمد برای پروژههای بزرگ است.
۳. استفاده از یک سرویس پُلیفیل
همانطور که ذکر شد، سرویسهایی مانند Polyfill.io یک گزینه راحت هستند. آنها یک فایل جاوااسکریپت را متناسب با قابلیتهای مرورگر درخواستکننده ارائه میدهند.
چگونه کار میکند: شما یک تگ اسکریپت را در HTML خود قرار میدهید:
```html ```پارامتر `?features=default` به سرویس میگوید که مجموعهای از پُلیفیلهای رایج را شامل شود. شما همچنین میتوانید ویژگیهای خاصی را که نیاز دارید، مشخص کنید:
```html ```مزایا: پیادهسازی بسیار آسان، همیشه بهروز، حداقل نگهداری. معایب: به یک سرویس شخص ثالث متکی است (نقطه شکست یا تأخیر بالقوه)، کنترل کمتری بر روی اینکه کدام پُلیفیلها بارگذاری میشوند (مگر اینکه به صراحت مشخص شود)، و ممکن است اگر با دقت مشخص نشود، پُلیفیلهایی را برای ویژگیهایی که استفاده نمیکنید، بارگذاری کند.
۴. باندل کردن مجموعهای اصلی از پُلیفیلها
برای پروژههای کوچکتر یا سناریوهای خاص، ممکن است انتخاب کنید که مجموعهای منتخب از پُلیفیلهای ضروری را مستقیماً با کد برنامه خود باندل کنید. این امر نیازمند بررسی دقیق این است که کدام پُلیفیلها برای مخاطبان هدف شما واقعاً ضروری هستند.
مثال: اگر تحلیلگرها یا اجزای ضروری رابط کاربری شما به `Promise` و `fetch` نیاز دارند، میتوانید پُلیفیلهای مربوطه را در بالای باندل اصلی جاوااسکریپت خود قرار دهید.
ملاحظات برای مخاطبان جهانی
- تنوع دستگاهها: دستگاههای موبایل، به ویژه در بازارهای نوظهور، ممکن است سیستمعاملها و مرورگرهای قدیمیتری را اجرا کنند. این را در استراتژی تست و پُلیفیل خود لحاظ کنید.
- محدودیتهای پهنای باند: در مناطقی با دسترسی محدود به اینترنت، به حداقل رساندن حجم بارهای جاوااسکریپت حیاتی است. بارگذاری شرطی پُلیفیلها با تشخیص ویژگی در اینجا کلیدی است.
- ظرافتهای فرهنگی: در حالی که مستقیماً به پُلیفیلها مربوط نمیشود، به یاد داشته باشید که خود محتوای وب باید از نظر فرهنگی حساس باشد. این شامل بومیسازی، تصاویر مناسب و اجتناب از فرضیات است.
- پذیرش استانداردهای وب: در حالی که مرورگرهای اصلی به طور کلی در پذیرش استانداردها سریع هستند، برخی مناطق یا گروههای کاربری خاص ممکن است در بهروزرسانی مرورگرهای خود کندتر باشند.
بهترین شیوهها برای پُلیفیلینگ
برای استفاده مؤثر از پُلیفیلها و تشخیص ویژگی، به این بهترین شیوهها پایبند باشید:
- اولویتبندی تشخیص ویژگی: همیشه از تشخیص ویژگی به جای browser sniffing استفاده کنید.
- بارگذاری شرطی پُلیفیلها: هرگز همه پُلیفیلها را برای همه کاربران بارگذاری نکنید. از تشخیص ویژگی برای بارگذاری آنها فقط در صورت لزوم استفاده کنید.
- پُلیفیلها را بهروز نگه دارید: از منابع معتبر برای پُلیفیلها استفاده کنید (مثلاً `core-js`، پروژههای گیتهاب که به خوبی نگهداری میشوند) و آنها را بهروز نگه دارید تا از رفع اشکالات و بهبود عملکرد بهرهمند شوید.
- مراقب عملکرد باشید: بستههای بزرگ پُلیفیل میتوانند به طور قابل توجهی بر زمان بارگذاری تأثیر بگذارند. با این روشها بهینهسازی کنید:
- استفاده از کتابخانههای پُلیفیل ماژولار (مانند `core-js`) و وارد کردن تنها چیزی که نیاز دارید.
- استفاده از ابزارهای ساخت برای شامل کردن خودکار پُلیفیلها بر اساس مرورگرهای هدف شما.
- در نظر گرفتن یک سرویس پُلیفیل برای سادگی.
- تست کامل: برنامه خود را روی طیف وسیعی از مرورگرها، از جمله نسخههای قدیمیتر و دستگاههای شبیهسازی شده پایینرده، تست کنید تا اطمینان حاصل کنید که پُلیفیلهای شما طبق انتظار کار میکنند. ابزارها و سرویسهای تست مرورگر در اینجا بسیار ارزشمند هستند.
- استراتژی خود را مستند کنید: رویکرد خود را به سازگاری مرورگر و پُلیفیلینگ برای تیم توسعه خود به وضوح مستند کنید.
- تفاوت بین ترنسپایلینگ و پُلیفیلینگ را درک کنید: ترنسپایلینگ (مثلاً با Babel) سینتکس مدرن را به سینتکس قدیمیتر تبدیل میکند. پُلیفیلینگ APIها و عملکردهای گمشده را فراهم میکند. هر دو اغلب با هم استفاده میشوند.
آینده پُلیفیلها
با بلوغ استانداردهای وب و افزایش نرخ پذیرش مرورگرها، نیاز به برخی از پُلیفیلها ممکن است کاهش یابد. با این حال، اصول اساسی تضمین سازگاری مرورگر و بهرهگیری از تشخیص ویژگی همچنان حیاتی باقی خواهند ماند. حتی با پیشرفت وب، همیشه بخشی از کاربران وجود خواهند داشت که نمیتوانند یا نمیخواهند به آخرین فناوریها بهروزرسانی کنند.
روند به سمت راهحلهای پُلیفیلینگ کارآمدتر است، و ابزارهای ساخت نقش مهمی در بهینهسازی گنجاندن پُلیفیلها ایفا میکنند. سرویسهایی مانند Polyfill.io نیز راحتی را ارائه میدهند. در نهایت، هدف نوشتن جاوااسکریپت مدرن، کارآمد و قابل نگهداری است، در حالی که تجربهای یکپارچه برای هر کاربر، بدون توجه به اینکه در کجای جهان هستند یا از چه دستگاهی استفاده میکنند، تضمین شود.
نتیجهگیری
پُلیفیلهای جاوااسکریپت ابزارهای ضروری برای پیمایش پیچیدگیهای سازگاری بین مرورگرها هستند. هنگامی که با تشخیص ویژگی هوشمندانه ترکیب شوند، به توسعهدهندگان قدرت میدهند تا APIها و سینتکس مدرن وب را بپذیرند بدون اینکه دسترسی یا تجربه کاربری را قربانی کنند. با اتخاذ یک رویکرد استراتژیک برای پُلیفیلینگ، توسعهدهندگان میتوانند اطمینان حاصل کنند که برنامههایشان برای یک مخاطب واقعاً جهانی، قابل دسترس، کارآمد و لذتبخش است. به یاد داشته باشید که تشخیص ویژگی را در اولویت قرار دهید، برای عملکرد بهینهسازی کنید و به طور دقیق تست کنید تا وبی بسازید که برای همه فراگیر و قابل دسترس باشد.