أثناء عملية التطوير اليومية ، غالبًا ما نحتاج إلى تعديل بعض الملفات الثابتة الموضوعة على CDN (مثل JavaScript ، CSS ، HTML Files ، إلخ). في هذه العملية ، نأمل أن يكون لدينا طريقة لرسم خريطة دليل CDN عبر الإنترنت إلى دليل على القرص الصلب المحلي. وبهذه الطريقة ، عندما نقوم بتعديل ملف محليًا ، لا نحتاج إلى نشره ، ويمكننا أن نرى التأثير مباشرة بعد التحديث.
على سبيل المثال ، اسم مجال CDN الخاص بنا هو: http://a.mycdn.com ، والدليل المقابل المحلي هو: D:/Workassets. نأمل أن يتم تعيين جميع الوصول إلى http://a.mycdn.com/* إلى المحلية D:/Workassets/*. على سبيل المثال ، عند زيارة http://a.mycdn.com/s/atp.js ، تقرأ بالفعل D: /WorkAssetsss/ATP.JS دون تنزيل الملفات عبر الإنترنت من الإنترنت.
من السهل جدًا تنفيذ هذه الوظيفة ، النقاط الرئيسية هي كما يلي:
1. افتح خدمة HTTP محليًا واستمع إلى المنفذ 80 ؛
2. قم بتعديل ملف مضيفات النظام ، إضافة "127.0.0.1 A.MYCDN.com" ، وربط اسم مجال CDN بعنوان الخادم المحلي ؛
3. تكوين خدمة HTTP المحلية. بعد تلقي طلب الحصول على الحصول على ما إذا كان الملف المقابل موجودًا على القرص الصلب المحلي. إذا كان موجودًا ، فأرجع محتوى الملف. إذا لم يكن موجودًا ، فأرجع المحتوى المقابل على السطر.
كما ترون ، الجزء الرئيسي هو بناء خدمة HTTP محلية. هناك العديد من البرامج التعليمية في هذا الصدد ، مثل تثبيت برنامج الخادم مثل Apache أو NGNIX محليًا ، ثم تكوين قواعد إعادة التوجيه المقابلة. ومع ذلك ، أعتقد شخصياً أن هذه الطريقة لا تزال معقدة بعض الشيء. ما أريد تقديمه في هذه المقالة هو طريقة أخرى لا تتطلب تثبيت برنامج الخادم.
نظرًا لأننا نقوم بتطوير وتصحيح الأخطاء محليًا ، فليس لدينا متطلبات عالية للأداء والتزامن ، لذلك لا نحتاج في الواقع إلى برنامج HTTP احترافي مثل Apache/NGNIX. نحتاج فقط إلى برنامج نصي يمكنه توفير خدمات HTTP. على سبيل المثال ، استخدم nodejs لتنفيذها.
نسخة الكود كما يلي:
/**
* المؤلف: Oldj
*
**/
var http = require ("http") ،
url = طلب ("url") ،
المسار = يتطلب ("المسار") ،
fs = require ("fs") ،
local_folders ،
base_url ؛
local_folders = [// path local ، سيبحث الوكيل عن الملف الموجود في الدليل في هذه القائمة ، إن لم يتم العثور عليه ، انتقل إلى العنوان عبر الإنترنت
"D:/العمل/الأصول"
] ؛
BASE_URL = "http://10.232.133.214" ؛ // المسار عبر الإنترنت ، إذا كان لا يمكن العثور على الملف ، فانتقل إلى هذا العنوان
وظيفة loadfile (مسار ، استجابة) {
var i ، l = local_folders.length ،
fn ؛
console.log ("حاول تحميل" + اسم pathname) ؛
لـ (i = 0 ؛ i <l ؛ i ++) {
fn = local_folders [i] + pathName ؛
if (path.existssync (fn) && fs.statsync (fn) .isfile ()) {
fs.readfile (fn ، function (err ، data) {
Response.writehead (200) ؛
استجابة. write (البيانات) ؛
استجابة.
}) ؛
يعود؛
}
}
Response.writehead (302 ، {
"الموقع": BASE_URL + PATHNAME
}) ؛
استجابة.
}
http.createserver (
وظيفة (طلب ، استجابة) {
var req_url = request.url ،
اسم المسار
// مقبض طلبات مماثلة لـ http://a.tbcdn.cn/؟؟p/global/1.0/global-min.css،tbsp/tbsp.css؟t=20110920172000.css
pathName = req_url.indexof ("؟؟") == -1؟ url.parse (request.url) .PathName: req_url ؛
console.log ("طلب" " + pathname +" "المستلم.") ؛
LoadFile (PathName ، Response) ؛
}). الاستماع (80) ؛
لاحظ أنك تقوم بتغيير قيم متغيرات Local_Folders و BASE_URL أعلاه إلى القيم التي تحتاجها. احفظ هذا الملف ، على سبيل المثال ، احفظه كـ cdn-proxy.js ، ثم قم بتنفيذ "Node Local-CDN-Proxy.js" على سطر الأوامر ، وسيتم تشغيل الخادم المحلي. بالطبع ، لا تنس ربط المضيفين.
عند الوصول إلى مسار من خلال HTTP ، سيقوم البرنامج النصي أعلاه أولاً بالبحث في الدليل المحلي المقابل. إذا تم العثور عليه ، فسيقوم بإرجاع محتوى الملف المقابل. إذا لم يتم العثور عليها ، فسيقفز مباشرة إلى العنوان المقابل على السطر. بالنسبة للمواقف التي لا يمكن العثور عليها ، هناك طريقة أخرى للتعامل معها. يقوم الخادم المحلي بتنزيل المحتوى المقابل من الإنترنت ويعيده. ومع ذلك ، لهذا المطلب ، قفزة 302 كافية.
بالإضافة إلى إصدار NodeJS ، كتبت أيضًا نسخة Python:
نسخة الكود كما يلي:
#-*-الترميز: UTF-8-*-
#
# المؤلف: Oldj
#
استيراد نظام التشغيل
استيراد basehttpserver
local_folders = [
"D:/العمل/الأصول"
]
base_url = "http://10.232.133.214"
Class WebRequestHandler (basehttpserver.basehttprequesthandler):
def do_get (الذات):
اطبع "طلب لـ '٪ s' المستلم." ٪ self.path
للمجلد في Local_Folders:
fn = os.path.join (المجلد ، self.path.replace ("/" ، OS.Sep) [1:])
إذا os.path.isfile (fn):
self.send_response (200)
self.wfile.write (Open (FN ، "RB"). read ())
استراحة
آخر:
self.send_response (302)
self.send_header ("الموقع" ، "٪ s ٪ s" ٪ (base_url ، self.path))
server = basehttpserver.httpserver (("0.0.0.0" ، 80) ، WebRequestHandler)
server.serve_forever ()
كما ترون ، فإن الكود في إصدار Python أبسط بكثير من ذلك في إصدار NodeJS.
تكون وظائف الرموبين المذكورة أعلاه بسيطة نسبيًا ، مثل نوع MIME ، وطول المحتوى وغيرها من معلومات الرأس دون محتوى إخراج ، ولا يتم إجراء معالجة خاصة لعمليات الحظر المحتملة (مثل قراءة مهلة الملف ، إلخ). بالنسبة لبيئات التنمية المحلية ، فهي تعمل بالفعل إصدارات ، ويمكنك الاستمرار في تمديد هاتين النصتين لتلبية المزيد من الاحتياجات.