const path = require('path') module.exports = function getSplitChunks () { const { normalizePath } = require('@dcloudio/uni-cli-shared') if (process.env.UNI_USING_V3) { if (!process.UNI_CONFUSION) { // 无加密 return false } return { cacheGroups: { vendor: { minSize: 0, minChunks: 1, test: function (module) { if (!module.resource) { return false } if (process.UNI_CONFUSION.includes(normalizePath(module.resource))) { return true } return false }, name: 'app-confusion', chunks: 'all' } } } } if (!process.env.UNI_USING_COMPONENTS) { return { cacheGroups: { commons: { minChunks: 2, name: 'common/vendor', chunks: 'all' } } } } const mainPath = normalizePath(path.resolve(process.env.UNI_INPUT_DIR, 'main.')) if (!process.env.UNI_OPT_SUBPACKAGES) { return { chunks (chunk) { // 防止 node_modules 内 vue 组件被 split return chunk.name.indexOf('node-modules') !== 0 }, cacheGroups: { default: false, vendors: false, commons: { test (module) { if (module.type === 'css/mini-extract') { return false } if (module.resource && ( module.resource.indexOf('.vue') !== -1 || module.resource.indexOf('.nvue') !== -1 || normalizePath(module.resource).indexOf(mainPath) === 0 // main.js )) { return false } return true }, minChunks: 1, name: 'common/vendor', chunks: 'all' } } } } function baseTest (module) { if (module.type === 'css/mini-extract') { return false } if (module.resource) { const resource = normalizePath(module.resource) if ( resource.indexOf('.vue') !== -1 || resource.indexOf('.nvue') !== -1 || resource.indexOf(mainPath) === 0 // main.js ) { return false } } return true } // TODO 独立分包 const cacheGroups = { default: false, vendors: false, commons: { test (module, chunks) { if (!baseTest(module)) { return false } const matchSubPackagesCount = findSubPackages(chunks).size const isMainPackage = ( // 非分包 或 两个及以上分包 或 主包内有使用 matchSubPackagesCount === 0 || matchSubPackagesCount > 1 || ( matchSubPackagesCount === 1 && hasMainPackage(chunks) ) ) if (isMainPackage && process.env.UNI_OPT_TRACE) { console.log('main', module.resource, chunks.map(chunk => chunk.name)) } return isMainPackage }, minSize: 0, minChunks: 1, name: 'common/vendor', chunks: 'all' } } const findSubPackages = function (chunks) { return chunks.reduce((pkgs, item) => { const name = normalizePath(item.name) const pkgRoot = subPackageRoots.find(root => name.indexOf(root) === 0) pkgRoot && pkgs.add(pkgRoot) return pkgs }, new Set()) } const hasMainPackage = function (chunks) { return chunks.find(item => !subPackageRoots.find(root => item.name.indexOf(root) === 0)) } const subPackageRoots = Object.keys(process.UNI_SUBPACKAGES).map(root => root + '/') Object.keys(process.UNI_SUBPACKAGES).forEach(root => { (function (root) { cacheGroups[root + '/commons'] = { test (module, chunks) { if (!baseTest(module)) { return false } const matchSubPackages = findSubPackages(chunks) if ( matchSubPackages.size === 1 && matchSubPackages.has(root + '/') && !hasMainPackage(chunks) ) { if (process.env.UNI_OPT_TRACE) { console.log(root, module.resource, chunks.map(chunk => chunk.name)) } return true } }, minSize: 0, minChunks: 1, name: normalizePath(path.join(root, 'common/vendor')), chunks: 'all' } })(root) }) return { chunks (chunk) { // 防止 node_modules 内 vue 组件被 split return chunk.name.indexOf('node-modules') !== 0 }, cacheGroups } }