登陆

前端开发 20 年变迁史

admin 2019-06-04 244人围观 ,发现0个评论

【CSDN 编者按】1990年,第一个Web阅读器诞生,而WWW的诞生直接摆开前端史的前奏。

从静态页面到Java,从依托后端到自主开发,前端开发者从不被重视的“页面仔”逆袭为现在许多前端工程师的薪资比后端还高,从前端技能由国外开发者主导到现在国内自主发作的小程序技能,咱们走了20年。

作者 | 司徒正美

责编 | 伍杏玲

1990 年,第一个Web阅读器的诞生;1991 年,WWW诞生,这标志着前端技能的开端。

在这将近20年的前端开展史中,咱们阅历了从最早的纯静态页面,到Java跨年代的诞生;从PC端到移动端;从依托后端到前端可自在打包开发;从前期的网景Navigator阅读器到现在各家阅读器百家争鸣……

咱们阅历了前端的洪荒年代、Prototype年代、jQuery年代 、后jQuery时期、三大结构割据年代,这其间均是由国外开发者主导,直到现在的小程序年代,才是我国开发者首创的。

这是绵长的技能储备下的效果,终究促进了杰出的技能生长收成。期间的前端开展之路,高低困难:

洪荒年代(1990~1994年)

在1990~1994年期间,前端界发作的大事有:WWW(World Wide Web)的诞生、阅读器的诞生、Java的诞生,没有专业的前端,页面满是由后端开发的。

1990年,万维网之父蒂姆伯纳斯-李(Tim Berners-Lee)在NeXT电脑上发明晰第一个Web阅读器。

1991年8月6日,Tim在alt.hypertext新闻组贴出了一份关于World Wide Web的简略摘要,这标志了Web页面在Internet上的初次上台。

最早的Web首要被一帮科学家们用来同享和传递信息,全国际的Web服务器也就几十台。由于仅是用来传递信息,从可视化办法或从传递数量上看,仅比电报强一点点。

其时还没有Java,用的是纯静态的页面。

1993年,CGI(Common Gateway Interface)呈现了,人们能够在后端动态生成页面。

Perl由于前端开发 20 年变迁史跨操作系统和易于修正的特性成为CGI的首要编写言语。当然,CGI也支撑其他支撑标准输入输出和环境变量的言语编写,比方Shell脚本、C/C++言语,只需契合接口标准即可。

但显着,页面的内容更新完全由后端生成,这带来一个显着的缺憾:每次更新都要整页改写,加上前期的网速状况,这个操作是十分慢的。因而针对这状况,人们从多方面着手改善:编写言语的晋级、阅读器的晋级、HTML的晋级。

1994年,网景公司建立,发布了第一款商业阅读器Navigator。自从这款阅读器问世后,微软推出IE阅读器。尽管有竞赛才有开展,但这也埋下了Java割裂的种子。

(1994 年,网景阅读器的截图)

同年,PHP诞生。PHP能将动态的内容嵌入到HTML中,进步了编写页面的功率与可读性,其功用也比一般的CGI高。PHP的界定符、循环句子等的发明,深刻影响了后来的ASP、JSP,乃致后来的Java前端模板引擎。

1994年10月,W3C小组也建立了,他们担任HTML的开展途径,其主旨是通过促进通用协议的开展。

待这悉数安排妥当后, Java于1995年诞生了。

风闻,网景工程师布兰登艾克(Brendan Eich)只花了10天时刻规划出 Java 言语,近乎天主七日发明国际那么高效。但也由于工期太短的原因,导致许多瑕疵,因而一向被正统传序员所厌弃,直到Ajax的出生,才让人们找到理由忍耐它的变形。前期的阅读器都配有一个选项,用来制止Java言语运转。

Java首要言语特征[1]:

时下,静态言语大行其道,类与接口被证明是构建大工程的最佳实践,人们想不出没有类的言语怎样编写事务。因而其时的微软也打造了另一门运转于阅读器的言语——VB。

假设持续细探Java的才能,你会发现它前期真的十分空泛,一门没有魂灵的言语,没有包办理机制,也没有像Java与C++那样的打辅佐用的SDK,内置的办法也寥寥无几。比方说数组办法,前期只需push、pop、shift、unshift、splice、slice、sort、reverse、concat、join等操作。动态调用方面,Function的apply、call操作还没有呈现!

早年的偷闲,导致后来不得不补课:到了2019年,数组上的原型办法,是本来3倍。

除了办法缺少,还有功用问题,咱们评论用eval仍是Function,用哪种循环办法,用parseInit仍是~~,便是为了那一点点的功用进步。例如jsperf.com,便是一个专门研究Java功用的网站。

因而Java诞生后,其两大使命便是完善言语特性与进步功用。这两座大山分别由闻名的prototype.js与jQuery来搬掉。

在搬掉之前,前端界还有一个弯曲实践——第一次阅读器战役,并由其开展而来UA嗅深技能。

阅读器战役(1994~2005年)

阅读器战役总共打了三场,IE阅读器vs网景阅读器、IE阅读vs火狐阅读器、IE阅读器vs谷歌阅读器。

第一场阅读器之战打得特别剧烈。

微软的IE阅读器发布于1994年,但此刻的网景现已占据绝对优势。微软在落后的状况,反编译Netscape的源码,推出IE与J。可是由于Bug十分多,咱们不肯意为IE开发网站,因而开掘出UA,专门过滤掉IE阅读器。

UA即Navigator.userAgent ,是用一个字符串来记载用户其时运转在什么操作系统与阅读器中。其时IE3的UA是这样的:

Mozilla/2.0 (compatible; MSIE 3.02; Windows 95)

程序判别UA信息,假设发现其时运转的环境是IE阅读器的话,就提示用户用网景阅读器翻开。因而微软不得不让自己的UA尽量伪装成网景的UA,诈骗用于检测UA的脚本,到达IE阅读器能够跑这些网站的意图。

终究,第一次阅读器之战以微软成功,Netscape被美国在线收买,而落下帷幕。

第一次阅读器战役年代十分久远了,但其结局告知咱们,其实技能强弱并不重要。那时技能保护并没有这么重视,不然微软的行为可能会被告(谷歌的openSDK仅抄袭几十行代码,被Oracle公司诉讼赔88亿)。

第一次阅读器战役带来了一个问题:尽管其时有ECMA-262(Java标准文档)与W3C(HTML与CSS的标准文档),微软却没有照标准来完成Java、HTML与CSS,导致前端兼容问题的诞生。所以CSS Hack、阅读器断定、特性侦测,这些技能就应运而生。

这个年代最闻名的人物是Dean Edwrad,他是最早的近乎完美处理事情绑定的兼容性大神,其addEvent()内置于jQuery最早的版别中。jQuery的作者John Resig看到其超强的技艺,终究抛弃推出大而全的结构,专攻挑选器引擎。

Dean Edwrad的IE7.js、IE8.js是前期处理阅读器兼容的良药,能够说是悉数Polyfill[2]的来源。他写了许多的Hack, 比方在IE怎样丈量元素的宽高,许多操作DOM的兼容。

这时期太早,我国根本没有参加这次阅读器战役。

Prototype时期(2005~2009年)

Prototype是Sam Stephenson写的一个十分高雅的Java根底类库。他是Ruby的大牛,因而Prototype的许多办法名都是来自Ruby界。

Sam Stephenson最大的奉献是开掘了Prototype与发明了Function.prototype.bind,在数组上也写了一大堆办法,其间许多被标准化了。

同期的MooTools也是Prototype的办法,其时,咱们还在前端论坛为这个争持。还有前端工程师喜爱在其时很知名的前端聚集地——蓝色抱负(现沦为规划师网站)上,评天才j2论怎样扒脚本、共享弹层、日历等小组件的技能,这在其时现已是十分了不得的事。

Prototype其时还处理两大问题:动画特效与Ajax恳求。动画特效是由aculous供给,咱们现在所熟知的各种缓动函数,各种特效的命名与大致的运转形状,都是由aculous确认下来的。

在前期,谷歌就开端运用iframe完成页面改写。

2005 年2月,杰西詹姆士贾瑞特(JesseJamesGarrett)宣布了一篇名为《Ajax:一种Web运用程序开发的新办法》的文章后,Ajax被挖掘出,咱们才开端重视起这技能的运用。

例如IE下的ActiveXObject("Microsoft.XMLHTTP"),这是IE创立Ajax引擎的。假设其时有工程师开宣布一个中心库,假设不包括Ajax的封装,便不好意思发布出来。

一些Ajax书藉

其时前端开发形式是挑选一个中心库,找一些组件,或许扒他人的脚本进行开发

Prototype的源码挺好了解的,代码量也少,只需5000多行,里边的每个办法也很易扒出来,因而一些大公司总有高手能发明自己的Prototype。

但前端开发仍是离不开后端,由于前端没有模块机制,其时咱们需求用PHP进行打包。打包是yahoo34条军规之一,能够削减恳求数。打包的一起也能够进行混杂,避免代码小偷来窥视。

N年前,前端面试必问的标题:

模块化的雏型, 在注释中标示它的依托

这个时期,还没有前后端别离,可国内一些带着深沉后端布景的高手现已进场。

jQuery 时期(2009~2012年)

2006年,jQuery发布,它其时的竞赛对手许多:Dojo、Prototype、ExtJS、MooTools。

所以那时jQuery的宣扬标语仅能说是它的功用上升了100%、200%、300%。直到2009年,Sizzle挑选器引擎研制成功,jQuery才获得压倒性的优势。

其时前端界首要面临的是阅读器兼容性问题,jQuery在处理DOM兼容上真是知微见著, 开掘出许多的DOM/BOM兼容方案(例如Dean Edwrad的addEvent(), IE的px转化方案,domReady的doScroll方案,globalEval的兼容方案等)

jQuery也打破了前端开发者的编程思想,之前是依照后端的开发思路来的:做一个事务就先封装一个类,有了这个类后,再想办法传入一个DOM,然后再通过类办法操作DOM。而jQuery是DOM为中心,开发者能够选一个或多个DOM,变成jQuery目标,然后进行链式操作。其时为了改动用户的思想,国内的高手写了不少文章来引导咱们。

其次,开发者们已开端重视前后端别离,并要求不能污染Object原型目标,不能污染window大局变量。这样,jQuery只占用两个大局变量。

再次,jQuery十分轻量级,选用Dean Edwards编写的Packer紧缩后, 巨细不到30KB。而且里边完成得十分精妙,以令人瞠意图手法处理各种兼容痼疾。

为了学习这些技巧,高手们翻了一遍遍jQuery的源码,所以网上有许多关于其源码详解的书藉。乃至前端工程师在面试时也会被考到jQuery的源码完成,这样,jQuery在国内愈加盛行。

jQuery的盛行直接带来以下的开展:

这样的话,不断呈现出优异的工程师,他们发明了许多jQuery插件与UI库。为后jQuery年代,人们研制前端模块加载、一致异步机制、 打造大型MVC结构, 乃至伸向后端,接收打包脚本而发明Node.js,来腾出许多时刻。

这个时期呈现了许多jQuery-like的库,其间最闻名的是Zepto.js。Zepto的呈现也标志着咱们进入移动互联网年代。那时配套出的闻名库还有iScroll、fastclick、Lazy Load、Modernizr、fullPage。

jQuery的链式操风格麾一时,也带来许多问题,当Ajax呈现依托时,就不可避免就呈现回调阴间。因而针对这方面的评论,诞生Deffered与Promise。有关回调阴间的评论,在后来讲Node.js异步处理时,将会再一次热烈地评论。因而太阳下没有新事,咱们总是遇到类似的问题。

jQuery如此多的挑选器也法保护,跟着越来越多人呈现这职业,页面的交互也越来越杂乱,从Web Page向Web App进化,新的趋势带来新的开发办法。

后jQuery时期(2012~2016年)

这时期以RequireJS的诞生为起点,以RN的呈现完毕。一起处理了前端的模块界说问题,模块打包问题(通过Node.js),Java不依托其他言语发明了一套前端开发 20 年变迁史自己的东西链。

jQuery的呈现让前端工程师开发愈加轻松,假设工程师想完成一个功用,现查找出一个jQuery插件来完成。那时候咱们在前端网站就整天介绍jQuery插件,很少评论一些底层的完成。

前端工程师一般编写一个页面,会引进十多个乃至几十个jQuery插件,页面上塞满了标签。众所周知,阅读器是单线程,的加载,会影响到页面的解析与呈现,导致闻名的白屏问题(其时前端用力过猛,body中的一切东西都是动态生成的)。

jQuery另一个问题是大局污染,由于插件的质量问题,或许开发的本质问题,这现已是IIEF模块或命名空间等传统手法无法处理了。

所以一些优异的前端工程师们决议从取经后端,引进模块机制。前期,这种模块机制在Dojo、EXT这些结构中都是内置的,可是显着压服不了另一个结构的用户用对方的模块机制,所以有人立志要一致这种模块界说办法,建立了CommonJS。

但不料,CommonJS内部也有派系,谁也说不服对方。总算有一个人不由得自己独立开宣布RequireJS,其模块标准即为AMD。 AMD最大的优势是它支撑各种插件,且简略明晰,而且供给shim机制加载以非AMD标准编写的Java代码。

但在CommonJS诞生良久一段时刻后,在后端的Node.js呈现时才有用武之地。而国内,则盛行另一种标准风格,背靠阿里的大旗,有人推出了SeaJS,声称其标准为CMD。其实不管国内仍是国外,都发作许多模块加载器,但终究仍是被挑选了,标准一个就够了,不宜过多。

可是前端工程师的发明力便是这么惊人,从无到有,再到泛滥成灾,一年足矣。这可能与前端代码是开源的原因。终究有人一致了前两种标准(AMD、Node.js模块),一起还支撑旧式的“大局”变量标准。

自此,Java开发形式焕然一身了,咱们只需在代码外面包一层就能够全国际通用,不必提心大局污染的问题。

其次,jQuery开发者需求处理大段HTML的生成问题,之前jQuery有$.html, $.append, $before等办法,能够将一大段契合HTML结构的字符串转化成DOM再刺进到页面上。

但现在咱们想别离出来,让HTML独立到不同的文件中,然后插数据,这便是前端模板。前端模板的状况与模板标准相同,从没有到多如芝麻的地步。这时挑选一个好用且功用高的模板是一件让前端工程师头疼的问题,那时网上有许多评测文章来介绍它们。

前端模板技能能够用一个公式来描绘:

HTML = template(vars)

有了前端模板后,又诞生了前端路由,根据它们,人们发明一个新词汇SPA。作为这个年代的结尾,来自Ruby界的高手Ryan Dahl发明晰Node.js。 前端工程师们喝彩:能够不必传统的后端就能自己写一个网站了!

Node.js的开展就不胪陈上,很快它就冒出海量模块、路由、状况办理、数据库、MVC结构都有了。这时,前端就缺自己的MVC结构了。Node.js转瞬就十岁生日了。

闻名的MEAN架构,是Java全栈开发的前锋。其时呈现了许多的MVC与MVVM结构。最早火起来的是Backbone.js,运用朴实的MVC模型, Backbone.js是jQuery终究的支撑者,它强依托于jQuery。

Backbone.js的作者还搞了另一套编译言语Coffee, 里边的箭头函数、类机制、 解构赋值等语法糖都深深影响了后来的ES6前端开发 20 年变迁史。

接着下来是谷歌的Angular,微软的Knockout.js,苹果的Ember.js这三个MVVM结构,MVVM便是比MVC多一个数据绑定功用,但这数据绑定功用是十分难完成。Knockout是运用函数替代特点的技巧完成,它的规划影响到后来的Mobx;Ember.js是根据Object.defineProperty;Angular是将函数体转译成setter()、getter()函数。

大公司的介入,对个人开发者影响是很大,究竟咱们都爱迷信大公司,因而局势一会儿就稳定下来。大公司还带来了全新的开发形式,前期都是找一个中心库,再搜刮一大堆插件,然后自己写事务代码,终究后端打包。

大公司将后端开发阅历移用过来,用Node.js开发了一套CLI,里边包括了脚手架生成, 打包脚本、语法风格检测、环境变量刺进,代码杂乱度检测,代码提交时主动跑单元测试, 图片与JS紧缩等功用。ESLint、JSLint、JSHint、CSS Lint、 htmllint等便是那时期呈现的。

但CLI的呈现导致了前端的割裂,曾经咱们都运用jQuery,但自CLI帮你建好项意图那一刻起,就将你划归某一子阵营,你是Angular?Ember.js?仍是jQuery?对了,jQuery没有大公司支撑的阵营被快速边缘化。

关于个人开发者,他们是没有才能开发这么功用齐备的CLI,所以呈现了Code Climate、Travis CI、CircleCI这样的渠道。它们的呈现标志着jQuery小作坊年代的终结了。

CircleCI官网

前端开发者也呈现分解:有些人转向后端,呈现了CNode的门户网站。别的一些人前端开发 20 年变迁史开端搞工程化。一时刻呈现上百种构建东西,知名的有Grunt、Gulp、FIS3、webpack、 Rollup、npm-。

你方唱罢我上台,这些构建东西均会阅历年代的检测,如大浪淘沙般,终究存活得仅为寥寥。

因而在这场工程化得盛宴中,注定把许多低层次的jQueryer挑选掉。jQueryer在闲暇之余培育出的前端模板、前端路由、MVC结构、模块加载器、Node.js构建东西,却不料终究成为它自己的挖墓人。

jQuery的年代一去不返了,再没有人关怀拖堂拖了N年的Bootstrap 4总算发布了,没有人知道jQuery3.5的减肥方案,也没有人问jQuery的源码,渐渐地,咱们不重视jQuery的东西链了。

三大结构割据年代(2016~至今)

React是忽然迸发的,尽管它是与Angular是一起期发布,但由于JSX奇怪的语法让人们远离它。此刻现已进入移动互联网的中期,大公司都有自己的App,或许根据原生,或许根据Hybird。

Hybird是用WebView加载一个网站或一个SPA。

由于原生本钱太贵,需求招两套班子,一套安卓的,一套iOS的;而Hybird则一向存在功用问题。所以在2017年,Facebook推出了React Native(RN)。

RN的功用不比原生差多少,比Hybird能好些, 其次运用JSX开发界面比原生的快; RN 只需求低本钱的前端开发人员就能上手了。我国国内通过瀑布流(图片导购)、团购、P2P、区块链等全新商业形式的开发浪潮后,前端人员数量大增。现在,他们只需略微训练就能够转型为App开发。

在开发RN的过程中,人们开端了解React一系列的优胜之处。比方JSX背面的虚拟DOM技能,尽管事实证明虚拟DOM不会带来功用的巨大优势,但确保了你怎样写其功用不会太差。

React为了引进JSX,有必要需求引进编译,这又直接促进Babel与webpack的强大。特别是Babel, 让咱们在很旧的阅读器中运用十分新的语法,乃至一些还没有定案的语法。React从14晋级到React 15,强制运用class语法,让这个推了良久的语法糖总算大规模落地。

之前假设Java想运用类,只能自己仿照类,由于没有官方的完成,只能任由各优异工程师发挥。而普通人想用好类,需求了解很杂乱的Prototype机制。

现在只用几个新关键字就能够得到这悉数。

假设比照Python 2与Python 3间的晋级,Java实在太辛运了!针对CSS逻辑功用过弱的问题,咱们也有了新的处理方案:Less、Sass、PostCSS与CSS Modules!

谷歌在发布Angular的一起,也发布了一个叫Polymer的结构,那时它想推行一种叫Web Components的阅读器自界说组件技能。这其实是微软在IE5就玩剩的HTC技能的晋级版。尽管它没有火起来,但它将、Style、Template三种内容混在一个文件的规划,启示一个留美华人,再结合其时的Backbone.js、Angular等规划,Vue.js横空出生。现在,这是国人最成功的前端结构了。

除此之外,国人也弄了好几套迷你React结构与迷你Vue结构。这有点像jQuery年代,咱们张狂做迷你jQuery结构相同。

总的来说,最有发明力的是React团队,做出状况办理器、CSS-in-JS、Flow静态类型查看、devTool、Fetch、前后端同构、Fiber、suspend、并发烘托等名词层出不穷。其间,状况办理器具有上百套, CSS-in-JS也具有上百套,Flow则让前端尝鲜到接口编程的优点,直接推进发Type开展。这三大结构无法比拼个一二出来:Vue.js有国人的拥趸,React与Angular有大公司光环。

三大结构的缠斗从PC范畴扩展到移动端:React有RN, Vue.js有Weex,Angular有ionic。想当年咱们为了兼容阅读器,攒了一大堆阅读器前端开发 20 年变迁史侦察的Hack,悉数价值降低为废物了。

在这时期,一种全新的后端烘托兴起,称之为前后同构,既具有前期SEO的成效,又能复用许多的事务逻辑。跟着国内移动互联网的开展,获客本钱进步,各种有用的商业形式都进入红海,但只需头部用户能赚到钱,马太效应越来越严峻,朴实的技能处理方案现已无法满意商业诉求了。

小程序年代(2017~至今)

小程序年代与三大结构的年代简直重合,可是出自不同一批人,决战的渠道也不相同。

一向以来前端技能都是由国外开发者主导的,即便是Vue.js也是由美国的华人发明的。可是国内外的技能更新是存在代差,国内一般延期两三年,这个时刻差能够让一些仿照者得以生计(如SeaJS、FIS、avalon)。但跟着关闭的时刻越来越长,国内肯会也会诞生自己的转有物种。小程序便是其间之一。

小程序的呈现有着显着的商业诉求,由于马太效应,一些超大流量的App诞生了。这些大流量App集成了许多功用,但显着公司再多职工,也无法一切功用满是自己弄,所以发作小程序这种“外包”的手法。

小程序是国内前端技能的一次厚积薄发:底层运转的迷你React的虚拟DOM, 内置组件是运用Web Component,API来源于Hybird的桥办法,打包运用webpack,调试台是Chrome con前端开发 20 年变迁史sole的简化版, WXML、WXSS的语法高亮也应该是webpack或VS Code的插件, 模块机制是Node.js的CommonJS……其间最值得一提的是微信开发者东西,今后开发者东西成了各种小程序/快运用的标配。

但微信小程序一开端的复用才能十分弱,没有类承继,不能运用npm, 不支撑Less、Sass, 因而根据它的转译结构就应运而生。第一代译转结构是wept、WePY、mpvue,它们无一例外是Vue风格的。由于WXML的模板指令与Vue十分类似,仅仅改一下就能兼容。其时也呈现了一个MINA的结构,听说是微信团队开发的,能够独自架起Node.js后端,让小程序运于阅读器中,便利做单元测试。

第一代转译结构首要是根据Template标签完成组件机制,自界说组件机制是很后的事了。这就造成了运用第一代转译结构编写的小程序项目很难晋级。那时候是个人开发者的天堂,这些结构都是某一大牛独力开发的。

第二代转译结构是大公司主导的,由于需求兼容的小程序越来越多,百度、支付宝、字节跳动、小米、华为等公司都推出自己的小程序和快运用。个人开发者很难凭个人力气去开发转译结构,这时候各大团队纷繁推出自己的轮子:如京东的Taro、滴滴的Chameleon网易的Megalo、去哪儿网的nanachi、百度的Okam等。

在这个时期,Angular显着掉队了,一是Angular晋级太快,国内的高手还没有消化好,新一版的Angular又发布了。二是国内缺少迷你Angular的轮子,导致巨大的Angular无法塞进小程序中。

国外谷歌发布了Flutter跨渠道转译结构,可是它的编写言语是Dart,它也无法跨界到小程序中。

未来不只国内一线巨子抢夺小程序,二三线的巨子也可能会参加小程序的混战中,例如有人称360也在打造自己的小程序渠道。小程序这种新的流量变现形式深刻地影响了国内的互联网布局。

结语

最初Java被误解为最糟糕的言语,时至今日它是最盛行的言语:GitHub 60%的开源项目都是与Java有关。

曾经,从事这职业的人被称为页面仔,现在他们的起薪有的比PHP、JAVA、C++等后端还高。乃至有人说,“任何能够运用Java来编写的运用,终究会由Java编写。”

咱们前端开发者触及的范畴不只仅是阅读器,还能够做后端,做桌面端,做手机端,做小程序端,前端开发者的性价比越来越高,越来越重要。可谓是年代造英豪。

笔者有幸成为前端开发者大队伍中的一员,也深信咱们前端开发者今后的路会越来越宽,越来越好走。

材料:

[1]:计算机和编程言语的开展前史

[2]:Polyfill是一块代码(一般是 Web 上的 Java),用来为旧阅读器供给它没有原生支撑的较新的功用。

作者简介:司徒正美,具有十年纯前端阅历,著有《Java结构规划》一书,去哪儿网公共技能部前端架构师。喜好开源,具有mass、Avalon、nanachi等前端结构。现在在主导公司的小程序、快运用的研制项目。

【End】

声明:该文观念仅代表作者自己,搜狐号系信息发布渠道,搜狐仅供给信息存储空间服务。
请关注微信公众号
微信二维码
不容错过
Powered By Z-BlogPHP