Strapi v4 使用体验: 到处是坑 | 踩坑记录

2023年 9月 12日 49.0k 0

阿里云推广

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

简介

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

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

正文

什么是 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.

缺点

  • 数据结构中的唯一字段默认使用业务校验, 不添加数据库唯一性约束.
  • 默认不支持跨平台编译, 即不支持在 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() 打印日志不显示, 你得单步调试才能在 IDE 的调试器里看到待打印的对象长什么样.
  • 多环境配置同步比较差. 如果你需要把应用部署在多个不同用途的环境里, 例如: 本地开发环境, 单元测试环境, 集成测试环境, 预发环境和正式环境, 那你就得去探索合适的配置同步方案:
    • 手动在每一个环境里填写配置/分配权限 😂
    • 研究 Strapi 源码并编写 js 数据库迁移脚本
    • 编写容错能力强的 SQL 数据库迁移脚本 🫡
    • 调研由社区提供的方式各异的配置同步方案
  • 4.13.1 版开始要求请求参数里不能包含非预期的参数, 否则直接报错, 如果希望按照之前版本一样忽略非预期的参数, 则需要自定义 Controller.
    breaking-changes-in-4.13.1.png

结论

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

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

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

推广

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

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

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

相关文章

服务器端口转发,带你了解服务器端口转发
服务器开放端口,服务器开放端口的步骤
产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
如何使用 WinGet 下载 Microsoft Store 应用
百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

发布评论