ในระหว่างกระบวนการพัฒนารายวันเรามักจะต้องแก้ไขไฟล์คงที่บางส่วนที่วางไว้บน CDN (เช่น JavaScript, CSS, ไฟล์ HTML ฯลฯ ) ในกระบวนการนี้เราหวังว่าจะมีวิธีทำแผนที่ไดเรกทอรี CDN ออนไลน์กับไดเรกทอรีบนฮาร์ดดิสก์ท้องถิ่น ด้วยวิธีนี้เมื่อเราแก้ไขไฟล์ในเครื่องเราไม่จำเป็นต้องเผยแพร่และเราสามารถเห็นผลกระทบทันทีหลังจากรีเฟรช
ตัวอย่างเช่นชื่อโดเมน CDN ของเราคือ: http://a.mycdn.com และไดเรกทอรีที่เกี่ยวข้องในท้องถิ่นคือ: d:/worsassets เราหวังว่าการเข้าถึงทั้งหมดไปยัง http://a.mycdn.com/* จะถูกแมปกับ D:/Workassets/* ตัวอย่างเช่นเมื่อไปที่ http://a.mycdn.com/s/atp.js คุณอ่าน D:/WorkAssetss/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 = reghed ("http")
url = ต้องการ ("url")
PATH = ต้องการ ("เส้นทาง"),
fs = ต้องการ ("fs")
local_folders
base_url;
local_folders = [// เส้นทางท้องถิ่นตัวแทนจะค้นหาไฟล์ในไดเรกทอรีในรายการนี้หากไม่พบให้ไปที่ที่อยู่ออนไลน์
"D:/งาน/สินทรัพย์"
-
base_url = "http://10.232.133.214"; // เส้นทางออนไลน์หากไม่พบไฟล์แล้วหันไปที่ที่อยู่นี้
ฟังก์ชั่นโหลดไฟล์ (ชื่อพา ธ การตอบสนอง) {
var i, l = local_folders.length,
fn;
console.log ("พยายามโหลด" + ชื่อพา ธ );
สำหรับ (i = 0; i <l; i ++) {
fn = local_folders [i] + ชื่อพา ธ ;
if (path.existssync (fn) && fs.statsync (fn) .isfile ()) {
fs.readfile (fn, function (err, data) {
Response.writehead (200);
Response.write (ข้อมูล);
Response.end ();
-
กลับ;
-
-
Response.writehead (302, {
"ตำแหน่ง": base_url + pathname
-
Response.end ();
-
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 (ชื่อพา ธ การตอบสนอง);
}). ฟัง (80);
โปรดทราบว่าคุณเปลี่ยนค่าของตัวแปร local_folders และ base_url ด้านบนเป็นค่าที่คุณต้องการ บันทึกไฟล์นี้ตัวอย่างเช่นบันทึกเป็น local-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 (เปิด (fn, "rb"). อ่าน ())
หยุดพัก
อื่น:
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, ความยาวเนื้อหาและข้อมูลส่วนหัวอื่น ๆ โดยไม่มีเนื้อหาเอาต์พุตและไม่มีการประมวลผลพิเศษสำหรับการปิดกั้นที่เป็นไปได้ (เช่นการอ่านหมดเวลาไฟล์ ฯลฯ ) สำหรับสภาพแวดล้อมการพัฒนาในท้องถิ่นพวกเขากำลังทำงานอยู่แล้วและคุณสามารถขยายสคริปต์ทั้งสองนี้ต่อไปเพื่อตอบสนองความต้องการมากขึ้น