commit f369a259c6c98a6682fb5af70700d173bdb5afc4 Author: gitea_1-h.cc Date: Wed Oct 15 00:46:02 2025 +0800 添加 Rolldown 拆包 diff --git a/Rolldown-%E6%8B%86%E5%8C%85.md b/Rolldown-%E6%8B%86%E5%8C%85.md new file mode 100644 index 0000000..4c2250a --- /dev/null +++ b/Rolldown-%E6%8B%86%E5%8C%85.md @@ -0,0 +1,113 @@ +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}`; + // } + // }, + // }, + ], + }, + }, + }, + } +}