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

index.js 2.5 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. let path = require("path");
  2. let glob = require("fast-glob");
  3. let esbuild = require("esbuild");
  4. let html_plugin = require("./esbuild-plugin-html");
  5. let vue = require("esbuild-vue");
  6. let postCssPlugin = require("esbuild-plugin-postcss2").default;
  7. let ignore_assets = require("./ignore-assets");
  8. let {
  9. app_list,
  10. get_options_for_scss,
  11. get_public_path,
  12. run_serially
  13. } = require("./utils");
  14. const TOTAL_BUILD_TIME = "Total Build Time";
  15. (async function() {
  16. console.time(TOTAL_BUILD_TIME);
  17. await run_build_for_apps(app_list);
  18. console.timeEnd(TOTAL_BUILD_TIME);
  19. })();
  20. function run_build_for_apps(apps) {
  21. return run_serially(apps.map(app => () => run_build_for_app(app)));
  22. }
  23. function run_build_for_app(app) {
  24. let public_path = get_public_path(app);
  25. let include_patterns = path.resolve(public_path, "**", "*.bundle.js");
  26. let ignore_patterns = [
  27. path.resolve(public_path, "node_modules"),
  28. path.resolve(public_path, "build")
  29. ];
  30. return glob(include_patterns, { ignore: ignore_patterns }).then(files => {
  31. console.log(`\nBuilding assets for ${app}...`);
  32. return build_files({
  33. files,
  34. outdir: path.resolve(public_path, "build"),
  35. outbase: public_path
  36. });
  37. });
  38. }
  39. function build_files({ files, outdir, outbase }) {
  40. return esbuild
  41. .build({
  42. entryPoints: files,
  43. outdir,
  44. outbase,
  45. sourcemap: true,
  46. bundle: true,
  47. metafile: true,
  48. minify: true,
  49. define: {
  50. "process.env.NODE_ENV": "'development'"
  51. },
  52. plugins: [
  53. html_plugin,
  54. ignore_assets,
  55. vue(),
  56. postCssPlugin({
  57. plugins: [require("autoprefixer")],
  58. sassOptions: {
  59. ...get_options_for_scss(),
  60. importer: function(url) {
  61. if (url.startsWith("~")) {
  62. // strip ~ so that it can resolve from node_modules
  63. url = url.slice(1);
  64. }
  65. if (url.endsWith(".css")) {
  66. // strip .css from end of path
  67. url = url.slice(0, -4);
  68. }
  69. // normal file, let it go
  70. return {
  71. file: url
  72. };
  73. }
  74. }
  75. })
  76. ]
  77. // watch: {
  78. // onRebuild(error, result) {
  79. // if (error) console.error("watch build failed:", error);
  80. // else {
  81. // console.log("watch build succeeded:");
  82. // log_build_meta(result.metafile);
  83. // }
  84. // }
  85. // }
  86. })
  87. .then(result => {
  88. log_build_meta(result.metafile);
  89. })
  90. .catch(e => {
  91. console.error("Error during build");
  92. });
  93. }
  94. function log_build_meta(metafile) {
  95. for (let outfile in metafile.outputs) {
  96. if (outfile.endsWith(".map")) continue;
  97. let data = metafile.outputs[outfile];
  98. console.log(outfile, data.bytes / 1000 + " Kb");
  99. }
  100. }