使用plop快速创建express mvc模板代码
正在加载今日诗词....
2024-06-18

我们可以设置 Plop 来生成 /routes/xx, /controllers/xx, 和 /models/xx 文件,提供工作效率。

1. 安装 plop

npm install --save-dev plop

2. 创建 Plop 配置文件

在项目根目录下创建一个 plopfile.js 文件:

为了在 Plop 生成文件时将文件名或类名的首字母大写,我们可以使用 Handlebars 的自定义 helper 函数来处理模板中的名称。

在模板文件中,也可以使用这个自定义 helper 来生成类名或函数名的首字母大写。

module.exports = function (plop) {
  // 添加首字母大写的自定义 helper 可以对传入参数进行处理 用法{{ capitalize name }}
  plop.setHelper(
    'capitalize',
    (text) => text.charAt(0).toUpperCase() + text.slice(1)
  )
  // mvc generator
  plop.setGenerator('mvc', {
    description: 'Create a mvc template',
    prompts: [
      {
        type: 'input',
        name: 'name',
        message: '模块名称:',
      },
      {
        type: 'input',
        name: 'route',
        message: '路由前缀:',
      },
    ],
    actions: [
      {
        type: 'add',
        path: 'src/routes/{{name}}/index.js',
        templateFile: 'plop-templates/router.hbs',
      },
      {
        type: 'add',
        path: 'src/controllers/{{name}}Controller.js',
        templateFile: 'plop-templates/controller.hbs',
      },
      {
        type: 'add',
        path: 'src/models/{{name}}Model.js',
        templateFile: 'plop-templates/model.hbs',
      },
      // pattern正则表达式 用它来匹配目标文件追加的位置
      // template后面需添加$1,$1是pattern正则括号内匹配到的字符串,当发生替换时,占位符会连同模板文本一起替换掉目标文件中的占位符,所以这个占位符会一直存在于目标文件中,方便后续的追加
      {
        type: 'modify',
        path: 'src/routes/index.js',
        pattern: /(\/\/ 路由引入 不要删除此行注释)/gi,
        template: "import {{name}} from './{{name}}'\r$1",
      },
      {
        type: 'modify',
        path: 'src/routes/index.js',
        pattern: /(\/\/ 注册路由 不要删除此行注释)/gi,
        template: "router.use('/{{route}}', authMiddleware, {{name}})\r$1",
      },
    ],
  })
}

3. 创建模板文件

在项目根目录下创建一个 plop-templates 文件夹,并在其中创建三个模板文件:

plop-templates/controller.hbs

import {{capitalize name}}Model from '@/models/{{name}}Model.js'

// test
export const test = async (req, res) => {
  try {
    const result = await {{capitalize name}}Model.test()
    res.json(result)
  } catch (err) {
    res.status(500).json({ message: err.message })
  }
}

plop-templates/router.hbs

import express from 'express'
import * as {{capitalize name}}Controller from '@/controllers/{{name}}Controller.js'

const router = express.Router()

//  {{name}}路由
router.get('/', {{capitalize name}}Controller.test)

export default router

plop-templates/model.hbs

import pool from '@/config/database.js'

const {{capitalize name}}Model = {
  async test(type = '', client = '') {
    let connection
    try {
      connection = await pool.getConnection()
      let sql = 'SELECT COUNT(*) AS count FROM user_count'
      const [rows] = await connection.execute(sql, params)
      return rows
    } catch (error) {
      throw error
    } finally {
      if (connection) connection.release()
    }
  },
}

export default {{capitalize name}}Model

4. 配置 package.json

{
  ...
  "scripts": {
    ...
    "mvc": "plop mvc",
  },
  ...
}

执行 yarn mvc

yarn mvc
$ plop mvc
? 模块名称: oneIdManage
? 路由前缀: oneId
✔  ++ /src/routes/oneIdManage/index.js
✔  ++ /src/controllers/oneIdManageController.js
✔  ++ /src/models/oneIdManageModel.js
✔  +- /src/routes/index.js
✔  +- /src/routes/index.js
✨  Done in 6.22s.

京ICP备2022027737号
Copyright © 2022 - present @wangxiang

  • ☀️
  • 🌑