Im täglichen Entwicklungsprozess müssen wir häufig einige im CDN platzierte statische Dateien (wie JavaScript, CSS, HTML-Dateien usw.) ändern. In diesem Prozess hoffen wir, eine Möglichkeit zu haben, das Online-CDN abzubilden Verzeichnis in lokal Ein Verzeichnis auf der Festplatte, sodass wir eine Datei nicht veröffentlichen müssen, wenn wir sie lokal ändern, und der Effekt sofort nach der Aktualisierung sichtbar ist.
Unser CDN-Domänenname lautet beispielsweise: http://a.mycdn.com und das entsprechende lokale Verzeichnis lautet: D:workassets. Wir hoffen, dass alle auf http://a.mycdn.com/* zugreifen können. wird zugeordnet. Gehen Sie zu den lokalen D:workassets*. Wenn Sie beispielsweise http://a.mycdn.com/s/atp.js besuchen, lesen Sie tatsächlich die lokale Datei D:workassetssatp.js, ohne Online-Dateien aus dem Internet herunterzuladen.
Die Implementierung dieser Funktion ist sehr einfach. Die wichtigsten Punkte sind wie folgt:
1. Öffnen Sie lokal einen HTTP-Dienst und überwachen Sie Port 80;
2. Ändern Sie die Systemhosts-Datei, fügen Sie „127.0.0.1 a.mycdn.com“ hinzu und binden Sie den CDN-Domänennamen an die lokale Serveradresse
3. Konfigurieren Sie den lokalen HTTP-Dienst. Überprüfen Sie zunächst, ob die entsprechende Datei auf der lokalen Festplatte vorhanden ist. Wenn sie nicht vorhanden ist, wird der entsprechende Inhalt zurückgegeben wird zurückgegeben.
Wie Sie sehen, besteht der Schlüssel zum Aufbau eines lokalen HTTP-Dienstes. In diesem Bereich gibt es viele Tutorials, wie zum Beispiel die lokale Installation von Serversoftware wie Apache oder Ngnix und die anschließende Konfiguration entsprechender Weiterleitungsregeln. Ich persönlich bin jedoch der Meinung, dass diese Methode immer noch etwas kompliziert ist. In diesem Artikel wird eine weitere Methode vorgestellt, die keine Installation von Serversoftware erfordert.
Da wir lokal entwickeln und debuggen, sind die Anforderungen an Leistung und Parallelität nicht hoch, sodass wir eigentlich keine professionelle HTTP-Software wie Apache/Ngnix benötigen, sondern nur ein Skript, das HTTP-Dienste bereitstellen kann. Das war’s. Verwenden Sie beispielsweise nodejs, um es zu implementieren.
path = require("path"),
fs = require("fs"),
local_folders,
base_url;
local_folders = [ // Lokaler Pfad, der Agent sucht in den Verzeichnissen in dieser Liste nach Dateien, und wenn er nicht gefunden wird, geht er zur Online-Adresse
];
base_url = "http://10.232.133.214"; // Online-Pfad, wenn die Datei nicht gefunden werden kann, auf diese Adresse umleiten
var i, l = local_folders.length,
fn;
console.log("versuchen zu laden" Pfadname);
für (i = 0; i < l; i ) {
fn = local_folders[i] Pfadname;
if (path.existsSync(fn) && fs.statSync(fn).isFile()) {
fs.readFile(fn, function (err, data) {
Response.writeHead(200);
Response.write(data);
Response.end();
});
zurück;
}
Response.writeHead(302, {
„Standort“:base_url-Pfadname
});
Response.end();
}
http.createServer(
var req_url = request.url,
// Anfragen ähnlich wie http://a.tbcdn.cn/??p/global/1.0/global-min.css,tbsp/tbsp.css?t=20110920172000.css
console.log("Anfrage für '" Pfadname "' empfangen.");
LoadFile(Pfadname, Antwort);
}).listen(80);
Wenn Sie über http auf einen Pfad zugreifen, sucht das obige Skript zunächst im entsprechenden lokalen Verzeichnis. Wenn es gefunden wird, wird der Inhalt der entsprechenden Datei zurückgegeben. Wenn es nicht gefunden wird, springt es direkt zum entsprechenden Online-Verzeichnis Adresse. Für Situationen, in denen er nicht gefunden werden kann, besteht eine andere Lösung darin, den lokalen Server den entsprechenden Inhalt online herunterladen und zurückgeben zu lassen. Für diese Anforderung reicht jedoch ein 302-Sprung aus.
Zusätzlich zur NodeJS-Version habe ich auch eine Python-Version geschrieben:
Betriebssystem importieren
BaseHTTPServer importieren
LOCAL_FOLDERS = [
„D:/work/assets“
]
BASE_URL = "http://10.232.133.214"
Klasse WebRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
def do_GET(self):
print „Anfrage für ‚%s‘ erhalten.“ % self.path
für Ordner in LOCAL_FOLDERS:
fn = os.path.join(folder, self.path.replace("/", os.sep)[1:])
wenn os.path.isfile(fn):
self.send_response(200)
self.wfile.write(open(fn, "rb").read())
Pause
sonst:
self.send_response(302)
self.send_header("Location", "%s%s" % (BASE_URL, self.path))
server = BaseHTTPServer.HTTPServer(("0.0.0.0", 80), WebRequestHandler)
server.serve_forever()
可以看到,Python verwendet die Nodejs-Software, um die Funktionalität zu verbessern.
上面的两段代码的功能还相对比较简单, 比如没有输出内容的 MIME-Type、Content-Length 等头信息, 对可能的阻塞操作 (如读取文件超时等)也没有做特别的处理。对于本地开发环境来说, 它们已经是可以工作的版本了, 你也可以继续扩展这两个脚本, 以便满足更多的需求.