本文系原创,转载请附带作者信息:yhlben
项目地址:https://github.com/yhlben/cdfang-spider
在实际的开发过程中,从零开始初始化一个项目往往很麻烦,所以各种各样的脚手架工具应运而生。crea-react-app,vue-cli,@angular/cli 等脚手架工具,只需要执行一个命令,项目结构以及开发环境就搭建好了。
脚手架工具确实方便了我们使用,开发者可以专注于业务,而不需要考虑太多的环境搭建。但作者认为,学习脚手架工具背后的搭建过程也是很重要的,以防脚手架挂了之后,我们还能正常搭建项目。基于这个目的,作者从零搭建了cdfang-spider项目。
现在让我们就以这个项目为例,从零开始搭建项目吧。
三大框架里选哪个?
引入强类型语言?
css 选型?
构建工具选哪个?
代码规范检查?
测试框架选型?
后端框架选型?
数据库选型?
接口方式选型?
基本框架选型完毕,接下来就开始搭建项目环境。
TypeScript 是 JavaScript 的超集,意味着可以完全兼容 JavaScript 文件,但 TypeScript 文件却并不能直接在浏览器中运行,需要经过编译生成 JavaScript 文件后才能运行。
1、 新建 tsconfig.json 文件。
2、 配置 eslint。
根据 typescript-eslint 引导,配置 eslint 对 typescript 的支持。
3、 选择一个 typescript 编译器,tsc 还是 babel?
使用 babel。好处如下:
babel 流程分析
babel 是一个 js 语法编译器,在编译时分为 3 个阶段:解析、转换、输出。
- 解析阶段:将 js 代码解析为抽象语法树(ast)。
- 转换阶段:对 ast 进行修改,产生一个转换后的 ast。
- 输出阶段:将转换后的 ast 输出成 js 文件。
plugin 和 preset
- plugin: 解析,转换,并输出转换后的 js 文件。例如:@babel/plugin-proposal-object-rest-spread 会输出支持
{...}
解构语法的 js 文件。- preset: 是一组组合好的 plugin 集合。例如:@babel/preset-env 让代码支持最新的 es 语法,自动引入需要支持新特性的 plugin。
4、搜集所有的 ts,tsx 页面(前端环境使用 webpack,node 项目使用 gulp),然后通过 babel 编译成 js 文件。
React 是一个库,基于组件式开发,开发时常常需要用到以下语法:
这些语法在目前浏览器中并不能直接执行,需要进行打包编译,这也是搭建 React 环境的主要工作。
1、新建一个 html 文件,并在 body 中创建一个根节点,用于挂载 react 最后生成的 dom。
2、新建一个 index.tsx 文件,用于将项目中的所有组件,引入进来,并调用 render 方法,将组件渲染到根节点中。
3、React 项目分层。
4、配置 webpack,以 index.tsx 为入口文件,进行打包编译。
webpack 打包原理
webpack 打包过程就像是一条流水线,从入口文件开始,搜集项目中所有文件的依赖关系,如果遇到不能够识别的模块,就使用对应的 loader 转换成能够识别的模块。webpack 还能使用 plugin 在流水线生命周期中挂载自定义事件,来控制 webpack 输出结果。
5、编写 npm script,一键开启开发模式。
// cross-env 用来跨环境设置环境变量
"scripts": {
"dev:client": "cross-env NODE_ENV=development webpack-dev-server --open"
}
6、现在运行 npm run dev:client
就可以愉快地编写客户端代码了。
由于 node 端使用了 typescript 和最新的 es 语法,所以需要进行打包编译。
"scripts": {
"dev:server": "cross-env NODE_ENV=development gulp & cross-env NODE_ENV=development supervisor -i ./dist/client/ -w ./dist/ ./dist/app.js",
}
配置好 gulp 后,就可以运行 npm run dev:server
一键启动服务器端开发环境。
项目采用传统的 mvc 模式进行层次划分。
Model 层的主要工作:连接数据库,封装数据库操作,例如:新增数据、删除数据、查询数据、更新数据等。
Controller 层的主要工作:接收和发送 http 请求。根据前端请求,调用 model 层获取数据,再返回给前端。
传统的后端一般还包含 service 层,专门用来处理业务逻辑。
View 层的主要工作:提供前端页面模板。如果是服务器端渲染,是将 model 层的数据注入到 view 层中,最后通过 controller 层返回给客户端。由于本项目前端使用 react 渲染,所以 view 层直接是经过 webpack 打包后的页面。
GraphQL 是一种用于 api 的查询语言,需要服务器端配置 graphql 支持,同时也需要客户端使用 graphql 语法的格式进行请求。
使用 apollo 更快的搭建 graphql 环境。
MongoDB 是一个面向文档存储的数据库,操作起来十分简单。
Mongoose 为 mongodb 提供了一种直接的,基于 scheme 结构去定义你的数据模型。它内置数据验证,查询构建,业务逻辑钩子等,开箱即用。
接下来的步骤就是安装 mongodb,启动服务,就可以了。
本项目使用 jest 作为测试框架,jest 包含了断言库、测试框架、mock 数据等功能,是一个大而全的测试库。由于前端使用了 react 项目,这里引入了专门用来测试 react 的 enzyme 库。
1、新建 jest.config.js 文件。
2、编写测试文件。
3、编写测试脚本和上传覆盖率脚本。
"scripts": {
"test": "jest --no-cache --colors --coverage --forceExit --detectOpenHandles",
"coverage": "codecov"
}
安装好各种环境之后,接下来就要考虑项目上线了。
npm i pm2 -g
本项目发布非常简单,只需要一步操作就搞定了,这些都是经过持续集成配置后的结果。
# clone with Git Bash
git clone https://github.com/yhlben/cdfang-spider.git
# change directory
cd cdfang-spider
# install dependencies
npm i
# build for production with minification
npm run build
所有的事情都在 build 命令下完成了,我们分析一下 npm run build 命令做的事情。
上述事情通过创建 npm script 就可以了完成需求了,但这些命令也不应该每次都由手工敲一遍,通过配置 travisCI,每一次 master 分支提交代码时,自动运行上述命令就行了。
travisCI 是一个持续集成平台,每当 github 提交代码时,travisCI 就会得到通知,然后根据 travisCI 中的配置信息执行相应的操作,并及时把运行结果反馈给用户。travisCI 配置文件可以参考项目根目录下的 .travis.yml
文件。配置文件核心在于 script 的配置。
script:
- npm run build
- npm run test
after_success: npm run coverage
可以看到,每一次 github 提交后,travisCI 就会执行 名称为 build 的任务,任务分为 2 个步骤,首先执行 build 命令,然后执行 test 命令,当命令都执行完成后,执行 coverage 命令。如果执行命令期间出现任何错误,travisCI 会通过邮件及时通知我们。真正要上线时,先查看 ci 状态,如果已通过所有的步骤,那就不用担心发布的代码有问题了。
至此,整个项目选型与搭建流程已经介绍完毕了,当然还有一些很细节的地方没有写进去,如果有不太明白的地方,可以提 issue,或者加我微信 yhl2016226。
接下来对以下 4 个方面写个小总结。
对于项目后期更新,主要是基于以下几个方面:graphql,docker,k8s,微服务,serverless 等,东西太多,还得加油学习啊,?