vux-loader-ig
Version:
extended loader for vue-loader && solve path of vux components
73 lines (63 loc) • 2.29 kB
JavaScript
const utils = require('loader-utils')
const fs = require('fs')
module.exports = function(source) {
this.cacheable()
const _this = this
const config = this.vux || utils.getLoaderConfig(this, 'vux')
if (!config.plugins || !config.plugins.length) {
return source
}
var myResourcePath = this.resourcePath.replace(/\\/g, '/');
const isVuxComponent = myResourcePath.indexOf('/wenda_branch/src/components') > -1
//如果是二层深度目录引用vux,则加上../.. --2017/5/8 龙鸿轩
let deep = this.resourcePath.substr(myResourcePath.indexOf('/src')).split('\\').length;
if (config.plugins.length) {
config.plugins.forEach(function(plugin) {
// script-parser
if (plugin.name === 'script-parser') {
if (plugin.fn) {
source = plugin.fn.call(_this, source)
}
}
})
}
if (config.options.useVuxUI && /}\s+from(.*?)'vux/.test(source)) {
const maps = this.vuxMaps || utils.getLoaderConfig(this, 'vuxMaps')
const parser = require('./libs/import-parser')
source = parser(source, function(opts) {
let str = ''
opts.components.forEach(function(component) {
let file = `vux/${maps[component.originalName]}`
if (config.options.vuxDev) {
if (/App\.vue/.test(_this.resourcePath)) {
file = file.replace(/vux\/src/g, '.')
} else {
let relative = '..'
// component file import other functions
if (isVuxComponent && !/components/.test(file)) {
relative = '../..'
}
if (deep == 5) {
relative = '../..'
} else if (deep == 6) {
relative = '../../..'
} else if (deep == 7) {
relative = '../../../..'
}
file = file.replace(/vux\/src/g, relative)
}
}
str += `import ${component.newName} from '${file}'\n`
})
return str
}, 'vux')
}
if (config.options.vuxWriteFile === true) {
fs.writeFileSync(this.resourcePath + '.vux.js', source)
}
return source
}
function camelCaseToDash(str) {
return str.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase()
}