رابط الإضافة التلقائية (Auto-prefix URL) — تفصيل صغير يوفر دقائق من الوقت
يتعرف cutty.dev عندما تلصق عنواناً بدون https:// ويقوم بإضافته تلقائياً. قد يبدو الأمر بسيطاً، ولكن في الواقع، هذا هو الفرق بين استغراق ثانيتين وبين الاضطرار للنقر على 'حاول مرة أخرى'.
تكتب في نموذج allegro.pl. تضغط. وماذا بعد؟
في معظم أدوات تقصير الروابط، تظهر لك رسالة خطأ في هذه اللحظة. شيء من نوع "هذا ليس عنوان URL صحيحًا". لأن https:// غير موجودة في المقدمة. لذا تعود للخلف، وتضيف البروتوكول، وتنقر مرة أخرى، وفقط الآن تحصل على رابطك القصير.
cutty.dev لا يفعل ذلك. ببساطة يقوم بإضافة https:// ويستمر في العمل، وكأن شيئاً لم يكن.
أعلم كيف يبدو الأمر. كميزة لا تكاد تستحق فقرة، ناهيك عن تدوينة كاملة. ومع ذلك، أنا أجلس وأكتب عنها، لأن هذا التفصيل الصغير هو بالنسبة لي بمثابة بيان صغير حول طريقة تفكيري في بناء أداة auto-prefix URL وبقية هذه التسهيلات غير المرئية.
ثانيتان مقابل عشرون
لنقم بالحساب. حقاً، بالأرقام، لأن خلاف ذلك سيكون مجرد كلام.
المسار الأول: تقوم باللصق، تحصل على الرابط، تغلق النافذة. ثانيتان. ربما ثلاث.
المسار الثاني: تقوم باللصق، يحدث خطأ، تقرأ الرسالة (ثانية أو ثانيتان لفهم ما يحدث)، تضيف البروتوكول، تنقر مرة أخرى، وفقط الآن تضغط على الرابط. خمس عشرة، عشرون ثانية. بالإضافة إلى تلك اللحظة الصغيرة من الإحباط، ذلك الـ "آه صحيح، البروتوكول" الصامت، الذي لا يكلف شيئاً بمفرده، لكنه يتراكم.
والآن اضرب هذا في عدد المرات التي تقوم فيها بلصق عنوان ما في الشهر. بالنسبة لي، هي العشرات. وبالنسبة لشخص يدير الروابط بشكل احترافي — فهي المئات. فجأة، هذه التفصيلة "التي لا تكاد تستحق الذكر" تتراكم لتصبح دقائق شهرياً. لكل شخص.
هذه هي بالضبط تلك الحسابات التي يتجاهلها معظم الناس، لأن كل حالة فردية تبدو أصغر من أن تستحق الاهتمام.
ما الذي يوجد هناك في الواقع تحت السطح
الآلية بسيطة للغاية ولا أخفي ذلك على الإطلاق. تقوم بلصق النص في الحقل. قبل أن يُرسل أي شيء إلى الخادم، يتحقق جزء من JavaScript مما إذا كان ما كتبته يبدأ ببروتوكول معين — http:// ، https:// ، ftp:// ، mailto: ، أو أي شيء آخر. إذا لم يكن يبدأ به، يفترض النظام أنك تقصد نطاقاً عادياً ويقوم بإضافة https:// في المقدمة.
عملياً:
allegro.plتتحول إلىhttps://allegro.plgithub.com/twoj-profil/projektإلىhttps://github.com/twoj-profil/projektwww.gazeta.plإلىhttps://www.gazeta.pl
وإذا كان البروتوكول موجوداً بالفعل هناك، حتى لو كان غريباً، فإن النظام لا يقوم بالكتابة فوقه. بل يتركه ويستمر في التحقق مما يجب فعله حيال ذلك. http://example.com يمر (مسموح به). ftp://example.com يذهب إلى المهملات، لأننا نقبل فقط http و https. أما javascript:alert(1) فيتم استبعاده فوراً، لأنه ليس عنواناً، بل محاولة لحق شيء خبيث (XSS كلاسيكي، شكراً، لا نريد ذلك).
لماذا أملك هذا، بينما لا يملكه نصف السوق
هنا يصبح الأمر مثيراً للاهتمام، لأن الإجابة مضحكة قليلاً.
الطريقة القياسية للتحقق من صحة العنوان في المتصفح هي المُنشئ new URL(string). وهذا المُنشئ صارم. لا يتهاون. إذا لم يوجد بروتوكول — فإنه يرمي خطأً. new URL("allegro.pl") يعيد لك ببساطة TypeError وانتهى الأمر.
وتعرف ماذا؟ هذا هو السلوك الصحيح. بالنسبة للغالبية العظمى من التطبيقات، هذا هو بالضبط ما تريده. ولكن في نموذج تقصير الروابط، حيث يقوم الشخص بنسخ العنوان من شريط المتصفح أو من رسالة شخص ما، تتحول هذه الصرامة من ميزة إلى عقبة. فجأة، الأداة التي من المفترض أن توفر وقتك، تجبرك على تصحيح شيء تفهمه تماماً.
تجاوز هذا الأمر يتطلب حرفياً بضعة أسطر فقط:
function sanitizeUrl(input) {
const trimmed = input.trim();
const hasProtocol = /^[a-z][a-z0-9+.-]*:/i.test(trimmed);
const normalized = hasProtocol ? trimmed : "https://" + trimmed;
// dalej leci normalna walidacja przez new URL(normalized)
}
خمسة أسطر. بضع عشرات من الثواني أقل من الاحتكاك، يومياً، لكل من يقوم بلصق العناوين. صراحةً لا أعرف لماذا ليس هذا هو المعيار في كل مكان. أشك في أن الأمر يتعلق بأن "باني الـ URL يعمل ببساطة هكذا" ولم يرغب أحد في لمسه. إنه القصور الذاتي، وليس سوء النية.
ملاحظة جانبية صغيرة حول ما يعنيه مصطلح "بشكل قياسي"
لأن قصة new URL() هذه هي مثال رائع لشيء أوسع. الكثير من الأشياء التي تُعتبر في البرمجيات "هكذا يتم الأمر"، هي في الواقع "هكذا نتج عن الإعدادات الافتراضية لمكتبة ما لم يشكك فيها أحد". إن وضع الـ Strict mode للمنشئ ليس قراراً من مصممي cutty أو المنافسين — بل هو قرار مؤلفي مواصفات URL، الذي اتُّخذ في سياق مختلف تماماً، ولأغراض مختلفة تماماً.
وبعد ذلك، ترث السوق بأكملها هذا الخيار الافتراضي وتسميه "المعيار". لدي شعور بأن أفضل المنتجات تولد تماماً في تلك الأماكن التي يتوقف فيها شخص ما ويسأل: لحظة، هل هذا السلوك يخدم مستخدمي، أم يخدم مكتبتي فقط؟ في أغلب الأحيان تكون الإجابة: مكتبتي. وهنا يستحق الأمر الانتقال إلى جانب الإنسان بخمسة أسطر فقط.
هناك من التفاصيل أكثر مما يبدو عليه الأمر
Auto-prefix هو مجرد واحد من العديد من العناصر التي لن تجدها في أي قائمة ميزات. لأنه إذا تم إدراجها هناك، سيبدو كل منها صغيراً بشكل مضحك:
- إزالة المسافات قبل التحقق، لضمان عدم تسبب مسافة عشوائية في نهاية العنوان الملصق في إفساد كل شيء
- الحفاظ على المرساة (anchor)، أي أن
#sectionفيhttps://example.com/page#sectionلا تختفي بعد الاختصار - معاملات الاستعلام (
?utm_source=test) تمر بالكامل، ولا يتم قطع أي شيء في الطريق - النطاقات التي تحتوي على أحرف بولندية، مثل
źdźbło.pl، تتحول تلقائياً إلى punycode - الأحرف البولندية في نهاية الرابط (slug) يتم تحويلها إلى ASCII (مثلاً
różowy-linkتصبحrozowy-link) - البروتوكولات غير الآمنة —
javascript:,data:,file:— يتم رفضها مع رسالة محددة ومفهومة
(من المخطط له أيضاً الترقية التلقائية من http:// إلى https:// عندما يدعم الخادم المستهدف التشفير. هذا الأمر لا يعمل حالياً في البيئة الحقيقية، لذا لن أدعي عكس ذلك.)
كل تفصيل من هذه التفاصيل يوفر لشخص ما خمس أو عشر أو ثلاثين ثانية وتنهيدة واحدة. بمفردها، لا شيء. معاً، هي الفرق بين "يعمل بشكل جيد" و"أحب استخدام هذا".
ما أود إضافته أيضاً
قائمة أمنيات للمستقبل، لأن التفكير فيها يمنحني المتعة ببساطة:
- اللصق الذكي — اكتشاف العنوان المخفي داخل الجملة واستخراج الرابط (URL) فقط من بين الكلمات
- اللصق الجماعي — قائمة عناوين، عنوان واحد في كل سطر، وإنشاء رابط قصير منفصل لكل منها فوراً
- اقتراح النهايات — بناءً على عنوان الصفحة المستهدفة، اقتراح ثلاثة slugs مميزة للاختيار من بينها
- معاينة Open Graph مباشرة بعد اللصق، حتى قبل النقر على "تقصير"
كل واحدة من هذه هي مجرد "دالة من خمسة أسطر، لا تبدو على أي شيء". وكلها معاً؟ هذا هو بالضبط الحد الفاصل بين أداة جيدة، وأداة تلجأ إليها يومياً دون تفكير. إذا كنت تريد رؤية كيف يعمل ذلك الآن، فقم بلصق أي شيء بدون بروتوكول في cutty.dev — allegro.pl, github.com, news.ycombinator.com — وسترى أنه لا يضع أي عوائق في طريقك.
في الختام، لمسة شخصية قليلاً
كنت أعتقد لفترة طويلة أن المنتجات تفوز بفضل الميزات الضخمة. ذلك الشيء المبهر الوحيد الذي يمكن عرضه في شريحة وسيكتب الناس عنه. وبالفعل، أحياناً يكون الأمر كذلك.
كلما استمررت في بناء cutty لفترة أطول، أشعر بقوة أكبر أن ولاء المستخدم يولد في مكان آخر — في تلك المئات من الأجزاء من الثانية التي لا يلاحظها أحد بوعي. أنت لا تتذكر أن الأداة هي من أضافت لك https:// تلقائياً. أنت تتذكر فقط الانطباع العام بأن "استخدامها جيد نوعاً ما"، أو أنها "لا تسبب الإزعاج". هذا الانطباع لا يأتي من فراغ. إنه يتكون من عشرات القرارات المكونة من خمسة أسطر، والتي لن يدافع أحد عن أي منها بمفرده كقرار "يستحق الوقت".
ربما تكمن الحرفة في هذا تحديداً. ليس في تلك الحركة الكبيرة الواحدة، بل في الإصرار على الوقوف بجانب الإنسان مرة تلو الأخرى عند ملء النموذج — حتى لو كان الأمر يتعلق بثانيتين ضئيلتين فقط. وأنت؟ ما الذي أثار غضبك مؤخراً في أداة ما لدرجة أنه من الخجل الاعتراف بذلك؟ لأن العمل الأفضل الذي ينتظر الإنجاز غالباً ما يكمن هناك تماماً.