2017-05-29 17 views
0

Ich bin wie so eine einzelne Seite App mit einem normalen HTML-Layout-Gestaltung:Knoten js, Browser-Cache und 304 Antwort

<html> 
    <head> 
    <title>...</title> 
    <link rel="stylesheet" media="all" type="text/css" href="css/main.css"> 
    ...more meta tags 
    </head> 
    <body> 
    <!--body generated with templates--> 
    <script src="js/main.js"></script> 
    </body> 
</html> 

Auf dem node.js Server:

route.get(req, function(url, type, hdr) { 
    if (type === 'error') { 
    //response 404 
    }else if (type === 'page') { 
    console.log(url); 
    fileSys.stat(url, function(err, stat) { 
     if (err) { 
     res.statusCode = 404; 
     res.setHeader("Content-Type","text/plain"); 
     res.write("404 Not Found"); 
     res.end(); 
     }else { 
     var file, 
     headers = {}, 
     modif = req.headers['if-modified-since']; 
     if (modif && new Date(modif).getTime() === stat.mtime.getTime()) { //STATUS 304 
      headers = { 
      'Last-Modified': stat.mtime.toUTCString(), 
      'Date': new Date().toUTCString() 
      }; 
      res.writeHead(304, headers); 
      res.end(); 
     }else { //STATUS 200 
      if (path.extname(url) === '.jpg' || path.extname(url) === '.png') 
      file = fileSys.readFileSync(url); 
      else { 
      if (fileSys.statSync(url).isDirectory()) 
       url += '/index.html'; 
      file = fileSys.readFileSync(url, 'binary'); 
      } 
      headers = { 
      'Last-Modified': stat.mtime.toUTCString(), 
      'Content-Length': stat.size, 
      'Cache-Control': 'public, max-age=31536000', 
      'ETag': url+'_'+stat.mtime.getTime(), 
      'Date': new Date().toUTCString() 
      }; 
      var contentType = contentExtens[path.extname(url)]; 
      if (contentType) 
      headers['Content-Type'] = contentType; 
      res.writeHeader(200, headers); 
      res.end(file); 
     } 
     } 
    }); 
    } 
}); 

Ich bin Ich arbeite mit dem Routing ohne Express und das Problem, auf das ich gestoßen bin, ist nach dem Löschen meines Chrome-Cache. Ich aktualisiere meine Indexseite und Serverseite. Ich protokolliere alle Anfragen, die die Indexseite, css, js, favicon und alle protokollieren die Bilder. Aber wenn ich die Indexseite ein anderes Mal neu lade, ist die einzige Anfrage, die kommt, für die Indexseite ohne ihre Ressourcen. Und in der Browser-Konsole ist alles 304 und wird aus dem Cache geladen. Ist das normales Verhalten? Wenn ich einige Änderungen an den Bildern oder irgendwelchen Ressourcendateien vornahm, kann ich die Zeit nicht vergleichen, da diese Anfragen nicht gesendet werden.

Auch ich habe auf Safari festgestellt, dass alle Ressourcen gesendet werden, auch nachdem der Cache, die letzten Änderungen und etag-Header gesetzt wurden. Verstehe ich nicht, wie das funktionieren soll, ist das eine Browser-Sache oder mache ich etwas falsch?

Antwort

0

Ich habe nicht ganz verstanden, wie Caching auf dem Browser funktioniert, bis ich gelesen und es öffnete meine Augen für die Tatsache, dass ich alles für ein Jahr zwischenspeichern. Die Hauptseite wird jedes Mal angefordert, aber die Ressourcen der Seite werden für ein Jahr zwischengespeichert und sie werden erst angefordert, wenn der Cache vom Benutzer gelöscht wurde oder ein Jahr verstrichen ist. Die Lösung besteht also darin, Cache Control auf no-cache zu setzen und trotzdem ETag auf einen Wert zu setzen. In diesem Fall wird eine Anfrage für jede Ressource gesendet und es liegt an Ihnen zu entscheiden, ob etwas geändert wurde. Oder cachen Sie weiter für einen langen Zeitraum, aber wenn Sie eine Ressource ändern, fügen Sie ihr einen Wert auf der Seite index.html hinzu (zB: main.V4.js oder mycss.x845.css). Der Browser wird auf diesen neuen Dateinamen stoßen und eine neue Anfrage senden.

Hoffe, das hilft jemandem, bitte etwas hinzufügen, wenn ich etwas falsch gemacht habe!