# 实战:手搭一个 React,Typescript,Koa,GraphQL 环境
# 前言
在实际的开发过程中,从零开始初始化一个项目往往很麻烦,所以各种各样的脚手架工具应运而生。crea-react-app,vue-cli,@angular/cli 等脚手架工具,只需要执行一个命令,项目结构以及开发环境就搭建好了。
脚手架工具确实方便了我们使用,开发者可以专注于业务,而不需要考虑太多的环境搭建。但作者认为,学习脚手架工具背后的搭建过程也是很重要的,以防脚手架挂了之后,我们还能正常搭建项目。基于这个目的,作者从零搭建了 cdfang-spider 项目。
现在让我们就以这个项目为例,从零开始搭建项目吧。
# 项目选型
# 三大框架里选哪个?
react (市面上技术栈很火并且个人喜好)。
react-router 定义路由。
react context 状态管理。
react hooks 组件化。
# 引入强类型语言?
typescript。为 js 提供类型支持,编辑器友好,增加代码可维护性,使用起来心里踏实。
在使用第三方库时,可以写出更加符合规范的代码,避免 api 乱用等。
项目中依赖了大量 @types/xxx 包,无形中增加了项目体积。
编辑器对 ts 文件进行类型检查,需要遍历 node_modules 目录下所有的 @types 文件,会造成编辑器卡顿现象。
目前仍然存在很多库没有 @types 支持,使用起来并不方便。
# css 选型?
预编译器 less。项目中使用了变量定义,选择器嵌套,选择器复用等,less 够用了。
解决命名冲突可以使用 css modules,暂未考虑 css in js。
使用 bem 命名规范。
使用 postcss 插件 autoprefixer,增加 css 兼容性。
# 构建工具选哪个?
webpack。内置 tree shaking,scope hosting 等,打包效率高,社区活跃。
webpack-merge 合并不同环境配置文件。
配置 externals。引入 cdn 代替 node_modules 中体积较大的包。
gulp。用来打包 node 端代码。
# 代码规范检查?
eslint。辅助编码规范执行,有效控制代码质量。同时也支持校验 typescript 语法。
配置 eslint-config-airbnb 规则。
配置 eslint-config-prettier 关闭和 prettier 冲突的规则
# 测试框架选型?
jest。大而全,包含:测试框架,断言库,mock 数据,覆盖率等。
enzyme。测试 react 组件。
后端框架选型?
# koa。精简好用,中间件机制强大。
apollo-server。帮助搭建 graphQL 后端环境。
# 数据库选型?
mongodb。类 json 的存错格式,方便存储,前端友好。
配置 mongoose,方便给 mongodb 数据库建模。
接口方式选型?
# graphql。可以根据需要格式获取对应数据,减少接口冗余数据。
graphql schema 定义了后端接口的参数,操作和返回类型,从此不需要提供接口文档。
前端可以在 schema 定义后开始开发,数据格式自己掌握。
schema 可拼接。可以组合和连接多个 graphql api,进行级联查询等。
社区友好,有很多优秀的库可以直接使用: apollo,relay 等。
# 搭建 TypeScript 环境
TypeScript 是 JavaScript 的超集,意味着可以完全兼容 JavaScript 文件,但 TypeScript 文件却并不能直接在浏览器中运行,需要经过编译生成 JavaScript 文件后才能运行。
# 新建 tsconfig.json 文件。
tsc -init 生成初始化 tsconfig.json 文件。
vscode 会根据 tsconfig.json 文件,进行动态类型检查,语法错误提示等。
tsc 命令会根据 tsconfig.json 文件配置的规则,将 ts 代码转换为 js 代码。
tslint 会读取 tsconfig.json 文件中的规则,辅助编码规范校验。
tslint 官宣会被废弃,后将被 eslint 代替。
eslint 同样会用到 tsconfig.json 文件中的内容。