React是Facebook公司推出的前端组件化解决方案,目的在于解决前端开发中存在的各个痛点。目前,前端框架与库层出不穷,形成了异常繁荣的局面,那么Facebook为何还要重复造轮子呢?究其原因,Facebook认为现有的前端解决方案都不是很好(甚至Facebook认为MVC本身也是有问题的),无法解决自己在实际开发中面临的种种问题,于是自己就开发出了React并将其开源;同时,基于React,Facebook又推出了React Native,旨在使用前端开发者熟悉的JavaScript等技术来开发原生App,实现一套代码运行在iOS与Android等移动平台上。一经推出,React与React Native就得到了开发者的极大关注,短时间内其在GitHub上就获得了大量的关注,目前也是前端开发领域最火热的技术之一。基于这一点,本文将会介绍React开发入门知识,通过一个实际可运行的案例带领大家一步步掌握React开发的步骤,厘清React开发的各项知识点,同时对于开发过程中所用的工具有一定的认识和掌握。
开发IDE
前端框架分析
- React:由Facebook推出,通过单向数据绑定、虚拟DOM以及强大的生态圈(Flux、Redux等等),再配合WebPack等工具,掀起了前端的一阵旋风,也是各大公司前端所热烈追逐的技术,目前呈现出非常强劲的发展势头,更新频率也非常快速。
- Angular:由Google推出,通过双向数据绑定以及一整套完善的指令与库实现了前端的一站式开发,目前也是SPA(Single Page Application,单页面应用)的重要选择之一。不久之后将会发布的Angular 2.0将会成为Angular的一个重要里程碑,新版本增加了诸多重要功能与特性,值得每一个前端开发者重点掌握。
- jQuery:老牌的前端开发工具库,目前依然得到了广泛的应用。jQuery已经流行很多年了,而且在可预计的未来还将一直流行下去。它简化了前端开发者的日常工作,通过简洁的函数封装实现了DOM操作、CSS操作、Ajax调用、各种动画效果,浏览器兼容性等诸多功能,是最受前端开发者青睐的工具之一。而且,jQuery还可以很好地与React及Angular进行集成,便于复用组织内已有的基础设施,增强效率。
本文将会重点关注于React,通过一个实际可运行的示例来一步步演示React的开发过程,同时还会给出关于工具、开发等的一些最佳实践。
本文所选取的示例 来自于React官网,不过进行了一定程度的增强和完善,更加便于React新手学习;同时,对于工具的使用也给出了一些建议。
开发工具
虽然本文介绍的是React前端开发,不过为了保持示例的完整性,文中同时给出了后端代码,这样学习者就可以直接在本机启动服务器运行示例了。该示例虽然不大,但使用的工具还是不少的,希望大家能一步步跟着我的步伐操练起来。
本文所使用的主要工具与库如下所示:
- 开发机器:MacBook Pro
- 开发工具:Web Storm 2016.2版本
- Node
- Express
- nvm
- npm
- React
- jQuery
- JSON
值得一提的是,虽然可以通过任何文本编辑器来实现本文的示例,但我这里选取的是JetBrains公司的WebStorm作为开发工具,目的在于提升效率,让开发者将注意力放在React本身,而不是工具的各项配置上。WebStorm提供了开箱机用的强大功能,是一款不可多得的前端开发伴侣。
项目简介
首先需要安装项目所用的工具,该项目的后端采用Node进行开发,因此需要先安装Node。
安装nvm:
只需通过上述一行命令即可在Mac上安装nvm。
安装完毕后在Terminal中输入命令:nvm help即可列出nvm支持的各项命令,比如说:
- nvm --version:显示nvm版本
- nvm ls:列出本地安装的所有Node版本
- nvm ls-remote:列出远程所有的Node与iojs版本
- nvm current:显示当前激活的Node版本
- nvm install v0.10.32:安装v0.10.32这个Node版本
- nvm use 0.10:使用0.10这个Node版本
- nvm alias default 0.10.32:将0.10.32这一版本作为默认使用的Node版本
以上只列出了nvm众多功能的一些重要功能,感兴趣的读者可以自行安装nvm并查看命令。对于我们这个示例来说,我们安装最新版本的Node即可,命令如下所示:
上述命令同时还会自动安装v6.3.1版本的Node所对应的npm,安装完毕后输入命令:
上述命令用于将v6.3.1这一版本作为系统默认使用的Node版本。至此为止,Node与npm就安装完毕了。
我们这个项目使用到了Express框架、body-parser以及用于生成uuid的uuid库。
然后在项目所在目录下执行命令:
这时,npm会根据package.json的文件内容自动解析依赖并下载到项目目录的node_modules下面,如下图所示:
在项目目录下新建目录public,然后在public目录下新建两个子目录:css与scripts,分别用于存放项目所用的CSS文件与JavaScript文件。
- varfs=require('fs');
- varpath=require('path');
- varexpress=require('express');
- varbodyParser=require('body-parser');
- varuuid=require('uuid');
- varapp=express();
- varCOMMENTS_FILE=path.join(__dirname,'comments.json');
- app.set('port',(process.env.PORT||3000));
- app.use('/',express.static(path.join(__dirname,0); background-color:inherit">'public')));
- app.use(bodyParser.json());
- app.use(bodyParser.urlencoded({extended:true}));
- app.use(function(req,res,next){
- res.setHeader('Access-Control-Allow-Origin',0); background-color:inherit">'*');
- 'Cache-Control',0); background-color:inherit">'no-cache');
- next();
- });
- app.get('/api/comments',fs.readFile(COMMENTS_FILE,function(err,data){
- if(err){
- console.error(err);
- process.exit(1);
- res.json(JSON.parse(data));
- });
- app.post(varcomments=JSON.parse(data);
- varnewComment={
- id:uuid.v4(),255); background-color:inherit">author:req.body.author,255); background-color:inherit">text:req.body.text,255); background-color:inherit">};
- comments.push(newComment);
- fs.writeFile(COMMENTS_FILE,JSON.stringify(comments,255); font-weight:bold; background-color:inherit">null,4),255); font-weight:bold; background-color:inherit">function(err){
- res.json(comments);
- app.listen(app.get('port'),255); font-weight:bold; background-color:inherit">function(){
- console.log('Serverstarted:http://localhost:'+app.get('port')+'/');
- });