# 简介
近期在调研各类低代码的工具和平台, 尝试更新一下自己的技术栈, 于是基于 Strapi (opens new window) 搭建了一个简单的服务试试水.
在实际使用 Strapi 的过程中踩了许多坑, 在此记录一下以便大家后续调研时作为参考.
# 正文
# 什么是 Strapi
Strapi (opens new window) 在官网上是这样定义自己的:
Strapi is the leading open-source headless CMS. 100% JavaScript and fully customizable.
Strapi 是一个领先的开源无头 CMS, 100% 由 JavaScript 编写, 高可定制化.
请注意这个 100% JavaScript
, 后面要考.
接下来是它的功能介绍:
快速搭建应用
让你在几分钟内完成本需要数周才能完成的后端. 随手构建可定制的内容 API, 并利用现代技术栈来消费这些 API.
你可以理解成它会按你的要求生成一些数据结构, 数据关系以及配套的 RESTful 接口, 然后你还可以自定义一部分业务逻辑.
# 体验如何
# 优点
- 自带一个控制台 (opens new window).
- 基础的数据结构定义都可以在控制台上手动完成.
- 基础的权限控制也可以在控制台上手动完成.
- 自带插件市场 (opens new window)
- Aliyun OSS provider (opens new window) 允许你使用 Aliyun OSS 代替本地文件存储.
- 支持使用 MySQL, PostgreSQL, SQLite 作为数据库
- 基于角色的权限控制系统 RBAC
- 基于数据结构生成 RESTful API 和 GraphQL API
- Nuxt 用户可以使用 Strapi 集成模块 (opens new window)来操作 Strapi.
# 缺点
- 数据结构中的唯一字段默认使用业务校验, 不添加数据库唯一性约束.
- 默认不支持跨平台编译, 即不支持在 Windows 系统上构建后将产物和
node_modules
目录部署到 Linux 系统上运行, 会出现依赖的第三方库找不到平台特定的二进制文件异常. - Typescript 支持很差
- Ts 项目部署需要严格参考 https://docs.strapi.io/dev-docs/typescript#start-strapi-programmatically (opens new window),
本地可以使用
strapi start
来启动构建后的项目, 但是如果只部署dist
目录到服务端并继续使用strapi start
的话, 则会启动失败, 提示找不到 database dialect 相关配置 (opens new window). - 单元测试需要先调用
compile()
(opens new window), 然后才能像文档 https://docs.strapi.io/dev-docs/testing (opens new window) 中介绍的那样去启动 Strapi 实例. - 数据库迁移脚本暂不支持使用 TypeScript 进行编写 (4.12.6) (opens new window), 如果希望 Strapi 可以使用 TypeScript 编写迁移脚本的话, 可以关注一下这个补丁: Find database migrations dir in typescript project (opens new window).
strapi.services
下的全部服务都是any
类型的, 使用前需要参考源码才能知道有哪些可用的方法.
- Ts 项目部署需要严格参考 https://docs.strapi.io/dev-docs/typescript#start-strapi-programmatically (opens new window),
本地可以使用
- 不支持指定 entity 的 id, 只能使用自增长 id (opens new window), 如果需要自定义 id , 暂时 (4.12.6) 只能在 attribute 中定义一个唯一字段进行代替.
- 单元测试相关的介绍比较少. 官方提供的单元测试文档只有 https://docs.strapi.io/dev-docs/testing (opens new window) 一篇,
内容只介绍了如何实现匿名访问和认证后访问 Controller 的端到端测试, 对于如何操作其他的 Service 对象来协助搭建测试环境则是一笔带过.
- 相比 NestJS 的单元测试文档 (opens new window), 它包含了如何对 Controller 进行单元测试和端到端测试, 如何对 Service 对象进行 Mock, 如何注入 Stub 对象等等.
- 如果对比 Spring Boot 的单元测试文档则更不用谈.
- 单元测试环境使用
console.info()
打印日志不显示, 你得单步调试才能在 IDE 的调试器里看到待打印的对象长什么样.
- 多环境配置同步比较差. 如果你需要把应用部署在多个不同用途的环境里, 例如: 本地开发环境, 单元测试环境, 集成测试环境,
预发环境和正式环境, 那你就得去探索合适的配置同步方案:
- 手动在每一个环境里填写配置/分配权限 😂
- 研究 Strapi 源码并编写 js 数据库迁移脚本
- 编写容错能力强的 SQL 数据库迁移脚本 🫡
- 调研由社区提供的方式各异的配置同步方案
- 4.13.1 版开始要求请求参数里不能包含非预期的参数 (opens new window), 否则直接报错,
如果希望按照之前版本一样忽略非预期的参数, 则需要自定义 Controller.
# 结论
Strapi 是一个用来快速启动项目的工具, 你可以用它快速的糊一些 CURD 接口出来.
但凡你对项目的健壮性有点要求, 它的各种缺陷就都暴露出来了.
优秀的项目启动速度和稀烂的可维护性, 我的评价是适合拿来糊外包后台.
# 推广
欢迎大家尝试使用 Code: Certs | https://code-certs.dengchao.fun (opens new window) 来申请免费的 HTTPS 证书, Code: Certs (opens new window) 还支持自动部署到部分公有云的产品上, 降低 HTTPS 证书运维工作量.
大家遇到什么使用问题或者有任何建议都可以私信我, 或者提交到 https://github.com/code-certs/code-certs/issues (opens new window) 也行.
欢迎大家领取 阿里云优惠券 (opens new window), 新购续费更优惠, 详询 钉钉 (opens new window): (opens new window)