async-chunk-resource-hints.js 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. 'use strict';
  2. const CHUNK_OPTIONS = ['all', 'async'];
  3. const getPublicPath = require('./common.js').getPublicPath;
  4. const createResourceHint = require('./resource-hints.js').createResourceHint;
  5. const matches = require('./common.js').matches;
  6. const addAsyncChunkResourceHints = (chunks, options) => {
  7. const getRef = generateRef(options);
  8. const hints = [];
  9. chunks
  10. .filter(chunk => !isInitial(chunk))
  11. .reduce(
  12. (files, chunk) => files.concat(chunk.files),
  13. [])
  14. .forEach(file => {
  15. if (optionsMatch(options.preload, file)) {
  16. hints.push(createResourceHint('preload', getRef(file)));
  17. } else if (optionsMatch(options.prefetch, file)) {
  18. hints.push(createResourceHint('prefetch', getRef(file)));
  19. }
  20. });
  21. return hints;
  22. };
  23. const isInitial = chunk =>
  24. chunk.canBeInitial
  25. ? chunk.canBeInitial()
  26. : chunk.isInitial
  27. ? chunk.isInitial()
  28. : chunk.isInitial;
  29. const optionsMatch = (option, file) => {
  30. return matches(option.chunks, CHUNK_OPTIONS) && matches(file, option.test);
  31. };
  32. const generateRef = options => {
  33. const publicPath = getPublicPath(options);
  34. return publicPath
  35. ? file => publicPath + file
  36. : file => file;
  37. };
  38. module.exports = addAsyncChunkResourceHints;