Stor:全栈样板-发布、部署、强制约定

2020-11-02 10:13:12

你曾经自己开始过一个新项目吗?如果有,你可能知道设置所有必要的工具是很繁琐的。就像你一样,我最喜欢的部分是编码,而不是样板。

Stor通过使用最新的技术和最新的标准为您解决了所有这些问题。实际上,此模板坚持认为什么是最好的,但它确实强制执行优秀的实践,如代码可重用性、强制执行编码指南、使用Monorepo等。

如果您想更详细地了解这个想法是如何实现的,我建议您阅读我写的关于这个主题的系列博客文章。

此模板包括作为声音模式示例的待办事项演示应用程序。当然,您不会为项目创建待办事项应用程序,但您可以将其用作有用模式的示例,并了解如何使用此项目中提供的技术。

此存储库是存储库模板,这意味着您可以使用顶部的Use This Template按钮在此基础上创建项目。

*注意:如果您已有存储库,则需要更多工作。我建议使用Use Template按钮并将当前代码迁移到新创建的项目中。

现在,您将希望将所有出现的组织和项目命名替换为您自己的名称,从而使此项目成为您的项目。谢天谢地,我们有一个专门用于此目的的脚本:

*注意:强烈建议项目名称与您的git仓库相同。

文件完成后将自动删除。完成后,您将看到以下消息:

此模板集成了Github操作,以实现其持续集成。现有工作流位于.github/workflow下。要使配置项正常工作,您必须:

(可选)在NX_CLOUD_TOKEN下的GitHub机密中插入您的NX Cloud访问令牌。这实现了高速缓存和更快的构建时间。

对于简单而快速的部署,来自Digital Ocean的新App平台使得使用Monorepos变得容易。对于我们的todo应用程序,配置文件位于.do/app.yaml下。在那里,您可以更改正在部署的不同应用程序的配置。规格可以在这里找到。

在数字海洋云上创建帐户(这是赞助链接)并启用Github访问。

一旦完成,您的应用程序将与规范中定义的主分支提交挂钩。因此,在合并时,应用程序将更新。要更新应用程序的规范,首先使用doctl apps list获取应用程序id,然后只需运行doctl apps update<;app id>;--spe.do/app.yaml。

有两个可用的数据库,postgres和mongo。为了确保您的开发人员在安装这些数据库时不会遇到任何麻烦,它们已经预先配置了docker-compose.yml文件。

默认情况下,项目使用明信片。如果这是您想要的,您就可以开始了;一切都将开箱即用。

默认情况下,在模型和数据库之间激活自动同步。这意味着对模型所做的更改将自动反映在数据库架构上。如果要手动控制迁移,可以通过在orm-config.ts文件中将Synchronize设置为False来执行此操作。

这将检查您定义的实体和数据库架构的模型之间的差异。如果发现更改,它将生成适当的迁移脚本。

如果您想使用MongoDB,尽管绝对不推荐,因为它目前不能很好地与typeorm一起使用,但您仍然可以通过更新./apps/api/src/config/configation.ts下的连接信息来做到这一点。您只需将type:";postgres";替换为type:";mongo&34;。

对于postgres,将您的sql语句添加到APPS/DATABASE/postgres/init.sql文件中。对于mongo,将您的mongo语句添加到apps/database/mongo/mongo-entrypoint/seed-data.js文件中。

我们使用尖端技术来确保您获得所希望的最佳开发体验。为了与数据库通信,我们使用了卓越的类型。我们使用代码优先的方法,这意味着定义您的模型也将表示您的数据库中的表。下面是一个示例:

从";typeorm";导入{RootEntity}从";导入{Column,Entity}。/root.entity";从";class-validator";@Entity()导出类TODO扩展RootEntity{@Column()@MinLength(5,{Always:True})文本:String}。

为了满足您的API请求,我们结合使用Nest和Fastify来确保超快的性能。

为了减少创建新实体时常见的样板,我们使用了nestjsx/CRUD插件,该插件将为CRUD操作生成所有必要的路由。

从";@nestjs/common";导入{Controller}从";@nestjsx/CRUD";导入{TODO}从";@stator/Models";导入{TodosService}从";/todos.service";@Crud({model:{type:TODO})@Controller(";TODOS";)导出类TodosController实现CrudController<;TODO>;{构造函数(public service:TodosService){}}。

当然,您可能想知道这是否真的有效。为了说服您,我们使用SuperTest实现了执行真实请求的集成测试。

对于我们的Web应用程序,我们正在使用非常流行的REDUX-TOOLKIT和READICT-ROUTER。我们强烈建议您使用示例中演示的功能组件。

为了进一步减少redux-toolkit所需的样板,我们提供了thunkFactory,它允许您生成CRUD端点所需的所有操作。

从";@stator/model";导入{thunkFactory}从";../utils/thunkFactory";export const todoThunks={...。ThunkFactory<;待办事项&>(";/待办事项&34;),}。

我们还提供了一个sliceReducerFactory,它将为您刚刚创建的块生成所需的削减器。

从";@reduxjs/toolkit";import{todo}from";@stator/model";import{sliceReducerFactory}from";../utils/sliceReducerFactory";import{SliceState,getInitialSliceState}from";../utils/SliceState";import{todoThunks}from";/todos.thunk";import{todoThunks}from";./utils/SliceState";import{todoThunks}from";./utils/sliceReducerFactory";import{SliceState,getInitialSliceState}from";import{todoThunks}from";。Todo>;{}export Const todoSlice:Slice=createSlice({name:";todos&34;,initialState:getInitialSliceState<;TodoState,TODO>;(),Reducers:{},ExtraReducers:{...。SliceReducerFactory<;TODO,TODOSTATE>;(TODOTUNKS),},})。

如您所见,所有内容都打得很充分。因此,您将在开发时自动完成。

现在让我们假设我们想要从API中获取所有的待办事项,我们可以简单地这样做:

当API正在处理时,我们想要添加一个加载,这非常简单,因为我们的thunkFactory会为我们处理所有这些事情。您可以通过如下方式访问加载状态:

在我们的示例中,我们使用Material-UI,但是您可以用任何其他框架替换它。

我们还使用AXIOS来简化请求处理,因为它可以很好地处理TypeScript。

我们坚信键入有助于创建更健壮的程序;因此,我们使用TypeScript。

提交消息必须遵守这些准则。如果您需要遵循它们的帮助,只需运行npm run Commit,系统将以交互菜单提示您。

分支机构名称甚至在您提交之前就已强制执行,以确保每个人都采用相同的标准:{issue-number}-{branch-work-title-kebab-case}.。

我们还为您提供了一个预置的CI工具包,用于构建和运行测试。