manualChunks.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. // Copyright (C) 2012-2023 Zammad Foundation, https://zammad-foundation.org/
  2. const { splitVendorChunk } = require('vite')
  3. const graphqlChunk = ['graphql', '@apollo', '@vue/apollo']
  4. const isGraphqlChunk = (id) =>
  5. graphqlChunk.some((chunk) => id.includes(`node_modules/${chunk}`))
  6. /**
  7. * @returns {import("vite").Plugin}
  8. */
  9. const PluginManualChunks = () => {
  10. const getChunk = splitVendorChunk()
  11. const graphqlIds = new Set()
  12. return {
  13. name: 'zammad:manual-chunks',
  14. config() {
  15. return {
  16. build: {
  17. rollupOptions: {
  18. output: {
  19. manualChunks(id, api) {
  20. const chunk = getChunk(id, api)
  21. // TODO why keep it in js?
  22. // maybe put it inside html?
  23. // al it does is appends a node with svgs
  24. if (id === 'virtual:svg-icons-register') {
  25. return 'icons'
  26. }
  27. if (chunk !== 'vendor') return chunk
  28. if (id.includes('node_modules/lodash-es')) {
  29. return 'lodash'
  30. }
  31. const { importers } = api.getModuleInfo(id)
  32. if (
  33. graphqlIds.has(id) ||
  34. isGraphqlChunk(id) ||
  35. importers.some(isGraphqlChunk)
  36. ) {
  37. importers.forEach(() => graphqlIds.add(id))
  38. return 'graphql'
  39. }
  40. if (/node_modules\/@?vue/.test(id)) {
  41. return 'vue'
  42. }
  43. return 'vendor'
  44. },
  45. },
  46. },
  47. },
  48. }
  49. },
  50. }
  51. }
  52. module.exports = PluginManualChunks