提交学习笔记专用
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.

80 lines
1.8 KiB

  1. "use strict";
  2. const LoaderLoadingError = require("./LoaderLoadingError");
  3. let url;
  4. function handleResult(loader, module, callback) {
  5. if (typeof module !== "function" && typeof module !== "object") {
  6. return callback(
  7. new LoaderLoadingError(
  8. `Module '${
  9. loader.path
  10. }' is not a loader (export function or es6 module)`
  11. )
  12. );
  13. }
  14. loader.normal = typeof module === "function" ? module : module.default;
  15. loader.pitch = module.pitch;
  16. loader.raw = module.raw;
  17. if (
  18. typeof loader.normal !== "function" &&
  19. typeof loader.pitch !== "function"
  20. ) {
  21. return callback(
  22. new LoaderLoadingError(
  23. `Module '${
  24. loader.path
  25. }' is not a loader (must have normal or pitch function)`
  26. )
  27. );
  28. }
  29. callback();
  30. }
  31. module.exports = function loadLoader(loader, callback) {
  32. if (loader.type === "module") {
  33. try {
  34. if (url === undefined) url = require("url");
  35. // eslint-disable-next-line n/no-unsupported-features/node-builtins
  36. const loaderUrl = url.pathToFileURL(loader.path);
  37. // eslint-disable-next-line no-eval
  38. const modulePromise = eval(
  39. `import(${JSON.stringify(loaderUrl.toString())})`
  40. );
  41. modulePromise.then((module) => {
  42. handleResult(loader, module, callback);
  43. }, callback);
  44. } catch (err) {
  45. callback(err);
  46. }
  47. } else {
  48. let loadedModule;
  49. try {
  50. loadedModule = require(loader.path);
  51. } catch (err) {
  52. // it is possible for node to choke on a require if the FD descriptor
  53. // limit has been reached. give it a chance to recover.
  54. if (err instanceof Error && err.code === "EMFILE") {
  55. const retry = loadLoader.bind(null, loader, callback);
  56. if (typeof setImmediate === "function") {
  57. // node >= 0.9.0
  58. return setImmediate(retry);
  59. }
  60. // node < 0.9.0
  61. return process.nextTick(retry);
  62. }
  63. return callback(err);
  64. }
  65. return handleResult(loader, loadedModule, callback);
  66. }
  67. };