Pendant le processus de développement quotidien, nous devons souvent modifier certains fichiers statiques placés sur le CDN (tels que JavaScript, CSS, Fichiers HTML, etc.). Dans ce processus, nous espérons avoir un moyen de cartographier le répertoire CDN en ligne à un répertoire sur le disque dur local. De cette façon, lorsque nous modifions un fichier localement, nous n'avons pas besoin de le publier, et nous pouvons voir l'effet immédiatement après rafraîchir.
Par exemple, notre nom de domaine CDN est: http://a.mycdn.com, et le répertoire correspondant local est: d: / workAssets. Nous espérons que tous les accès à http://a.mycdn.com/* seront mappés au d: / workassets / *. Par exemple, lors de la visite de http://a.mycdn.com/s/atp.js, vous lisez en fait le d: /workAssetsss/atp.js local sans télécharger des fichiers en ligne depuis Internet.
Il est très simple d'implémenter cette fonction, les points clés sont les suivants:
1. Ouvrez un service HTTP localement et écoutez le port 80;
2. Modifiez le fichier Hosts System, ajoutez "127.0.0.1 a.mycdn.com" et liez le nom de domaine CDN à l'adresse du serveur local;
3. Configurez le service HTTP local. Après avoir reçu une demande GET, vérifiez si le fichier correspondant existe sur le disque dur local. S'il existe, renvoyez le contenu du fichier. S'il n'existe pas, renvoyez le contenu correspondant sur la ligne.
Comme vous pouvez le voir, la partie clé est de créer un service HTTP local. Il existe de nombreux didacticiels à cet égard, tels que l'installation de logiciels de serveur tels que Apache ou NGIX localement, puis de configurer les règles de transfert correspondantes. Cependant, je pense personnellement que cette méthode est encore un peu compliquée. Ce que je veux introduire dans cet article est une autre méthode qui ne nécessite pas l'installation de logiciels de serveur.
Parce que nous développons et déboglons localement, nous n'avons pas d'exigences élevées pour les performances et la concurrence, nous n'avons donc pas besoin d'un logiciel HTTP professionnel comme Apache / NGIX. Nous n'avons besoin que d'un script qui peut fournir des services HTTP. Par exemple, utilisez les NodeJS pour l'implémenter.
La copie de code est la suivante:
/ **
* Auteur: Oldj
*
** /
var http = requis ("http"),
url = require ("url"),
chemin = requis ("chemin"),
fs = require ("fs"),
local_folders,
base_url;
local_folders = [// Chemin local, l'agent recherchera le fichier dans le répertoire de cette liste, si vous n'êtes pas trouvé, accédez à l'adresse en ligne
"D: / travail / actifs"
]]
base_url = "http://10.232.133.214"; // Chemin en ligne, si le fichier ne peut pas être trouvé, alors tournez-vous vers cette adresse
Fonction LoadFile (PathName, Response) {
var i, l = local_folders.length,
FN;
console.log ("essayez de charger" + pathname);
pour (i = 0; i <l; i ++) {
fn = local_folders [i] + pathName;
if (path.existsync (fn) && fsatSync (fn) .isfile ()) {
fs.readfile (fn, fonction (err, data) {
réponse.Writehead (200);
Response.Write (données);
réponse.end ();
});
retour;
}
}
réponse.Writehead (302, {
"Emplacement": base_url + cheminement
});
réponse.end ();
}
http.createServer (
fonction (demande, réponse) {
var req_url = request.url,
PathName;
// gérer les demandes similaires à 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 ("Demande pour '" + pathname + "' reçue.");
LoadFile (PathName, Response);
}). écouter (80);
Notez que vous modifiez les valeurs des variables local_folders et base_url ci-dessus aux valeurs dont vous avez besoin. Enregistrez ce fichier, par exemple, enregistrez-le comme local-cdn-proxy.js, puis exécutez "nœud local-cdn-proxy.js" sur la ligne de commande, et le serveur local s'exécutera. Bien sûr, n'oubliez pas de lier les hôtes.
Lorsque vous accédez à un chemin via HTTP, le script ci-dessus recherche d'abord dans le répertoire local correspondant. S'il est trouvé, il renverra le contenu du fichier correspondant. S'il n'est pas trouvé, il sautera directement à l'adresse correspondante sur la ligne. Pour les situations où il ne peut pas être trouvé, il existe une autre façon de y faire face. Le serveur local télécharge le contenu correspondant à partir de la ligne et le renvoie. Cependant, pour cette exigence, un saut 302 suffit.
En plus de la version Nodejs, j'ai également écrit une version Python:
La copie de code est la suivante:
# - * - codage: utf-8 - * -
#
# Auteur: Oldj
#
Importer un système d'exploitation
importer la basehttpsserver
Local_folders = [
"D: / travail / actifs"
]]
Base_url = "http://10.232.133.214"
Classe WebRequestHandler (BaseHttpServer.BaseHttpRequestHandler):
def do_get (self):
Imprimez «Demande de«% s »reçue». % self.Path
pour le dossier dans local_folders:
fn = os.path.join (dossier, self.path.replace ("/", os.sep) [1:])
Si os.path.isfile (fn):
self.send_response (200)
self.wfile.write (ouvert (fn, "rb"). read ())
casser
autre:
self.send_response (302)
self.send_header ("emplacement", "% s% s"% (base_url, self.path)))
server = basehttpServer.httpServer (("0.0.0.0", 80), webrequesthandler)
server.serve_forever ()
Comme vous pouvez le voir, le code dans la version Python est beaucoup plus simple que celui de la version NodeJS.
Les fonctions des deux codes ci-dessus sont relativement simples, telles que le type MIME, la longueur du contenu et d'autres informations d'en-tête sans contenu de sortie, et aucun traitement spécial n'est effectué pour les opérations de blocage possibles (telles que le délai d'expiration du fichier de lecture, etc.). Pour les environnements de développement locaux, ils travaillent déjà et vous pouvez continuer à étendre ces deux scripts pour répondre à plus de besoins.