You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
195 lines
4.9 KiB
195 lines
4.9 KiB
const path = require('path')
|
|
|
|
const {
|
|
normalizePath
|
|
} = require('@dcloudio/uni-cli-shared')
|
|
|
|
function createCacheGroups () {
|
|
const cacheGroups = {}
|
|
if (process.UNI_CONFUSION) { // 加密
|
|
cacheGroups.confusion = {
|
|
enforce: true,
|
|
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'
|
|
}
|
|
}
|
|
|
|
process.env.UNI_OPT_SUBPACKAGES && Object.keys(process.UNI_SUBPACKAGES).forEach(root => {
|
|
cacheGroups[root] = {
|
|
enforce: true,
|
|
test: function (module) {
|
|
if (!module.resource) {
|
|
return false
|
|
}
|
|
if (normalizePath(module.resource).includes(root + '/')) {
|
|
return true
|
|
}
|
|
return false
|
|
},
|
|
name: root + '/app-sub-service',
|
|
chunks: 'all'
|
|
}
|
|
})
|
|
return cacheGroups
|
|
}
|
|
|
|
module.exports = function getSplitChunks () {
|
|
const {
|
|
normalizePath
|
|
} = require('@dcloudio/uni-cli-shared')
|
|
|
|
if (process.env.UNI_USING_V3) {
|
|
return {
|
|
cacheGroups: createCacheGroups()
|
|
}
|
|
}
|
|
|
|
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
|
|
}
|
|
}
|
|
|