欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Strapi v4 体验:无处不在的坑洞 | 坑洞踏步

最编程 2024-05-01 22:11:43
...

本博客站点已全量迁移至 DevDengChao 的博客 https://blog.dengchao.fun , 后续的新内容将优先在自建博客站进行发布, 欢迎大家访问.

简介

近期在调研各类低代码的工具和平台, 尝试更新一下自己的技术栈, 于是基于 Strapi 搭建了一个简单的服务试试水.

在实际使用 Strapi 的过程中踩了许多坑, 在此记录一下以便大家后续调研时作为参考.

读完本文将节省你约 2 周左右的深度调研时间.

TL;DR

QQ截图20230925153153.png

快逃!

正文

什么是 Strapi

Strapi 在官网上是这样定义自己的:

Strapi is the leading open-source headless CMS. 100% JavaScript and fully customizable.

Strapi 是一个领先的开源无头 CMS, 100% 由 JavaScript 编写, 高可定制化.

请注意这个 100% JavaScript, 后面要考.

接下来是它的功能介绍:

build-apps-fast.png

快速搭建应用

让你在几分钟内完成本需要数周才能完成的后端. 随手构建可定制的内容 API, 并利用现代技术栈来消费这些 API.

你可以理解成它会按你的要求生成一些数据结构, 数据关系以及配套的 RESTful 接口, 然后你还可以自定义一部分业务逻辑.

体验如何

优点

  • 自带一个控制台. Admin Panel
    • 基础的数据结构定义都可以在控制台上手动完成.
    • 基础的权限控制也可以在控制台上手动完成.
  • 自带插件市场
    • Aliyun OSS provider 允许你使用 Aliyun OSS 代替本地文件存储.
  • 支持使用 MySQL, PostgreSQL, SQLite 作为数据库
  • 基于角色的权限控制系统 RBAC
  • 基于数据结构生成 RESTful API 和 GraphQL API
  • Nuxt 用户可以使用 Strapi 集成模块来操作 Strapi.

缺点

  • Strapi 会在没有任何警告的情况下删除数据库中未知的表 !!! QQ截图20230925142448.png 不要把 Strapi 应用在已有数据的任何数据库 (schema) 上!
  • 数据结构中的唯一字段默认使用业务校验, 不添加数据库唯一性约束.
  • 默认不支持跨平台编译, 即不支持在 Windows 系统上构建后将产物和 node_modules 目录部署到 Linux 系统上运行, 会出现依赖的第三方库找不到平台特定的二进制文件异常. cross-deployment.png
  • Typescript 支持很差
    • Ts 项目部署需要严格参考 docs.strapi.io/dev-docs/ty…, 本地可以使用 strapi start 来启动构建后的项目, 但是如果只部署 dist 目录到服务端并继续使用 strapi start 的话, 则会启动失败, 提示找不到 database dialect 相关配置.
    • 单元测试需要先调用 compile(), 然后才能像文档 docs.strapi.io/dev-docs/te… 中介绍的那样去启动 Strapi 实例.
      compile-before-load.png
    • 数据库迁移脚本暂不支持使用 TypeScript 进行编写 (4.12.6), 如果希望 Strapi 可以使用 TypeScript 编写迁移脚本的话, 可以关注一下这个补丁: Find database migrations dir in typescript project.
    • strapi.services 下的全部服务都是 any 类型的, 使用前需要参考源码才能知道有哪些可用的方法.
  • 不支持指定 entity 的 id, 只能使用自增长 id, 如果需要自定义 id , 暂时 (4.12.6) 只能在 attribute 中定义一个唯一字段进行代替.
  • 单元测试相关的介绍比较少. 官方提供的单元测试文档只有 docs.strapi.io/dev-docs/te… 一篇, 内容只介绍了如何实现匿名访问和认证后访问 Controller 的端到端测试, 对于如何操作其他的 Service 对象来协助搭建测试环境则是一笔带过. how-to-manpulate-services.png
    • 相比 NestJS 的单元测试文档, 它包含了如何对 Controller 进行单元测试和端到端测试, 如何对 Service 对象进行 Mock, 如何注入 Stub 对象等等.
    • 如果对比 Spring Boot 的单元测试文档则更不用谈.
  • 单元测试环境使用 console.info() 打印日志不显示, 你得用 strapi.log.info() 或者单步调试才能在 IDE 的调试器里看到待打印的对象长什么样.
    • 你甚至在 Strapi v4 的应用开发者文档 docs.strapi.io/dev-docs/ 里都找不到 Logging 相关的内容, 我是翻到一篇托管在 Gitee 上的 3.0.0-beta 版的文档才知道有 strapi.log 这么个东西.
    • 要不是翻仓库源码我是真的不知道还有这样一个网站 contributor.strapi.io/ . 这个写给 Strapi 框架开发者的文档网站上有比较详细的 API 介绍, 但是这个网站在 www.strapi.iodocs.strapi.io 都没有被提到.
  • 官方推荐单元测试使用本地的临时 SQLite 数据库, 以便在测试完成后能删掉临时数据库文件来保障每一次单元测试的数据库一致性.
    set-up-a-testing-env.png
    • 需要注意的是单元测试使用的数据库实例与生产环境使用的实例不一致破坏了不可变基础设施原则, 容易引发单元测试通过但部署到生产环境后导致服务不可用的风险.
    • 社区提供的解决方案是在单元测试结束时回滚/清空数据库. 熟悉 Spring Boot 的同学应该知道 @Transactional 注解也提供了类似的功能.
  • 多环境配置同步比较差. 如果你需要把应用部署在多个不同用途的环境里, 例如: 本地开发环境, 单元测试环境, 集成测试环境, 预发环境和正式环境, 那你就得去探索合适的配置同步方案:
    • 手动在每一个环境里填写配置/分配权限 ????
    • 研究 Strapi 源码并编写 js 数据库迁移脚本
    • 编写容错能力强的 SQL 数据库迁移脚本 ????
    • 调研由社区提供的方式各异的配置同步方案
  • 4.13.1 版开始要求请求参数里不能包含非预期的参数, 否则直接报错, 如果希望按照之前版本一样忽略非预期的参数, 则需要自定义 Controller. breaking-changes-in-4.13.1.png

结论

Strapi 是一个用来快速启动项目的工具, 你可以用它快速的糊一些 CURD 接口出来.

但凡你对项目的健壮性有点要求, 它的各种缺陷就都暴露出来了.

优秀的项目启动速度和稀烂的可维护性, 我的评价是适合拿来糊外包后台.

相关内容

  • Strapi 为什么没人用了? @知乎

推广

欢迎大家尝试使用 Code: Certs | https://code-certs.dengchao.fun 来申请免费的 HTTPS 证书, Code: Certs 还支持自动部署到部分公有云的产品上, 降低 HTTPS 证书运维工作量.

大家遇到什么使用问题或者有任何建议都可以私信我, 或者提交到 github.com/code-certs/… 也行.

欢迎大家领取 阿里云优惠券, 新购续费更优惠, 详询 钉钉:

上一篇: openwrt snmp 配置

下一篇: