刮刮前端
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.
 
 
 
 

88 lines
2.3 KiB

const t = require('@babel/types')
const uniI18n = require('@dcloudio/uni-cli-i18n')
const hyphenateRE = /\B([A-Z])/g
function cached (fn) {
const cache = Object.create(null)
return function cachedFn (str) {
const hit = cache[str]
return hit || (cache[str] = fn(str))
}
}
const hyphenate = cached((str) => {
return str.replace(hyphenateRE, '-$1').toLowerCase()
})
function findImportDeclaration (identifierName, path) {
const binding = path.scope.getBinding(identifierName)
if (!binding) {
return
}
if (t.isImportDeclaration(binding.path.parent)) {
return binding.path.parentPath
}
}
function parseComponents (names, path) {
const components = []
const dynamicImportMap = new Map()
names.forEach(({
name,
value
}) => {
const importDeclaration = findImportDeclaration(value, path)
if (!importDeclaration) {
throw new Error(uniI18n.__('mpLoader.componentReferenceErrorOnlySupportImport', {
0: name
}))
}
let source = importDeclaration.node.source.value
if (process.UNI_LIBRARIES && process.UNI_LIBRARIES.includes(source)) {
const componentName = hyphenate(name)
source = source + '/lib/' + componentName + '/' + componentName
}
const dynamicImportArray = dynamicImportMap.get(importDeclaration) || []
dynamicImportArray.push({
name,
value,
source
})
dynamicImportMap.set(importDeclaration, dynamicImportArray)
})
const importDeclarations = dynamicImportMap.keys()
for (const importDeclaration of importDeclarations) {
const dynamicImportArray = dynamicImportMap.get(importDeclaration)
dynamicImportArray.forEach((dynamicImport) => {
components.push(dynamicImport)
})
importDeclaration.remove()
}
return components
}
function findBabelLoader (loaders) {
return loaders.find(loader => loader.path.indexOf('babel-loader') !== -1)
}
const babelPluginDynamicImport = require.resolve('./plugin-dynamic-import')
function addDynamicImport (babelLoader, resourcePath, dynamicImports) {
babelLoader.options = babelLoader.options || {}
if (!babelLoader.options.plugins) {
babelLoader.options.plugins = []
}
babelLoader.options.plugins.push([babelPluginDynamicImport, {
resourcePath,
dynamicImports
}])
}
module.exports = {
addDynamicImport,
findBabelLoader,
parseComponents
}