const path = require('path')
|
const loaderUtils = require('loader-utils')
|
|
const {
|
parse
|
} = require(require.resolve('@vue/component-compiler-utils', {
|
paths: [require.resolve('vue-loader')]
|
})) // 确保使用的与 vue-loader 一致
|
|
const {
|
getPlatformFilterTag,
|
normalizeNodeModules
|
} = require('@dcloudio/uni-cli-shared/lib/platform')
|
|
const FILTER_TAG = getPlatformFilterTag()
|
|
module.exports = function (source) {
|
const loaderContext = this
|
|
const {
|
sourceMap,
|
rootContext,
|
resourcePath
|
} = loaderContext
|
|
const options = loaderUtils.getOptions(loaderContext) || {}
|
|
const filename = path.basename(resourcePath)
|
const context = rootContext || process.cwd()
|
const sourceRoot = path.dirname(path.relative(context, resourcePath))
|
// 使用 @vue/component-compiler-utils 来处理,共用 cache
|
const descriptor = parse({
|
source,
|
compiler: options.compiler,
|
filename,
|
sourceRoot,
|
needMap: sourceMap
|
})
|
|
if (!descriptor.template || !FILTER_TAG) {
|
// delete customBlocks
|
descriptor.customBlocks.length = 0
|
return source
|
}
|
|
const modules = Object.create(null)
|
|
descriptor.customBlocks = descriptor.customBlocks.filter(block => {
|
if (
|
block.attrs.module &&
|
(
|
block.type === FILTER_TAG ||
|
block.attrs.lang === FILTER_TAG
|
)
|
) {
|
modules[block.attrs.module] = block
|
return true
|
}
|
if ( // renderjs
|
options.isAppView &&
|
(
|
block.type === 'renderjs' ||
|
block.attrs.lang === 'renderjs'
|
)
|
) {
|
return true
|
}
|
})
|
|
if (Object.keys(modules).length) {
|
const filterModules = JSON.parse(JSON.stringify(modules))
|
Object.keys(filterModules).forEach(name => {
|
const filterModule = filterModules[name]
|
if (filterModule.attrs.src) {
|
filterModule.attrs.src = normalizeNodeModules(filterModule.attrs.src)
|
}
|
})
|
descriptor.template.attrs['filter-modules'] = JSON.stringify(filterModules)
|
}
|
|
return source
|
}
|