概要
- xcrun可以用来XCode模拟器截图,能干什么自己发散吧
- 后续一律都用ts搭配koa2做常规server开发了,ctx的类型还是得了解下
- sharp,如果用node来做一些常规的图片处理,如裁剪、变色、加水印等,你会用什么呢
iOS模拟器截图
booted会自动给当前自动的模拟器截图,xcrun是个强大的XCode生态的命令行工具
xcrun simctl io your_simulator_UDID screenshot output_file_path.png
xcrun simctl io booted screenshot output_file_path.png
koa2+ts开发
在 Koa 的类型定义中,ctx
的类型通常被标记为 ParameterizedContext
,这是一种复合类型,可以接收两个参数:一个表示状态(state)的类型,一个表示自定义的上下文对象。
不过,如果你没有自定义的状态或者上下文对象,你可以简单地使用 Context
类型。例如:
import { Context } from 'koa';
export class UserController {
static async getUsers(ctx: Context) {
const users = [
{ name: 'Tom', age: 20 },
{ name: 'Jerry', age: 18 }
];
ctx.body = users;
}
static async getUserById(ctx: Context) {
const users = [
{ id: '1', name: 'Tom', age: 20 },
{ id: '2', name: 'Jerry', age: 18 }
];
const user = users.find(user => user.id === ctx.params.id);
if (user) {
ctx.body = user;
} else {
ctx.status = 404;
ctx.body = { message: 'User not found' };
}
}
}
在这个示例中,我们使用了 Context
类型,它来源于 koa
库。这样就可以利用 TypeScript 的类型检查和自动完成功能来写更稳健的代码。
当然,如果你有自定义的状态或者上下文对象,你应该使用 ParameterizedContext
类型,例如 ParameterizedContext<YourStateType, YourCustomContextType>
。
在 Koa 框架中,获取 GET 和 POST 请求的参数,可以分别通过 ctx.query
和 ctx.request.body
来获取。以下是一个使用 koa-bodyparser
进行解析 POST 请求体的例子。
首先,安装必要的依赖:
npm install koa-bodyparser
然后,我们可以创建一个新的 UserController
类来处理用户相关的请求:
import { ParameterizedContext } from 'koa';
export class UserController {
static async getUser(ctx: ParameterizedContext) {
// 获取 GET 请求的 query 参数
const { id } = ctx.query;
// 假设我们有一个函数可以通过 id 获取用户
const user = await getUserById(id);
ctx.body = user;
}
static async createUser(ctx: ParameterizedContext) {
// 获取 POST 请求的 body 参数
const { name, age } = ctx.request.body;
// 假设我们有一个函数可以创建新用户
const newUser = await createUser({ name, age });
ctx.body = newUser;
}
}
在这个例子中,getUser
方法是处理 GET 请求的,它通过 ctx.query
来获取查询参数。createUser
方法是处理 POST 请求的,它通过 ctx.request.body
来获取请求体。
然后在路由中使用:
import Router from 'koa-router';
import { UserController } from './UserController';
const router = new Router();
router.get('/user', UserController.getUser);
router.post('/user', UserController.createUser);
export default router;
并在 Koa 应用中使用 koa-bodyparser
和路由:
import Koa from 'koa';
import bodyParser from 'koa-bodyparser';
import router from './router';
const app = new Koa();
app.use(bodyParser());
app.use(router.routes()).use(router.allowedMethods());
app.listen(3000);
这样就可以通过 GET 请求的查询参数和 POST 请求的请求体来获取请求参数了。注意,在 POST 请求中,必须使用一些中间件(如 koa-bodyparser
)来解析请求体。
koa2静态文件
在 Koa2 中,可以使用 koa-static
这个中间件来实现静态资源的服务。首先,需要安装该库:
npm install koa-static
之后,可以在代码中这样使用:
import Koa from 'koa';
import Router from 'koa-router';
import serve from 'koa-static';
import path from 'path';
const app = new Koa();
const router = new Router();
router.get('/user/:id', (ctx) => {
const { id } = ctx.params;
const { name } = ctx.query;
ctx.body = `User ID: ${id}, Name: ${name}`;
});
// 为 '/static' 路径提供静态资源服务
app.use(serve(path.resolve(__dirname, './static')));
app
.use(router.routes())
.use(router.allowedMethods());
app.listen(3000);
在上面的代码中,serve(path.resolve(__dirname, './static'))
将当前目录下的 static
文件夹设置为静态资源的根目录。然后通过 app.use
将其挂载到应用上。这样,你就可以通过访问类似于 http://localhost:3000/image.png
的 URL 来获取 static
文件夹下的 image.png
文件了。
请注意将 app.use(serve(...))
放在其他路由之前,以确保当请求的路径匹配到静态资源时,可以直接返回,不再继续匹配其他路由。
静态文件资源路径
如果你想在静态资源路径之前加上一个固定的前缀(例如 img
),可以使用 koa-mount
这个库。首先,安装该库:
npm install koa-mount
然后在代码中这样使用:
import Koa from 'koa';
import Router from 'koa-router';
import serve from 'koa-static';
import mount from 'koa-mount';
import path from 'path';
const app = new Koa();
const router = new Router();
router.get('/user/:id', (ctx) => {
const { id } = ctx.params;
const { name } = ctx.query;
ctx.body = `User ID: ${id}, Name: ${name}`;
});
// 在静态资源的路径前添加 '/img' 前缀
app.use(mount('/img', serve(path.resolve(__dirname, './static'))));
app
.use(router.routes())
.use(router.allowedMethods());
app.listen(3000);
在上面的代码中,mount('/img', serve(path.resolve(__dirname, './static')))
会在静态资源的路径前添加一个 /img
前缀。这样,你就可以通过访问类似于 http://localhost:3000/img/image.png
的 URL 来获取 static
文件夹下的 image.png
文件了。
node图片处理
Sharp 是一个非常强大且功能齐全的 Node.js 图像处理库,它支持很多功能,包括图像的裁剪、调整大小、旋转、翻转、调整亮度、对比度、饱和度和色调,转换图像格式,优化 JPEG 和 PNG 图像的大小等。它的 API 设计也相当简洁和直观,十分适合在 TypeScript 中使用。
另外,Sharp 的性能也非常好,它使用 libvips 库进行图像处理,这个库是专门针对大量并发处理进行优化的,通常来说,它的性能要优于 ImageMagick 和 GraphicsMagick。
Sharp 的社区也很活跃,它在 GitHub 上有超过 17,000 的 star,有超过 100 个贡献者,并且有大量的开发者正在使用它。所以,当你遇到问题时,你可以很容易地在网上找到相关的解决方案或者向社区求助。
这是一个简单的 Sharp 使用示例:
import sharp from 'sharp';
sharp('input.png')
.resize(200, 200)
.toFile('output.png', (err, info) => {
// handle error or success
});
但请注意,Sharp 是一个原生 Node.js 插件,这意味着它在你的系统上需要编译 C++ 代码。大多数情况下,这个过程都是自动的,但在某些环境中,你可能需要安装额外的工具。在部署到云服务提供商时,也可能会遇到一些额外的挑战。