createHtml.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import esbuild from "esbuild";
  2. import htmlMinifier from "html-minifier-terser";
  3. import fsSync from "fs";
  4. const fs = fsSync.promises;
  5. export default async ()=>{
  6. const esbuildProm = esbuild.build({
  7. entryPoints: [`${global.cwd}/views/index.js`, `${global.cwd}/views/index.css`],
  8. bundle: true,
  9. minify: true,
  10. sourcemap: process.env.NODE_ENV === "production",
  11. write: false,
  12. outdir: `${global.cwd}/views/build/`
  13. });
  14. const htmlProm = fs.readFile(`${import.meta.dirname}/views/index.html`, "utf-8");
  15. const [build, html] = await Promise.all([esbuildProm, htmlProm]);
  16. let js, css;
  17. for(let i = 0; i < build.outputFiles.length; i++){
  18. if(build.outputFiles[i].path.endsWith(".js")){
  19. js = build.outputFiles[i].text;
  20. }else if(build.outputFiles[i].path.endsWith(".css")){
  21. css = build.outputFiles[i].text;
  22. }
  23. }
  24. let data = await htmlMinifier.minify(html, {
  25. collapseBooleanAttributes: true,
  26. collapseInlineTagWhitespace: true,
  27. collapseWhitespace: true,
  28. conservativeCollapse: true,
  29. decodeEntities: true,
  30. noNewlinesBeforeTagClose: true,
  31. removeComments: true
  32. });
  33. data = data.replace('<script src="/index.js"></script>', `<script>${js}</script>`);
  34. data = data.replace('<link rel="stylesheet" href="/index.css">', `<style>${css}</style>`);
  35. if(process.env.NODE_ENV !== "production"){
  36. fs.writeFile(`${import.meta.dirname}/build.html`, data);
  37. }
  38. return data;
  39. }