Während des täglichen Entwicklungsprozesses müssen wir häufig einige statische Dateien ändern, die auf dem CDN platziert sind (z. B. JavaScript, CSS, HTML -Dateien usw.). In diesem Prozess hoffen wir, das Online -CDN -Verzeichnis einem Verzeichnis auf der lokalen Festplatte abzubilden. Auf diese Weise müssen wir sie nicht veröffentlichen, wenn wir eine Datei lokal ändern, und wir können den Effekt unmittelbar nach dem Erfrischen sehen.
Zum Beispiel lautet unser CDN -Domain -Name: http://a.mycdn.com, und das lokale entsprechende Verzeichnis lautet: d:/Workers. Wir hoffen, dass alle Zugriffe auf http://a.mycdn.com/* dem lokalen d:/worchselsets/* zugeordnet werden. Wenn Sie beispielsweise http://a.mycdn.com/s/atp.js besuchen, lesen Sie tatsächlich die lokalen D: /workassets/atp.js, ohne Online -Dateien aus dem Internet herunterzuladen.
Es ist sehr einfach, diese Funktion zu implementieren. Die wichtigsten Punkte sind wie folgt:
1. Öffnen Sie einen HTTP -Dienst lokal und hören Sie Port 80 an.
2. Ändern Sie die Datei der Systemhosts, "127.0.0.1 a.mycdn.com" und binden Sie den CDN -Domänennamen an die lokale Serveradresse.
3. Konfigurieren Sie den lokalen HTTP -Dienst. Überprüfen Sie nach Erhalt einer Get -Anfrage, ob die entsprechende Datei auf der lokalen Festplatte vorhanden ist. Wenn es vorhanden ist, geben Sie den Inhalt der Datei zurück. Wenn es nicht vorhanden ist, geben Sie den entsprechenden Inhalt in der Zeile zurück.
Wie Sie sehen können, besteht der Hauptteil darin, einen lokalen HTTP -Dienst zu erstellen. In dieser Hinsicht gibt es viele Tutorials, z. B. die Installation von Serversoftware wie Apache oder NGNIX lokal und dann die entsprechenden Weiterleitungsregeln konfigurieren. Ich persönlich denke jedoch, dass diese Methode immer noch etwas kompliziert ist. Was ich in diesem Artikel einführen möchte, ist eine andere Methode, für die keine Serversoftware installiert werden muss.
Da wir uns lokal entwickeln und debuggen, haben wir keine hohen Anforderungen an Leistung und Parallelität, sodass wir tatsächlich keine professionelle HTTP -Software wie Apache/NGNIX benötigen. Wir brauchen nur ein Skript, das HTTP -Dienste anbieten kann. Verwenden Sie beispielsweise NodeJs, um es zu implementieren.
Die Codekopie lautet wie folgt:
/**
* Autor: Oldj
*
**//
var http = required ("http"),
URL = erfordern ("URL"),
Pfad = erfordern ("Pfad"),
fs = erfordern ("fs"),
LOCAL_FOLDERS,
Base_url;
local_folders = [// Lokaler Pfad sucht der Agent nach der Datei im Verzeichnis in dieser Liste, falls nicht gefunden, zu der Online -Adresse
"D:/Arbeit/Vermögen" "
];
Base_url = "http://10.232.133.214"; // Online -Pfad, wenn die Datei nicht gefunden werden kann, wenden Sie sich an diese Adresse
Funktion LoadFile (Pathname, Antwort) {
var i, l = local_folders.length,
fn;
console.log ("versuchen, zu laden" + pathname);
für (i = 0; i <l; i ++) {
fn = local_Folders [i] + pathname;
if (path.existsSync (fn) && fs.statync (fn) .isfile ()) {
fs.readfile (fn, function (err, data) {
Antwort.WriteHead (200);
Antwort.Write (Daten);
Antwort.end ();
});
zurückkehren;
}
}
response.writeHead (302, {
"Ort": Base_url + Pathname
});
Antwort.end ();
}
http.createserver (
Funktion (Anfrage, Antwort) {
var req_url = request.url,
Pfadname;
// Anfragen verarbeiten ähnlich wie http://a.tbcdn.cn/??p/global/1.0/global-min.css,tbsp/tbsp.css?t=20110920172000.csss
pathname = req_url.indexof ("??") == -1? url.parse (request.url) .PathName: req_url;
console.log ("Anfrage für '" + pathname + "' empfangen.");
LoadFile (Pathname, Antwort);
}). Hören (80);
Beachten Sie, dass Sie die Werte der variablen von Local_Folders und Base_url auf die von Ihnen benötigten Werte ändern. Speichern Sie diese Datei beispielsweise als lokal-cdn-proxy.js und führen Sie dann "Knoten local-cdn-proxy.js" in der Befehlszeile aus, und der lokale Server wird ausgeführt. Vergessen Sie natürlich nicht, Hosts zu binden.
Wenn Sie über HTTP auf einen Pfad zugreifen, sucht das obige Skript zunächst im entsprechenden lokalen Verzeichnis. Wenn es gefunden wird, gibt es den Inhalt der entsprechenden Datei zurück. Wenn es nicht gefunden wird, springt es direkt zu der entsprechenden Adresse in der Zeile. In Situationen, in denen es nicht gefunden werden kann, gibt es eine andere Möglichkeit, damit umzugehen. Der lokale Server lädt den entsprechenden Inhalt online herunter und gibt ihn zurück. Für diese Anforderung reicht jedoch ein 302 -Sprung aus.
Zusätzlich zur NodeJS -Version habe ich auch eine Python -Version geschrieben:
Die Codekopie lautet wie folgt:
#-*-Codierung: UTF-8-*-
#
# Autor: Oldj
#
OS importieren
Basehttpserver importieren
Local_Folders = [
"D:/Arbeit/Vermögen" "
]
Base_url = "http://10.232.133.214"
Klasse WebRequestHandler (BasehttpServer.baseHttprequestHandler):
def do_get (self):
Druck "Anfrage für '%s' erhalten." % self.path
Für Ordner in Local_Folders:
fn = os.path.join (Ordner, self.path.replace ("/", os.sep) [1:])
Wenn os.path.isfile (fn):
self.send_response (200)
self.wfile.write (offen (fn, "rb"). read ())
brechen
anders:
self.send_response (302)
self.send_Header ("Ort", "%S%S"%(Base_url, Self.Path))
server = baseHttpserver.httpserver (("0.0.0.0", 80), WebRequestHandler)
server.serve_forver ()
Wie Sie sehen können, ist der Code in der Python -Version viel einfacher als der in der NodeJS -Version.
Die Funktionen der beiden oben genannten Codes sind relativ einfach, wie z. B. MIME-Typ, Inhaltslänge und andere Header-Informationen ohne Ausgabeinhalt, und es erfolgt keine spezielle Verarbeitung für mögliche Blockiervorgänge (z. B. Lesen von Zeitüberschreitungen usw.). Für lokale Entwicklungsumgebungen arbeiten sie bereits an Versionen, und Sie können diese beiden Skripte weiter erweitern, um mehr Anforderungen zu erfüllen.