本文系原创,转载请附带做者信息:lmjbencss
项目地址:github.com/lmjben/cdfa…html
在实际的开发过程当中,从零开始初始化一个项目每每很麻烦,因此各类各样的脚手架工具应运而生。crea-react-app,vue-cli,@angular/cli 等脚手架工具,只须要执行一个命令,项目结构以及开发环境就搭建好了。前端
脚手架工具确实方便了咱们使用,开发者能够专一于业务,而不须要考虑太多的环境搭建。但做者认为,学习脚手架工具背后的搭建过程也是很重要的,以防脚手架挂了以后,咱们还能正常搭建项目。基于这个目的,做者从零搭建了cdfang-spider项目。vue
如今让咱们就以这个项目为例,从零开始搭建项目吧。node
三大框架里选哪一个?react
引入强类型语言?webpack
css 选型?nginx
构建工具选哪一个?git
代码规范检查?es6
测试框架选型?
后端框架选型?
数据库选型?
接口方式选型?
基本框架选型完毕,接下来就开始搭建项目环境。
TypeScript 是 JavaScript 的超集,意味着能够彻底兼容 JavaScript 文件,但 TypeScript 文件却并不能直接在浏览器中运行,须要通过编译生成 JavaScript 文件后才能运行。
一、 新建 tsconfig.json 文件。
二、 配置 eslint。
根据 typescript-eslint 引导,配置 eslint 对 typescript 的支持。
三、 选择一个 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。
四、搜集全部的 ts,tsx 页面(前端环境使用 webpack,node 项目使用 gulp),而后经过 babel 编译成 js 文件。
React 是一个库,基于组件式开发,开发时经常须要用到如下语法:
这些语法在目前浏览器中并不能直接执行,须要进行打包编译,这也是搭建 React 环境的主要工做。
一、新建一个 html 文件,并在 body 中建立一个根节点,用于挂载 react 最后生成的 dom。
二、新建一个 index.tsx 文件,用于将项目中的全部组件,引入进来,并调用 render 方法,将组件渲染到根节点中。
三、React 项目分层。
四、配置 webpack,以 index.tsx 为入口文件,进行打包编译。
webpack 打包原理
webpack 打包过程就像是一条流水线,从入口文件开始,搜集项目中全部文件的依赖关系,若是遇到不可以识别的模块,就使用对应的 loader 转换成可以识别的模块。webpack 还能使用 plugin 在流水线生命周期中挂载自定义事件,来控制 webpack 输出结果。
五、编写 npm script,一键开启开发模式。
// cross-env 用来跨环境设置环境变量
"scripts": {
"dev:client": "cross-env NODE_ENV=development webpack-dev-server --open"
}
复制代码
六、如今运行 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 库。
一、新建 jest.config.js 文件。
二、编写测试文件。
三、编写测试脚本和上传覆盖率脚本。
"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 等,东西太多,还得加油学习啊,😂