前端工程化-自動生成頁面

前言

咱們的項目是基於vue-cli搭建的,每次須要新加一個頁面須要操做如下步驟:html

  • 在views文件夾下面新建一個文件夾,用來存放新頁面的.vue文件。
  • 須要在routes.js文件裏面新添加一個路由。

按照上述操做之後,才能夠正常訪問新添加的頁面,以後纔開始對新頁面進行正常開發。可是這樣的機械化步驟咱們徹底能夠用代碼幫咱們執行,更進一步,對於一些簡單的頁面,咱們甚至能夠一鍵生成頁面,包括從後端請求數據等操做。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

按照配置文件生成頁面.vue文件

咱們在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>複製代碼
相關文章
相關標籤/搜索