为什么可以npm init egg —type=simple?
因为相当于执行了create-egg这个包
发布vue2模板到npm
模板开发先创建一个新的文件夹,命名为haha-cli-dev-template-vue2,文件夹中每一个项目都是一个模板,npm init,配置项目基本信息。
新建一个目录template,利用vue create vue-test2(vue cli),这个是真正的模板模块。
使用npm publish把模板发送到npm中。
Egg搭建后台,连接mysql,并通过API返回数据
使用npm init egg —type=simple 创建一个EggScaffold项目,使用yarn命令安装依赖,yarn start运行
安装yarn add egg-sequelize mysql2,与mysql建立连接,并在mysql中创建数据
'use strict'/** @type Egg.EggPlugin *///一定记得删除这个 否则会返回空,导致ctx取不到model// module.exports = {// // had enabled by egg// // static: {// // enable: true,// // }// }exports.sequelize = {enable: true,package: 'egg-sequelize'}
//增加配置config.sequelize = {dialect: 'mysql',host: '127.0.0.1',port: '3306',user: 'root',password: '123456',database: 'scafflod',define: {timestamps: false,freezeTableName: true}}
'use strict'const Controller = require('egg').Controllerclass TemplateController extends Controller {async getTemplate() {const { ctx, app } = thisconst res = await ctx.service.templates.getTemplate()console.log('res', res)ctx.body = res}}module.exports = TemplateController
'use strict'module.exports = app => {const { STRING, INTEGER } = app.Sequelizeconst Templates = app.model.define('templates', {id: { type: INTEGER, primaryKey: true, autoIncrement: true, allowNull: false, comment: '模板id' },name: { type: STRING(255), allowNull: false, comment: '名称' },npmName: { type: STRING(255), allowNull: false, comment: '模板名称' },version: { type: STRING(255), allowNull: false, comment: '模板版本' }})return Templates}
'use strict'const Service = require('egg').Serviceclass BseService extends Service {run(callback) {const { ctx, app } = thistry {if (callback) {return callback(ctx, app)}} catch (error) {console.log('报错了', error)return error}}}module.exports = BseService
'use strict'const BaseService = require('./base')class TemplatesService extends BaseService {async getTemplate() {return this.run(async () => {const { ctx } = thisconst res = await ctx.model.Templates.findAll({})return res})}}module.exports = TemplatesService
'use strict'/*** @param {Egg.Application} app - egg application*/module.exports = app => {const { router, controller } = approuter.get('/project/getTemplate', controller.templates.getTemplate)}
运行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
'use strict'const axios = require('axios')//设置了baseUrl会报connect ECONNREFUSED 127.0.0.1:80// const baseURL = process.env.HAHA_CLI_BASE_URL ? process.env.HAHA_CLI_BASE_URL : 'http://127.0.0.1:7001'axios.create({// baseURL,timeout: 5000})axios.interceptors.response.use(function (response) {return response.data},function (error) {console.log('error', error)return Promise.reject(error)})module.exports = axios
请求模板API
在commands下的init/lib/创建template.js,请求接口
const request = require('@haha-cli-dev/request')process.env.HAHA_CLI_BASE_URL = process.env.HAHA_CLI_BASE_URL || 'http://127.0.0.1:7001'function getTemplate() {return request({url: `${process.env.HAHA_CLI_BASE_URL}/project/getTemplate`})}module.exports = { getTemplate }
判断库里是否有模板
async prepare() {try {//当前执行node命令时候的文件夹地址 ——工作目录const localPath = process.cwd()const force = this._argv[1]?.forcelet isContinue = falseconst templates = await getTemplate()//判断模板是否存在if (!templates || templates.length === 0) {throw new Error('当前不存在项目模板')}....} catch (e) {log.error(e.message)}}
添加选择模板交互
...//添加选择模板交互const { template } = await inquirer.prompt({type: 'list',message: '请选择项目模板',name: 'type',default: TYPE_PROJECT,choices: this.createTemplateChoice()})//4、获取项目的基本信息return {type,project,version,template}createTemplateChoice() {return this.templates?.map(item => ({name: item.name,value: item.npmName}))}
添加后台管理模板
git clone vue-element-admin,然后运行项目。
新建文件夹haha-cli-dev-template-admin-element-vue2,与发布vue模板到npm步骤相似。
