setupRoute.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. import { dirname, resolve } from "path";
  2. import { fileURLToPath } from "url";
  3. import fs from "fs";
  4. import { createHash } from "crypto";
  5. const __filename = fileURLToPath(import.meta.url);
  6. const __dirname = dirname(__filename);
  7. export default async function setupRoute(context, options) {
  8. options = options || {};
  9. options.block =
  10. options.block ||
  11. /(\.png)|(\.jpg)|(\.svg)|(\.otf)|(\.woff)|(\.woff2)|(\.ttf)|(\.mp3)|(google)|(facebook)|(ada\.support)/;
  12. options.cache = options.cache || /(\.js)|(\.css)/;
  13. await context.route(options.block, (route, request) => route.abort());
  14. await context.route(options.cache, async (route, request) => {
  15. const fileName = resolve(
  16. __dirname,
  17. "cache",
  18. createHash("md5").update(request.url()).digest("hex")
  19. );
  20. if (fs.existsSync(fileName)) {
  21. await route.fulfill({
  22. body: fs.readFileSync(fileName),
  23. contentType: /\.js$/.test(request.url())
  24. ? "application/javascript"
  25. : "text/css",
  26. });
  27. } else {
  28. const response = await route.fetch();
  29. fs.writeFileSync(fileName, await response.body());
  30. await route.fulfill({
  31. response,
  32. });
  33. }
  34. });
  35. }