module.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. const semver = require('semver')
  2. function resolveFallback (request, options) {
  3. const Module = require('module')
  4. const isMain = false
  5. const fakeParent = new Module('', null)
  6. const paths = []
  7. for (let i = 0; i < options.paths.length; i++) {
  8. const path = options.paths[i]
  9. fakeParent.paths = Module._nodeModulePaths(path)
  10. const lookupPaths = Module._resolveLookupPaths(request, fakeParent, true)
  11. if (!paths.includes(path)) paths.push(path)
  12. for (let j = 0; j < lookupPaths.length; j++) {
  13. if (!paths.includes(lookupPaths[j])) paths.push(lookupPaths[j])
  14. }
  15. }
  16. const filename = Module._findPath(request, paths, isMain)
  17. if (!filename) {
  18. const err = new Error(`Cannot find module '${request}'`)
  19. err.code = 'MODULE_NOT_FOUND'
  20. throw err
  21. }
  22. return filename
  23. }
  24. const resolve = semver.satisfies(process.version, '>=10.0.0')
  25. ? require.resolve
  26. : resolveFallback
  27. exports.resolveModule = function (request, context) {
  28. let resolvedPath
  29. try {
  30. resolvedPath = resolve(request, {
  31. paths: [context]
  32. })
  33. } catch (e) {}
  34. return resolvedPath
  35. }
  36. exports.loadModule = function (request, context, force = false) {
  37. const resolvedPath = exports.resolveModule(request, context)
  38. if (resolvedPath) {
  39. if (force) {
  40. clearRequireCache(resolvedPath)
  41. }
  42. return require(resolvedPath)
  43. }
  44. }
  45. exports.clearModule = function (request, context) {
  46. const resolvedPath = exports.resolveModule(request, context)
  47. if (resolvedPath) {
  48. clearRequireCache(resolvedPath)
  49. }
  50. }
  51. function clearRequireCache (id, map = new Map()) {
  52. const module = require.cache[id]
  53. if (module) {
  54. map.set(id, true)
  55. // Clear children modules
  56. module.children.forEach(child => {
  57. if (!map.get(child.id)) clearRequireCache(child.id, map)
  58. })
  59. delete require.cache[id]
  60. }
  61. }