Clone
2
Rolldown 拆包
gitea_1-h.cc edited this page 2025-10-15 00:46:29 +08:00
import path from 'node:path'
import type { BuildEnvironmentOptions } from 'vite'

export function createRolldownSplitChunks(): BuildEnvironmentOptions {
  // https://www.npmjs.com/package/utils4u/v/2.19.2?activeTab=code
  function _formatFilename(id: string, prefix: string) {
    const filename = path
      .basename(id)
      .split('?')[0]
      .replace(/\.\w+$/, '')
    return `${prefix}/${filename}`
  }
  function _isInNodeModules(id: string) {
    return id.includes('node_modules')
  }
  function _getPkgName(moduleId: string) {
    if (_isInNodeModules(moduleId)) {
      let pkgName = moduleId
      pkgName = pkgName.split('.pnpm/')?.[1] || pkgName
      pkgName = pkgName.split('node_modules/')?.[1] || pkgName
      pkgName = pkgName.startsWith('@')
        ? pkgName.split('/')[0] + '/' + pkgName.split('/')[1]
        : pkgName.split('/')[0]
      return pkgName
    }
  }

  return {
    rolldownOptions: {
      output: {
        advancedChunks: {
          groups: [
            {
              name: 'vendors',
              test(id) {
                return id.includes('node_modules')
              },
            },
            {
              name: 'app',
              test(id) {
                return !id.includes('node_modules')
              },
            },
            {
              name: 'vue',
              test(moduleId) {
                return _getPkgName(moduleId) === 'vue' || _getPkgName(moduleId)?.startsWith('@vue/')
              },
              priority: 20,
            },
            // {
            //   name(moduleId, _ctx) {
            //     if (_isInNodeModules(moduleId)) {
            //       let pkgName = moduleId
            //       pkgName = pkgName.split('.pnpm/')?.[1] || pkgName
            //       pkgName = pkgName.split('node_modules/')?.[1] || pkgName
            //       pkgName = pkgName.startsWith('@')
            //         ? pkgName.split('/')[0] + '/' + pkgName.split('/')[1]
            //         : pkgName.split('/')[0]
            //       if (pkgName.startsWith('@vue/')) pkgName = 'vue'

            //       // console.debug(`pkgName :>> `, pkgName)

            //       // if (
            //       //   pkgName === 'primevue' ||
            //       //   pkgName.startsWith('@primevue') ||
            //       //   pkgName.startsWith('@primeuix')
            //       // ) {
            //       //   return 'libs/primevue'
            //       // }
            //       console.debug(`_getPkgName(moduleId) :>> `, _getPkgName(moduleId))

            //       // if (pkgName === 'vue') {
            //       //   return 'libs/vue'
            //       // }
            //     }
            //   },
            //   priority: 10,
            // },
            // {
            //   name: (moduleId) => (moduleId.includes('node_modules') ? 'libs' : 'app'),
            //   // 1 KB = 1024 字节,所以 102400 ÷ 1024 = 100 KB
            //   // minSize: 100 * 1024,
            // },
            // {
            //   name: 'libs',
            //   test: /node_modules/,
            // },
            // {
            //   name: 'vue',
            //   test: /node_modules[\\/]vue/,
            // },
            // {
            //   name(moduleId, _ctx) {
            //     if (isInNodeModules(moduleId)) {
            //       let pkgName = moduleId
            //       pkgName = pkgName.split('.pnpm/')?.[1] || pkgName
            //       pkgName = pkgName.split('node_modules/')?.[1] || pkgName
            //       pkgName = pkgName.startsWith('@')
            //         ? pkgName.split('/')[0] + '/' + pkgName.split('/')[1]
            //         : pkgName.split('/')[0]
            //       if (pkgName.startsWith('@vue/')) pkgName = 'vue'
            //       return `libs/${pkgName}`;
            //     }
            //   },
            // },
          ],
        },
      },
    },
  }
}