为什么可以npm init egg —type=simple?
因为相当于执行了create-egg这个包
image.png

发布vue2模板到npm

模板开发先创建一个新的文件夹,命名为haha-cli-dev-template-vue2,文件夹中每一个项目都是一个模板,npm init,配置项目基本信息。
新建一个目录template,利用vue create vue-test2(vue cli),这个是真正的模板模块。
使用npm publish把模板发送到npm中。
image.png

Egg搭建后台,连接mysql,并通过API返回数据

使用npm init egg —type=simple 创建一个EggScaffold项目,使用yarn命令安装依赖,yarn start运行
安装yarn add egg-sequelize mysql2,与mysql建立连接,并在mysql中创建数据

  1. 'use strict'
  2. /** @type Egg.EggPlugin */
  3. //一定记得删除这个 否则会返回空,导致ctx取不到model
  4. // module.exports = {
  5. // // had enabled by egg
  6. // // static: {
  7. // // enable: true,
  8. // // }
  9. // }
  10. exports.sequelize = {
  11. enable: true,
  12. package: 'egg-sequelize'
  13. }
  1. //增加配置
  2. config.sequelize = {
  3. dialect: 'mysql',
  4. host: '127.0.0.1',
  5. port: '3306',
  6. user: 'root',
  7. password: '123456',
  8. database: 'scafflod',
  9. define: {
  10. timestamps: false,
  11. freezeTableName: true
  12. }
  13. }
  1. 'use strict'
  2. const Controller = require('egg').Controller
  3. class TemplateController extends Controller {
  4. async getTemplate() {
  5. const { ctx, app } = this
  6. const res = await ctx.service.templates.getTemplate()
  7. console.log('res', res)
  8. ctx.body = res
  9. }
  10. }
  11. module.exports = TemplateController
  1. 'use strict'
  2. module.exports = app => {
  3. const { STRING, INTEGER } = app.Sequelize
  4. const Templates = app.model.define('templates', {
  5. id: { type: INTEGER, primaryKey: true, autoIncrement: true, allowNull: false, comment: '模板id' },
  6. name: { type: STRING(255), allowNull: false, comment: '名称' },
  7. npmName: { type: STRING(255), allowNull: false, comment: '模板名称' },
  8. version: { type: STRING(255), allowNull: false, comment: '模板版本' }
  9. })
  10. return Templates
  11. }
  1. 'use strict'
  2. const Service = require('egg').Service
  3. class BseService extends Service {
  4. run(callback) {
  5. const { ctx, app } = this
  6. try {
  7. if (callback) {
  8. return callback(ctx, app)
  9. }
  10. } catch (error) {
  11. console.log('报错了', error)
  12. return error
  13. }
  14. }
  15. }
  16. module.exports = BseService
  1. 'use strict'
  2. const BaseService = require('./base')
  3. class TemplatesService extends BaseService {
  4. async getTemplate() {
  5. return this.run(async () => {
  6. const { ctx } = this
  7. const res = await ctx.model.Templates.findAll({})
  8. return res
  9. })
  10. }
  11. }
  12. module.exports = TemplatesService
  1. 'use strict'
  2. /**
  3. * @param {Egg.Application} app - egg application
  4. */
  5. module.exports = app => {
  6. const { router, controller } = app
  7. router.get('/project/getTemplate', controller.templates.getTemplate)
  8. }

运行http://127.0.0.1:7001/project/getTemplate,输出
[{“id”:1,”name”:”vue2模板”,”npmName”:”haha-cli-dev-template-vue2”,”version”:”1.0.1”}]

新建请求工具模块

lerna create @haha-cli-dev/request
lerna add axios utils/request

  1. 'use strict'
  2. const axios = require('axios')
  3. //设置了baseUrl会报connect ECONNREFUSED 127.0.0.1:80
  4. // const baseURL = process.env.HAHA_CLI_BASE_URL ? process.env.HAHA_CLI_BASE_URL : 'http://127.0.0.1:7001'
  5. axios.create({
  6. // baseURL,
  7. timeout: 5000
  8. })
  9. axios.interceptors.response.use(
  10. function (response) {
  11. return response.data
  12. },
  13. function (error) {
  14. console.log('error', error)
  15. return Promise.reject(error)
  16. }
  17. )
  18. module.exports = axios

请求模板API

在commands下的init/lib/创建template.js,请求接口

  1. const request = require('@haha-cli-dev/request')
  2. process.env.HAHA_CLI_BASE_URL = process.env.HAHA_CLI_BASE_URL || 'http://127.0.0.1:7001'
  3. function getTemplate() {
  4. return request({
  5. url: `${process.env.HAHA_CLI_BASE_URL}/project/getTemplate`
  6. })
  7. }
  8. module.exports = { getTemplate }

image.png

判断库里是否有模板

  1. async prepare() {
  2. try {
  3. //当前执行node命令时候的文件夹地址 ——工作目录
  4. const localPath = process.cwd()
  5. const force = this._argv[1]?.force
  6. let isContinue = false
  7. const templates = await getTemplate()
  8. //判断模板是否存在
  9. if (!templates || templates.length === 0) {
  10. throw new Error('当前不存在项目模板')
  11. }
  12. ....
  13. } catch (e) {
  14. log.error(e.message)
  15. }
  16. }

添加选择模板交互

  1. ...
  2. //添加选择模板交互
  3. const { template } = await inquirer.prompt({
  4. type: 'list',
  5. message: '请选择项目模板',
  6. name: 'type',
  7. default: TYPE_PROJECT,
  8. choices: this.createTemplateChoice()
  9. })
  10. //4、获取项目的基本信息
  11. return {
  12. type,
  13. project,
  14. version,
  15. template
  16. }
  17. createTemplateChoice() {
  18. return this.templates?.map(item => ({
  19. name: item.name,
  20. value: item.npmName
  21. }))
  22. }

image.png

添加后台管理模板

git clone vue-element-admin,然后运行项目。
新建文件夹haha-cli-dev-template-admin-element-vue2,与发布vue模板到npm步骤相似。
image.png