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


前言

我們的項目是基於vue-cli搭建的,每次需要新加一個頁面需要操作以下步驟:

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

按照上述操作以后,才可以正常訪問新添加的頁面,之后才開始對新頁面進行正常開發。但是這樣的機械化步驟我們完全可以用代碼幫我們執行,更進一步,對於一些簡單的頁面,我們甚至可以一鍵生成頁面,包括從后端請求數據等操作。

自動生成頁面

我們可以按照模板的方式生成想要的頁面,我這里說兩種頁面,

  • 一種是什么都沒有的空白頁,生成空白頁就相當於是初始化一個新頁面然后接着開發。
  • 另一種是生成一些比較固定布局的簡單頁面,比如我們的業務中經常會有需求是寫一個頁面,就一個表格展示一下后端返回的數據,頂多就是再加個刪除,添加和編輯。像這種簡單的頁面,完全可以使用代碼自動生成。

我這里主要是使用配置文件的方式來設置我們的模板。

生成表格頁

為了操作方便,我們可以在項目根目錄新建一個auto-build-page文件夾用來存放我們之后要寫的所有代碼和模板。

編輯配置文件

我們在auto-build-page文件夾下新建一個addConfig.js文件,里面存放我們定義的配置:

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
復制代碼

配置的含義在注釋中已經詳細說明了

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

我們在auto-build-page文件夾下新建一個template-table.vue文件,存放我們的表格頁模版,我們使用的是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文件,里面寫的是整個自動化操作的代碼

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模塊完成。 讀取模板文件,並根據配置文件,對模板文件里面的變量進行替換:

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>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM