为什么可以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').Controller
class TemplateController extends Controller {
async getTemplate() {
const { ctx, app } = this
const 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.Sequelize
const 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').Service
class BseService extends Service {
run(callback) {
const { ctx, app } = this
try {
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 } = this
const 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 } = app
router.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]?.force
let isContinue = false
const 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步骤相似。