以react为核心的企业级前端架构

我们正处在一个技术大爆发时代,IT技术作为与人们生活息息相关的领域,得到了飞速发展。前端技术,又是所有IT技术中,更新最快的领域之一,考虑到前端社区“激进 ”的创新风气,似乎也可以把“之一 ”去掉。

1、八一八前端的历史

在笔者看来,从技术上进行划分前端大概经历了这几个阶段:

图文信息展示阶段:这是前端技术的公元前,主要是为了展示信息给受众,网站几乎没有什么交互功能

DHTML时代:DHTML让网页具有了更丰富的展示手段,页面能够对人们行为产生更多的反馈,具备了更好的交互性,大名鼎鼎的web2.0就是处于这个阶段

前端工程化时代:随着页面功能的丰富,前端部分的代码逐渐变得庞大,代码维护和复用,成了前端技术发展的主旋律。在这个时代,前端技术得到了空前的发展:语言特性得到加强,新的标准紧锣密鼓的出炉(HTML5,CSS3,ES2015 and ES7 is coming~);各种类库层出不穷,各种思想百花齐放;更多的问题被尝试用前端技术解决,前端技术被用于完成更多领域的任务,这是前端的黄金时代

前端的黄金时代(图片来源于网络)


前端技术的每一次变革,引领着人类信息生活的变革。门户网站,让我们能够随时获取最新的咨询;Youtube、twitter、微博,让普通人能够发出自己的声音,被世界聆听;能够运行在多平台上的web语言,快速的开发效率,极大的减小了我们表达自己思想的代价,创业、创新不再是大集团,大组织的专属活动。

2、我们需要什么样的前端架构

企业级前端技术,说起来挺唬人的...我们平时在公司做的前端工作,又不是个人的,那不就是企业级的么。

是的,不过根据具体运用技术的不同,前端架构会具有不同的features,笔者所指的企业级前端架构,是需要具有很多features,能满足较高要求网站开发的架构。

笔者根据自己经验,一般对于高可维护性,高访问量的网站,应该具有如下features(在文末会配合选型框架对部分features实现进行说明):

基本features

低版本IE支持(IE8+) - 前端开发人员的痛点

前端性能优化支持 - 压缩、合并、图片优化

进阶features

代码风格检查 - 从源头控制代码风格

前后端完全分离 - 通过接口进行交互

使用语法糖 - 使用新版本的语法,精简代码,提高代码健壮性和可维护性,与未来保持一致

开发时的文件变动侦测 - 自动加载改动部分,体现在浏览器中

组件化 - 提高可复用性和复用度

代码模块化 - 提高代码内聚性和可维护性,充分利用浏览器缓存机制,提高前端性能

模块懒加载 - 防止一次性加载过多代码,导致长时间用户等待

移动端和pc端代码可以不同 - 针对移动端和pc端分别打包

带版本或者hash的文件名 - 方便部署的时候,先上传代码,然后上传html,就可以更新网站

前端测试 - 前端单元测试和黑盒自动化测试

接口mock - 进一步解耦前后端开发,开发时按照接口,使用mocker,防止服务器重启,代码更新带来的干扰

3、具体框架选型

由于项目时间压力和人力的关系,我们暂时还不能去创造轮子,不过无妨,社区已经有很多优秀的轮子供我们选用。框架选型设计到很多方面,可以独立写一篇或者多篇文章,笔者这里只简单对比人气最高的框架,突出一下框架的特点。

主体框架选择

主体框架决定了我们前端代码的形态,框架能帮我们做的事情越多,我们自己需要做的事情就越少。

AngularJS等MVX(X)框架,能够提供模型到显示的绑定,这样我们就从操作dom中解放出来了,自带的模块管理,也可以帮助我们实现模块化。

但是笔者认为,从组件的封装性上来讲,React做得更好,再者AngularJS饱受诟病的性能问题,正好是React的强项,我们有理由选择React作为主体框架。

web打包工具

web打包工具可以将我们的开发,发布流程自动化,让我们的开发和发布更方便。

既然用了React,webpack作为React的亲密小伙伴,自然为我们选用。Gulp也是很优秀的打包工具,笔者认为,gulp的语法更清晰,更浅显易懂,gulp的功能也更加强大,无奈React和webpack太亲密了,webpack也有很多很好的特性,比如在代码中直接引入样式,图片等,可以让模块的内聚性更高,另外,gulp也可以和webpack双剑合璧,实现更NB的功能。

4、以react为核心的企业级前端架构技术栈

react - 主体框架,可以通过引入额外文件,实现对IE8的支持

react-router - 配合react,实现单页面应用程序

bootstrap - 前端样式框架,3.x可以引入额外文件,实现对IE8的支持

webpack - web打包工具

eslint - 检查代码风格和潜在的风险,尽量在提交之前更正他们

babel - 将ES6语法编译成ES5语法,支持语法糖的使用

最终成型的代码,可以在笔者的github上下载到,地址请继续往下看,在文章结尾。

5、部分features实现说明

低版本IE支持(IE8+)

React需要es5-shim、es5-sham,bootstrap需要respond.js html5shiv才可以在IE8下正常运行,这4个文件不经常变动,连同console-polyfill打成1个文件节省http请求数。具体做法是ie相关的js单独作为一个chunk,因为mobile端没有ie,不需要这些文件,然后browser端的代码,将ie相关的js写到添加注释中。

代码风格检查

将eslint-loader用于js文件的即可,注意,eslint-loader应该放在babel-loader下面,让其先执行,然后再执行babel-loader。

使用语法糖

使用babel-loader即可,然后尽情使用es6新语法吧。

开发时的文件变动侦测

有两种方式,一种是webpack-dev-server,放在webpack config文件中,另一种是webpack-dev-middleware,提供node api调用,这里选用webpack-dev-middleware,可以更加灵活。

代码模块化

可以使用chunk来代表模块,chunk可以通过配置entry产生,也可以通过require.ensure和require AMD产生,还可以插件产生,可以根据具体的情形,选用不同的方式。例如,如果是基本类库,可以选择作为entry;如果是业务模块,而且需要动态加载的,可以使用require.ensure。

移动端和pc端代码可以不同

使用不同entry,将不同平台需要加载的脚本打包成不同的文件,然后,通过HtmlWebpackPlugin插件,将不同entry放入不同模板中,在不同平台下,访问不同模板,从而实现不同平台访问不同代码。

结语

以上只是部分features实现的说明,也可能有不清晰的地方,具体实现请移步:https://github.com/Pliman/enterprise-react,如有需要,欢迎留言讨论。


本文作者:孙彬(点融黑帮),程序猿一只。对有技术含量的事情,都感兴趣。足球爱好者,喜欢球场上奔跑的感觉,现任职于点融技术部成都分部。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,039评论 25 707
  • Gitbook Repo 撰写本文的时候笔者阅读了以下文章,不可避免的会借鉴或者引用其中的一些观点与文字,若有冒犯...
    王下邀月熊阅读 1,079评论 1 9
  • 因个人精力有限,暂停简书的维护,欢迎大家关注我的知乎https://www.zhihu.com/people/we...
    尾尾阅读 1,177评论 3 13
  • 昨天下午一行九人从山西出发,途经1200多公里,今天下午四点到达周庄,和想象中的情形有相似的地方,也有不同,把感受...
    处处1阅读 296评论 0 0
  • 人人都在做运营,运营自己的人生。 正如“没有哪一种生活方式是可取的”,商业运营也并无绝对真理以及可供复制的教科书案...
    没有咖菲得有摇滚阅读 215评论 1 1