Selama proses pengembangan harian, kita sering perlu memodifikasi beberapa file statis yang ditempatkan pada CDN (seperti JavaScript, CSS, file HTML, dll.). Dalam proses ini, kami berharap memiliki cara untuk memetakan direktori CDN online ke direktori pada hard disk lokal. Dengan cara ini, ketika kami memodifikasi file secara lokal, kami tidak perlu mempublikasikannya, dan kami dapat melihat efeknya segera setelah menyegarkan.
Misalnya, nama domain CDN kami adalah: http://a.mycdn.com, dan direktori lokal yang sesuai adalah: d:/workassets. Kami berharap semua akses ke http://a.mycdn.com/* akan dipetakan ke d:/workassets lokal/*. Misalnya, saat mengunjungi http://a.mycdn.com/s/atp.js, Anda benar -benar membaca d: /workassetss/atp.js lokal tanpa mengunduh file online dari internet.
Sangat mudah untuk mengimplementasikan fungsi ini, poin -poin utama adalah sebagai berikut:
1. Buka layanan HTTP secara lokal dan dengarkan port 80;
2. Ubah file host sistem, tambahkan "127.0.0.1 a.mycdn.com", dan mengikat nama domain CDN ke alamat server lokal;
3. Mengkonfigurasi Layanan HTTP Lokal. Setelah menerima permintaan GET, periksa apakah ada file yang sesuai pada hard disk lokal. Jika ada, kembalikan konten file. Jika tidak ada, kembalikan konten yang sesuai di baris.
Seperti yang Anda lihat, bagian utama adalah membangun layanan HTTP lokal. Ada banyak tutorial dalam hal ini, seperti menginstal perangkat lunak server seperti Apache atau Ngnix secara lokal, dan kemudian mengkonfigurasi aturan penerusan yang sesuai. Namun, saya pribadi berpikir metode ini masih sedikit rumit. Apa yang ingin saya perkenalkan dalam artikel ini adalah metode lain yang tidak memerlukan instalasi perangkat lunak server.
Karena kami sedang mengembangkan dan men -debug secara lokal, kami tidak memiliki persyaratan tinggi untuk kinerja dan konkurensi, jadi kami sebenarnya tidak memerlukan perangkat lunak HTTP profesional seperti Apache/NGNIX. Kami hanya membutuhkan skrip yang dapat menyediakan layanan HTTP. Misalnya, gunakan nodeJs untuk mengimplementasikannya.
Salinan kode adalah sebagai berikut:
/**
* Penulis: Oldj
*
**/
var http = membutuhkan ("http"),
url = membutuhkan ("url"),
path = membutuhkan ("path"),
fs = membutuhkan ("fs"),
local_folders,
base_url;
local_folders = [// jalur lokal, agen akan mencari file di direktori dalam daftar ini, jika tidak ditemukan, buka alamat online
"D:/Work/Assets"
];
base_url = "http://10.232.133.214"; // jalur online, jika file tidak dapat ditemukan, lalu putar ke alamat ini
fungsi loadFile (pathname, respons) {
var i, l = local_folders.length,
fn;
console.log ("Coba muat" + pathname);
untuk (i = 0; i <l; i ++) {
fn = local_folders [i] + pathname;
if (path.existsync (fn) && fs.statsync (fn) .isfile ()) {
fs.readfile (fn, function (err, data) {
response.writeHead (200);
response.write (data);
response.end ();
});
kembali;
}
}
response.writeHead (302, {
"Lokasi": base_url + pathname
});
response.end ();
}
http.createServer (
fungsi (permintaan, respons) {
var req_url = request.url,
pathname;
// menangani permintaan yang mirip dengan http://a.tbcdn.cn/??p/global/1.0/global-min.css.tbsp/tbsp.css?t=2011092017000.css
pathname = req_url.indexof ("??") == -1? url.parse (request.url) .pathname: req_url;
console.log ("permintaan '" + pathname + "' diterima.");
LoadFile (pathname, respons);
}). Dengarkan (80);
Perhatikan bahwa Anda mengubah nilai variabel local_folder dan base_url di atas ke nilai yang Anda butuhkan. Simpan file ini, misalnya, simpan sebagai local-cdn-proxy.js, dan kemudian jalan "node local-cdn-proxy.js" pada baris perintah, dan server lokal akan berjalan. Tentu saja, jangan lupa untuk mengikat host.
Saat mengakses jalur melalui HTTP, skrip di atas pertama -tama akan mencari di direktori lokal yang sesuai. Jika ditemukan, itu akan mengembalikan konten file yang sesuai. Jika tidak ditemukan, itu akan melompat langsung ke alamat yang sesuai di telepon. Untuk situasi di mana ia tidak dapat ditemukan, ada cara lain untuk menghadapinya. Server lokal mengunduh konten yang sesuai dari online dan mengembalikannya. Namun, untuk persyaratan ini, lompatan 302 sudah cukup.
Selain versi NodeJS, saya juga menulis versi Python:
Salinan kode adalah sebagai berikut:
#-*-Coding: UTF-8-*-
#
# Penulis: Oldj
#
Impor OS
Impor Basehttpserver
Local_folders = [
"D:/Work/Assets"
]
Base_url = "http://10.232.133.214"
Kelas WebRequestHandler (Basehttpserver.BaseHTTPREQUESTHANDLER):
def do_get (self):
Cetak "Permintaan '%S' diterima." % self.path
untuk folder di local_folder:
fn = os.path.join (folder, self.path.replace ("/", os.sep) [1:])
jika os.path.file (fn):
self.send_response (200)
self.wfile.write (terbuka (fn, "rb"). baca ())
merusak
kalau tidak:
self.send_response (302)
self.send_header ("lokasi", "%s%s"%(base_url, self.path))
Server = Basehttpserver.httpserver (("0.0.0.0", 80), WebRequestHandler)
server.serve_forever ()
Seperti yang Anda lihat, kode dalam versi Python jauh lebih sederhana dari pada versi NodeJS.
Fungsi dari dua kode di atas relatif sederhana, seperti tipe MIME, konten-panjang dan informasi header lainnya tanpa konten output, dan tidak ada pemrosesan khusus yang dilakukan untuk kemungkinan operasi pemblokiran (seperti membaca timeout file, dll.). Untuk lingkungan pengembangan lokal, mereka sudah menjadi versi kerja, dan Anda dapat terus memperluas kedua skrip ini untuk memenuhi lebih banyak kebutuhan.