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 = (pathdata=> {
    if (fs.existsSync(path)) {
        errorLog(`${path}文件已存在`)
        return
    }
    return new Promise((resolvereject=> {
        fs.writeFile(pathdata'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((resolvereject=> {
        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(vueFilevueTemplate(componentName)) 
        log(`正在生成 page 文件 ${pageFile}`)
        await pageFiles(pageFile)
        log(`正在生成 entry 文件 ${entryFile}`)
        await generateFile(entryFileentryTemplate(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(directoryfunction() {
            resolve(true)
        })
    })
}
// 递归创建目录
function mkdirs(directorycallback) {
    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文件夹下

 

 

手痒的兄弟可以试试啦,如有问题请及时留言,不吝赐教

posted @ 2020-09-16 14:25  dmyling  阅读(107)  评论(0)    收藏  举报