createHtml.js 1.4 KB

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