vue结合webpack 实现路由去中心化,快速创建项目
做VUE项目过程中,很多时候把路由写在同一个路由文件中,项目越来越大时,该文件需要多次修改,且每次创建页面都需要手动添加,很不方便
1.利用node集合webpack实现命令行快速创建组件
(1) 根目录下创建script文件夹 。

generate文件夹下负责创建父路由 base文件夹创建子路由
代码如下
baseComponents.js
// index.js
const chalk = require('chalk')
const path = require('path')
const fs = require('fs')
const resolve = (...file) => path.resolve(__dirname, ...file)
const log = message => console.log(chalk.green(`${message}`))
const successLog = message => console.log(chalk.blue(`${message}`))
const errorLog = error => console.log(chalk.red(`${error}`))
// 导入模板
const {
vueTemplate,
entryTemplate
} = require('./generatetemplate')
// 生成文件
const generateFile = (path, data) => {
if (fs.existsSync(path)) {
errorLog(`${path}文件已存在`)
return
}
return new Promise((resolve, reject) => {
fs.writeFile(path, data, 'utf8', err => {
if (err) {
errorLog(err.message)
reject(err)
} else {
resolve(true)
}
})
})
}
const pageFiles =(path) => {
if (fs.existsSync(path)) {
errorLog(`${path}文件已存在`)
return
}
return new Promise((resolve, reject) => {
fs.mkdir(path,err => {
if (err) {
errorLog(err.message)
reject(err)
} else {
resolve(true)
}
})
})
}
log('请输入要生成的页面组件名称、会生成在 views/目录下')
let componentName = ''
process.stdin.on('data', async chunk => {
// 组件名称
const inputName = String(chunk).trim().toString()
// Vue页面组件路径 **注意这里的路径,一定要写对,我这里是直接构建的vue-element-admin的项目,你们根据需要填写路径**
const componentPath = resolve('../src/views', inputName)
// vue文件
const vueFile = resolve(componentPath, 'main.vue')
const pageFile = resolve(componentPath, 'pages') //生成page文件 存放子路由文件
// 入口文件
const entryFile = resolve(componentPath, 'index.js')
// 判断组件文件夹是否存在
const hasComponentExists = fs.existsSync(componentPath)
if (hasComponentExists) {
errorLog(`${inputName}页面组件已存在,请重新输入`)
return
} else {
log(`正在生成 component 目录 ${componentPath}`)
await dotExistDirectoryCreate(componentPath)
}
try {
// 获取组件名
if (inputName.includes('/')) {
const inputArr = inputName.split('/')
componentName = inputArr[inputArr.length - 1]
} else {
componentName = inputName
}
log(`正在生成 vue 文件 ${vueFile}`)
await generateFile(vueFile, vueTemplate(componentName))
log(`正在生成 page 文件 ${pageFile}`)
await pageFiles(pageFile)
log(`正在生成 entry 文件 ${entryFile}`)
await generateFile(entryFile, entryTemplate(componentName))
successLog('生成成功')
} catch (e) {
errorLog(e.message)
}
process.stdin.emit('end')
})
process.stdin.on('end', () => {
log('exit')
process.exit()
})
function dotExistDirectoryCreate(directory) {
return new Promise((resolve) => {
mkdirs(directory, function() {
resolve(true)
})
})
}
// 递归创建目录
function mkdirs(directory, callback) {
var exists = fs.existsSync(directory)
if (exists) {
callback()
} else {
mkdirs(path.dirname(directory), function() {
fs.mkdirSync(directory)
callback()
})
}
}
在basetemplate.js中生成对应模板
module.exports = {
vueTemplate: compoenntName => {
return `<template>
<div class="${compoenntName}">
${compoenntName}组件
</div>
</template>
<script>
export default {
name: '${compoenntName}'
};
</script>
<style lang="scss" scoped>
.${compoenntName} {
};
</style>`
},
entryTemplate: compoenntName => {
return `import ${compoenntName} from './main.vue'
const pageFiles = require.context('./pages',true,/\.js$/);
let pageFilesArray = [];
pageFiles.keys().forEach(key => {
//注意此处,此处path 是为了动态拼接子路由的写法
pageFilesArray.push({
path:pageFiles(key).default[0].name,
component:pageFiles(key).default[0].component
})
})
export default [{
path: "/${compoenntName}",
name: "${compoenntName}",
component: ${compoenntName},
children:pageFilesArray
}]`
}
}
最后修改 package.json文件夹

通过运行 npm run new:view 就能自动创建文件夹。
此时路由的去中心化 还需要在 router文件夹下创建对应的路由文件

files.js代码如下,通过 require.context 实现路由去中心化
const pageFiles = require.context('../views',true,/index.js$/);
let pageFilesArray = [];
pageFiles.keys().forEach(key => {
pageFilesArray = pageFilesArray.concat(pageFiles(key).default)
})
export default pageFilesArray
index.js代码如下
import Vue from 'vue'
import Router from 'vue-router'
import allRouter from './files.js'
let matchRouters = [
{
path:'/',
redirect:'/login'
}];
Vue.use(Router)
let router = new Router({
mode:'history',
routes: [...allRouter].concat(matchRouters)
})
export default router
此处matchRouters是为了添加初始化重定向页面
接下来 记得在main.js文件中导入router下的 index.js
至此,就可以通过命令行 npm run new:view 快速创建项目了,路由也自动生成,不需要去手动添加路由。
子路由的创建配置 和上面大致相同。 需要将子路由页面 创建在 父路由页面对应的 pages文件夹下

手痒的兄弟可以试试啦,如有问题请及时留言,不吝赐教
浙公网安备 33010602011771号