插件 semo-plugin-chalk
功能描述
我们在写 Shell 脚本的时候有时需要向外输出一些信息,默认 Shell 的 echo
只能输出默认色调的字符串,而终端的颜色语法可读性不是很好,运维工程师可以用这样的插件提供各种颜色的终端输出。
PS: 这里当然有很多种解决方案,这里仅仅是 Semo 给大家提供的解决方案。
我们在写 Shell 脚本的时候有时需要向外输出一些信息,默认 Shell 的 echo
只能输出默认色调的字符串,而终端的颜色语法可读性不是很好,运维工程师可以用这样的插件提供各种颜色的终端输出。
PS: 这里当然有很多种解决方案,这里仅仅是 Semo 给大家提供的解决方案。
上一篇准备了两年的 Semo,今天正式跟大家见面中,已经首次跟大家介绍了 Semo,相信大家看完之后应该还是一头雾水,不知道 Semo 到底是个什么东东,为什么要用,有学 Semo 的时间,自己不是也可以撸出一个命令行工具么?所以,本篇还是不打算讲 Semo 的原理,还是再讲讲应用吧,今天给大家讲讲另一个用 Semo 写的插件:semo-plugin-read
。
相信很多小伙伴对掘金都是大大点赞的,里面有各种大神,大牛写的长文教程,极大的降低了新手入门的门槛,面对一篇又一篇长文,你是否有收藏的冲动呢(比如收藏到有道云笔记)?虽然网上有各种文摘工具,但是还是想要 Markdown
版本,不像语雀,掘金貌似拿不到原文 Markdown,所以,这就是今天介绍的插件的开发初衷,当然实际开发以后就有点收不住了,:)
一个简易的 HTTP Server 工具,类似的工具有很多,包括但不限于:
还有一些工具,比如 hexo
,本来是个博客工具,也自带了 HTTP Server 的功能,umi
,本来是个前端开发脚手架,也自带了启动 HTTP Server 的功能,当然,还有大名鼎鼎的 create-react-app
等等,而且 node 本身写一个简单的 Web 服务器也不是很复杂,那为什么还要去做一个新的轮子呢?
其中一个原因是看到了一个项目 osgood
,其实现了基于命令行工具快速定义路由和控制器的思路。另外,由于 Semo
做为一个命令行开发框架,其价值就是按需封装各种各样的命令行工具,而且其命令,脚本都有相对统一的模块风格,那就是基于约定导出固定变量用于固定用途的约定大于配置的思路。将二者结合就形成了这个新的 HTTP Server 工具,其 Web Server 部分基于 koa 及其中间件实现,定制性较强,这个轮子主要就是制定规则,提供相关语法糖。
感谢 Koa
的简洁和灵活,我们可以按需定制所需要的特性,本程序使用 Koa
来实现 Web 服务以及各种扩展功能
.semorc.yml
)中设置npm i -g @semo/cli semo-plugin-serve
semo serve [publicDir]
simple server tool
选项:
--port, -p server port [默认值: false]
--list, -l list routes
--init-koa, -i initial koa application [默认值: false]
--api-prefix prefix all routes [默认值: "/api"]
--spa fallback to index.html
--gzip enable gzip
--routeDir routes location
--publicDir static files location
--file-index index file name [默认值: "index.html"]
--file-404 index file name [默认值: false]
--disable-internal-middleware-custom-error disable internal middleware custom error
--disable-internal-middleware-custom-static disable internal middleware custom static
--disable-internal-middleware-custom-router disable internal middleware custom router
--disable-internal-middleware-koa-logger disable internal middleware koa-logger
--disable-internal-middleware-koa-bodyparser disable internal middleware koa-bodyparser
--disable-internal-middleware-koa-kcors disable internal middleware kcors
借助于 Semo 提供的统一的代码生成入口和扩展性,我们实现了一个简单的路由代码生成器
semo make route a/b/c
semo serve --list
semo serve [publicDir]
semo serve # 默认当前目录
借助 nodemon 模块
npm i -g nodemon
nodemon --exec 'semo serve'
export const name = "signup"; // 给路由起个名字
export const method = "post"; // 支持各种 HTTP 请求方法
export const path = "abc"; // 自动添加到路径路由的后面
export const middleware = []; // 为单个路由指定前置中间件
export const validate = {
// 请求参数验证
username: "required",
};
export const handler = async (ctx) => {}; // 路由回调
export = async ctx => {}
ctx.json = false;
这里要注意的是抛出的错误码必须经过定义
ctx.errors[10001] = "自定义错误消息";
// 或
ctx.error(10001, "自定义错误消息", 405);
throw new ctx.Exception(10001, "重写错误消息");
命令内置了 mockjs
库,只需要通过 ctx.Mock
和 ctx.mock
就能访问,ctx.mock === ctx.Mock.mock
。
当选项 --gzip
设置为 true 以后,默认凡是内容类型包含 text 的响应都会进行 gzip 压缩,如果想关闭可以在路由响应函数里进行如下操作:
module.export = async (ctx) => {
ctx.compress = false;
// 或
ctx.gzip = false;
};
我们默认的路由前缀是 /api,因为默认的使用场景是前端静态目录和后端动态接口都支持,如果仅仅是使用后端功能,可以改写前缀,或者清空前缀。
index 文件名的路由在我们对路由的理解里有特殊含义,因为我们一般不需要一个路由这样访问:/api/a/b/index
,而只需要是 /api/a/b
,所以如果我们不是将路由实现在 b.js
里,而是b/index.js
,效果是一样的。
只要在启动时加上 --spa
选项,不存在的路径就会指向默认的 index.html
,需要注意的是 --api-prefix
选项指定的 API 前缀下的路由即使找不到也只是会抛出路由不存在的异常响应,而不会指向 index.html
,这么做的目的是为了同时支持前后端的使用场景。
如果不使用 SPA 模式,并且配置了 --file-404
选项,比如 404.html,则所有不存在的 404 静态资源都会使用这个配置的静态页面进行输出,如果设置为 false 关闭了这个选项,则会输出为 Not found
字符串。
通过工具提供的选项可以看出,所有内置的中间件都可以禁用,而且可以通过 --init-app
的选项注入一个模块来添加更多的中间件,两个特性一起使用的话,可以完全自定义 koa 所需要的所有的中间件,当然如果是这么做的话,那本工具也就没必要使用了。
// init-app.js
// semo serve --init-app init-app.js
module.exports = (app) => {
app.use(async (ctx, next) => {
await next();
});
};
如果不想用 Semo 来调度也可以直接已模块的方式引入,参数可以参考命令行选项
import { startServer } from 'semo-plugin-serve'
async() {
await startServer({
publicDir: '.'
})
}