咱們的項目是基於vue-cli搭建的,每次須要新加一個頁面須要操做如下步驟:html
按照上述操做之後,才能夠正常訪問新添加的頁面,以後纔開始對新頁面進行正常開發。可是這樣的機械化步驟咱們徹底能夠用代碼幫咱們執行,更進一步,對於一些簡單的頁面,咱們甚至能夠一鍵生成頁面,包括從後端請求數據等操做。vue
自動生成頁面咱們能夠按照模板的方式生成想要的頁面,我這裏說兩種頁面,node
我這裏主要是使用配置文件的方式來設置咱們的模板。ios
爲了操做方便,咱們能夠在項目根目錄新建一個auto-build-page文件夾用來存放咱們以後要寫的全部代碼和模板。vue-cli
咱們在auto-build-page文件夾下新建一個addConfig.js文件,裏面存放咱們定義的配置:shell
var addConfig = [ {// 測試生成表格頁open: true, // 參與生成 false表示改配置不參與生成頁面helloworld: false, // 是不是空白頁desc: '自動生成表格頁', // 頁面描述name: 'autoTablepage', // 頁面名稱getlist: { // 表格數據請求相關 method: 'GET', url: 'http://test.req/getlist', }, }, {// 測試生成空白頁open: true,helloworld: true,desc: '自動生成空白頁面',name: 'autoHellopage', }, ]module.exports = addConfig複製代碼
配置的含義在註釋中已經詳細說明了npm
咱們在auto-build-page文件夾下新建一個template-table.vue文件,存放咱們的表格頁模版,咱們使用的是element-ui組件:element-ui
<template> <div class="deduction"><header>%title%</header><main> <el-table :data="tableData" style="width: 100%"><el-table-column type="expand"> <template v-slot="props"><pre v-html="formatOther(props.row)"></pre> </template></el-table-column><el-table-column v-for="(item,index) in tableDataHeader" :key="index" :prop="item.prop" :label="item.col"> <template slot-scope="scope">{{scope.row[scope.column.property]}}<!-- {{scope.row}} {{scope.column.property}} --><!-- 渲染對應表格裏面的內容 --> </template></el-table-column> </el-table></main> </div></template><script>import axios from "axios";const CONFIG={ method:"%method%", geturl:"%geturl%", };export default { data() {return { tableData: [], tableDataHeader: [], }; }, methods: {formatOther(row) { return JSON.stringify(row, null, 2); },getList(params={}) { axios({method: CONFIG.method,url: CONFIG.geturl,data: params }).then(res=>{ // 後端返回的數據須要按照這種格式console.log(res);this.tableData=res.data.tableData;this.tableDataHeader=res.data.tableDataHeader; }); } }, mounted(){this.getList(); } };</script>複製代碼
能夠看見表格頁模板裏面有不少兩個%包起來的變量,這是等下咱們須要按照配置文件進行替換的變量。 咱們繼續在auto-build-page文件夾下新建一個build-page.js文件,裏面寫的是整個自動化操做的代碼json
var addConfig = require('./addConfig')var fs = require('fs')var path = require('path')var shell = require('shelljs') shell.echo('>>>>>>') shell.echo('開始新建頁面') addConfig.forEach((ele) => { if (ele.open) { buildPage(ele) } })複製代碼
咱們循環配置文件裏面的配置,支持生成多個頁面。對文件的操做咱們直接使用node的fs模塊完成。 讀取模板文件,並根據配置文件,對模板文件裏面的變量進行替換:axios
function buildPage(config) { var paths = path.resolve(`./src/views/${config.name}`) shell.echo('頁面地址:' + paths) mkdirSync(paths, function() {var str = ''if (config.helloworld) { // 新建空白頁,讀取空白頁模版 str = handleStr( readF(path.resolve('./template-helloworld.vue')), config ) } else { str = handleStr( readF(path.resolve('./template-table.vue')), config ) }// 寫入文件writeF(paths + '/index.vue', str) shell.echo('開始新增路由……') addRou(`./views/${config.name}/index.vue`, config) }) }複製代碼
根據配置文件替換%包起來的變量:
function handleStr(str, config) { if (config.helloworld) {return str } str = str.replace('%title%', config.desc) str = str.replace('%method%', config.getlist.method) str = str.replace('%geturl%', config.getlist.url) return str }複製代碼
接下來是添加路由,在此以前咱們仍是須要添加一個路由的模板文件,在auto-build-page文件夾下新建一個template-route.txt文件:
{ path: '%path%', component: Home, name: '%name%', redirect: { path: '%repath%' }, children: [ { path: '%repath%', component: (resolve) =>require(['%requirepath%'], resolve), name: '%name2%'} ] },複製代碼
裏面根據咱們路由規則,寫入模板。 回到build-page.js文件,咱們繼續書寫添加路由的操做,咱們先讀取路由模板:
function addRou(paths, config) { var templateStr = handleRouStr( readF(path.resolve('./auto-build-page/template-route.txt')), config, paths ) // 添加到路由文件 addToConf(templateStr) }function handleRouStr(str, config, paths) { str = str.replace(/%path%/g, `/${config.name}`) str = str.replace(/%name%/g, config.desc) str = str.replace(/%name2%/g, `${config.desc}首頁`) str = str.replace(/%repath%/g, `/${config.name}/index`) str = str.replace(/%requirepath%/g, paths) return str }複製代碼
將路由添加到vue項目src下的routes.js文件裏面:
function addToConf(str) { str += '// add-flag' // 添加的位置標記 var confStr = handleConfRouStr(readF(path.resolve('./src/addRoute.js')), str) writeF(path.resolve('./src/addRoute.js'), confStr) shell.echo('路由添加成功!') shell.echo('結束生成頁面') shell.echo('>>>>>>') }function handleConfRouStr(ori, str) { ori = ori.replace('// add-flag', str) return ori }複製代碼
我這裏是爲了不原來的routes.js文件,我新建了一個addRoute.js文件,而後在routes.js文件中引入,和原來的合併如下便可。 routes.js:
// 自動生成頁面--自動添加路由import addRoute from './addRoute'let routes = []let lastRoute = routes.concat(addRoute)export default lastRoute複製代碼
addRoute.js:
const addRoute = [ // add-flag // 不能刪除]export default addRoute複製代碼
接下來咱們須要在package.json文件裏面的scripts裏面添加運行的腳本,這樣,只須要執行npm run 命令就能夠運行自動生成的操做:
複製代碼
"scripts": { "dev": "vue-cli-service serve", "build": "vue-cli-service build", "bpage": "node ./auto-build-page/build-page.js" },
如今執行npm run bpage 控制檯輸出: >>>>>> 開始新建頁面 頁面地址:./src/views/autoTablepage 頁面地址:./src/views/autoHellopage 開始新增路由…… 路由添加成功! 結束生成頁面 >>>>>>複製代碼
只須要添加一個空白頁的模板就行,在auto-build-page文件夾下新建一個template-helloword.vue文件:
<template> <div>hello world </div></template><script>export default { data() {return {}; }, methods: {}, mounted() {} };</script>複製代碼