You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

update-service-worker.js 3.2 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. const fs = require('fs');
  2. const path = require('path');
  3. const crypto = require('crypto');
  4. const servers = [
  5. {
  6. code:"ja"
  7. },
  8. {
  9. code:"en"
  10. },
  11. {
  12. code:"ko"
  13. }
  14. ];
  15. function filesHashArr(dirName, extName, excludeName) {
  16. const dirFiles = fs.readdirSync(dirName);
  17. const hashArr = [];
  18. for (let fileName of dirFiles) {
  19. if (
  20. typeof(extName) == "string" && path.extname(fileName) !== extName || //如果扩展名是字符串,不匹配则跳过
  21. extName instanceof RegExp && !extName.test(path.extname(fileName)) || //如果扩展名是正则表达式,不匹配则跳过
  22. Array.isArray(extName) && extName.every(ext=>path.extname(fileName) !== ext) //如果扩展名是数组,则多次匹配字符串,不匹配则跳过
  23. ) continue;
  24. if (excludeName && (
  25. typeof(excludeName) == "string" && fileName.includes(excludeName) || //如果文件名包含排除名则跳过
  26. excludeName instanceof RegExp && excludeName.test(fileName) || //如果是正则表达式,匹配则跳过
  27. Array.isArray(excludeName) && excludeName.some(exclude=>fileName.includes(exclude)) //如果扩展名是数组,则多次匹配字符串,不匹配则跳过
  28. )) continue;
  29. const fullFileName = path.join(dirName, fileName);
  30. const file = fs.readFileSync(fullFileName);
  31. const cardHash = crypto.createHash('md5');
  32. cardHash.update(file);
  33. const md5 = cardHash.digest('hex');
  34. console.log(fullFileName, md5);
  35. hashArr.push([fullFileName.replaceAll("\\", "\/"), md5]);
  36. }
  37. return hashArr;
  38. }
  39. const cachesArr = [];
  40. for (let server of servers) {
  41. const cardsHash = filesHashArr(`./images/cards_${server.code}`);
  42. cachesArr.push(...cardsHash);
  43. const voiceHash = filesHashArr(`./sound/voice/${server.code}`);
  44. cachesArr.push(...voiceHash);
  45. }
  46. //字体
  47. const fontsHash = filesHashArr("./fonts", /\.woff2?$/i);
  48. cachesArr.push(...fontsHash);
  49. //程序
  50. const programHash = filesHashArr("./", /\.(js|html|css)$/i, ["package", "service-worker"]);
  51. cachesArr.push(...programHash);
  52. //语言
  53. const lanuageHash = filesHashArr("./languages", /\.(js|css)$/i);
  54. cachesArr.push(...lanuageHash);
  55. //UI图片
  56. const UiImageHash = filesHashArr("./images", /\.(png|webp|svg)$/i);
  57. cachesArr.push(...UiImageHash);
  58. //第三方库
  59. const libraryHash = filesHashArr("./library", /\.js/i); //第三方库
  60. cachesArr.push(...libraryHash);
  61. const library_aaaHash = filesHashArr("./library/jy4340132-aaa", /\.(js|wasm)$/i); //播放语音的库
  62. cachesArr.push(...library_aaaHash);
  63. //数据
  64. // const dataHash = filesHashArr("./monsters-info", /\.json$/i);
  65. // cachesArr.push(...dataHash);
  66. //文档
  67. const docHash = filesHashArr("./doc", /\.html$/i);
  68. cachesArr.push(...docHash);
  69. const docImageHash = filesHashArr("./doc/images", /\.(png|webp|svg)$/i);
  70. cachesArr.push(...docImageHash);
  71. const swJs = fs.readFileSync('./service-worker.js', 'utf-8');
  72. let formatterHashes = true;
  73. const newSwJs = swJs.replace(/(const\s+cachesMap\s*=\s*)[\s\S]+?;/i, `$1new Map(${JSON.stringify(cachesArr, undefined, formatterHashes ? "\t" : undefined)});`);
  74. fs.writeFileSync('./service-worker.js', newSwJs, 'utf-8');
  75. console.log("更新 service-worker.js 完毕");