descriptorCache.js 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. const fs = require('fs')
  2. const path = require('path')
  3. const { resolveCompiler } = require('./compiler')
  4. const cache = new Map()
  5. exports.setDescriptor = function setDescriptor(filename, entry) {
  6. cache.set(cleanQuery(filename), entry)
  7. }
  8. exports.getDescriptor = function getDescriptor(
  9. filename,
  10. options,
  11. loaderContext
  12. ) {
  13. filename = cleanQuery(filename)
  14. if (cache.has(filename)) {
  15. return cache.get(filename)
  16. }
  17. // This function should only be called after the descriptor has been
  18. // cached by the main loader.
  19. // If this is somehow called without a cache hit, it's probably due to sub
  20. // loaders being run in separate threads. The only way to deal with this is to
  21. // read from disk directly...
  22. const source = fs.readFileSync(filename, 'utf-8')
  23. const sourceRoot = path.dirname(
  24. path.relative(loaderContext.rootContext, loaderContext.resourcePath)
  25. )
  26. const { compiler, templateCompiler } = resolveCompiler(
  27. loaderContext.rootContext
  28. )
  29. const descriptor = compiler.parse({
  30. source,
  31. compiler: options.compiler || templateCompiler,
  32. filename,
  33. sourceRoot,
  34. needMap: loaderContext.sourceMap
  35. })
  36. cache.set(filename, descriptor)
  37. return descriptor
  38. }
  39. function cleanQuery(str) {
  40. const i = str.indexOf('?')
  41. return i > 0 ? str.slice(0, i) : str
  42. }