innodb_file_per_table

MySQL InnoDB引擎 默认会将所有的数据库InnoDB引擎的表数据存储在一个共享空间中:ibdata1,当增删数据库的时候,ibdata1文件不会自动收缩,单个数据库的备份也将成为问题。通常只能将数据使用mysqldump 导出,然后再导入解决这个问题。 在MySQL的配置文件[mysqld]部分,增加innodb_file_per_table参数,可以修改InnoDB为独立表空间模式,每个数据库的每个表都会生成一个数据空间。   注意: 如果启用了innodb_file_per_talbe参数,需要注意的是每张表的表空间内存放的只是数据、索引和插入缓冲Bitmap页,其他数据如:回滚信息、插入缓冲索引页、系统事物信息、二次写缓冲(Double write buffer)等还是放在原来的共享表空间内。同时说明了一个问题:即使启用了innodb_file_per_table参数共享表空间还是会不断的增加其大小的。 独立表空间优缺点: 优点: 1:每个表的数据、索引存放在自己单独的表空间中。 2:空间可以回收(drop/truncate table 方式操作表空间不能自动回收) 3:对于独立的表空间、碎片影响的性能要低于共享表空间 缺点: 单表增加比共享表空间方式更大 结论: 共享表空间在Insert操作上有一些优势,但在其它都没独立表空间表现好。 当启用独立表空间时,请合理调整一下 innodb_open_files 参数。 from:http://www.cnblogs.com/xiaoit/p/4096165.html

龙生   02 Aug 2017
View Details

Win7系统IIS7+Tomcat7集成

IIS是Internet Information Services(互联网信息服务)的缩写,是由微软公司提供的基于运行Microsoft Windows的互P联网基本服务,是微软在Windows中内置的Web服务器软件。通过IIS和Tomcat的集成可以让Tomcat处理JSP,IIS处理ASP和Html静态页面。 一、安装tomcat 我所用的Tomcat是最新版的7.0.27直接安装版,安装的位置是D:\Program Files\Tomcat7,记住这个路径会多次用到,注意在Tomcat之前一定要安装JDK,这里我用的是jdk1.7.    二、配置IIS 进入Win7的控制面板,打开程序功能,点击选择打开或关闭Windows功能   在Windows功能的选项菜单,把internet信息服务的所有的组件全部勾起来。 注意:安装完成后IIS的地址是http://localhost和tomcat的地址http://localhost:8080看看出没出现默认画面。   三、集成Tomcat 1、连接器jk 在tomcat的bin目录下新建目录jk\,把下载的isapi_redirect.dll(连接器,可从网上下载http://mirror.bit.edu.cn/apache//tomcat/tomcat-connectors/jk/binaries/windows/,我使用的是目前的最新版1.2.35),拷贝到这个目录下。 2、在tomcat的conf目录下创建两个文件workers.properties,uriworkermap.properties Workers.properties文件的内容:

  uriworkermap.properties文件的内容(注意:这个文件说明了符合哪些条件的uri才能被转发到tomcat中,可能的设置有)

  3、导入注册表文件tomcat.reg 任意的在哪里建一个文本文档,命名为tomcat.reg,内容如下:

双击运行这个文件导入到注册表中。   4、建立网站的虚拟目录 打开你的Internet信息服务管理器,进入管理页面,展开左边的连接栏,选择你的一个网站,这里我的网站名是tomcat,主目录是e:\tomcat,鼠标单击右键添加虚拟目录,打开虚拟目录对话框。 别名处写上jakarta,其中jakarta是一个规定名字,必须这么创建,这个虚拟目录要指向isapi_redirect.dll的所在目录,并且设置为可执行IsApi。   5、添加筛选器 选中自己的网站,选择ISAPI筛选器,如图所示: 在出现的框中,单击鼠标右键,单击添加选项,出现添加ISAPI筛选器对话框,在名称处中输入jakarta,并选择连接器的路径,如下图所示:   6、添加脚本映射 单击“程序处理映射”选项,在打开的对话框中鼠标右键单击“添加脚本映射”选项,在打开的对话框中,按下图的配置进行输入: 在弹出的对话框中单击是按钮。 之后选择jakarta这项,单击鼠标右键选择编辑功能权限选项,如下图所示全部选中。至此所有的配置完毕。 在浏览器中输入“http://localhost”,在IE中有时如果不加HTTP的化可能会出现错误,这样(不加8080)访问IIS的服务器,可以看到网页显示的是tomcat的默认主页,说明IIS已经指向了tomcat,为了能更好的服务最好将两个服务器指向同一个的Web的目录,这样的IIS就支持jsp了,完成之后重新启动。 在tomcat的配置文件server.xml文件中添加以下这句话可以更改tomcat的默认目录: <Context path=”” docBase=”e:\tomcat”(此处为你的网站根目录,通过这句话的映射,可以将原先的默认更改为新的目录) debug=”0”/> 以上的操作是我根据网上的,书上的做的总结。在百度文库中我也发了一份,我也是初级的研究,如有不足之处希望大家理解。希望大家给我评论一下。   from:http://blog.csdn.net/longyuhome/article/details/7577502

龙生   02 Aug 2017
View Details

IIS7 與 Tomcat整合(use isapi_redirect.dll)

因為想要在一台電腦上同時執行 ASPX 與 JSP 而只能使用80 PORT, 所以只能透過IIS 來轉發 request到tomcat 使用的Tomcat版本是8.0 方法如下: 1.下載 The Apache Tomcat Connectors  我下載的版本是1.2.40 可以得到 isapi_redirect.dll , 我是放在 c:\tomcat8\bin\ 2.設定connector 根據官網的文件 isapi_redirect 的設定方式有兩種 (1) registry setting 在HKLM\SOFTWARE\Apache Software Foundation\Jakarta Isapi Redirector\1.0 新增最少以下資訊 extension_uri:/jakarta/isapi_redirect.dll  (固定值) log_file: c:/tomcat8/logs/isapi_redirect.log log_level: info worker_file: c:/tomcat8/conf/workers.properties (workers設定檔的位置) worker_mount_file: C:/tomcat8/conf/uriworkermap.properties (uri對照的mapping) (2)isapi_redirect.properties 設定同上, 不過我試的結果是沒有用, 所以用第一種方法 #固定值 extension_uri=/jakarta/isapi_redirect.dll #log檔放的位置可以依日期來當檔名可以參考官網設定 log_file=c:/tomcat8/logs/isapi_redirect.log #log的記錄內容有 debug, info, warn, error, trace log_level=info #worker設定檔的位置 worker_file=c:/tomcat8/conf/workers.properties #worker uri mapping對照檔的位置 worker_mount_file=C:/tomcat8/conf/uriworkermap.properties 3.建立workers.properties文件 官網worker參數設定 #隨便設定, 但是要跟等等設定的 uriworkermap.properties一致就好 worker.list=jspWorker #可以是ajp13, ajp14, jni, lb 或是 status #不過以下的設定需要跟server.xml的connector的設定一致 worker.geloinWorker.type=ajp13 #tomcat server所在的電腦 worker.geloinWorker.host=localhost worker.geloinWorker.port=8009 4.設定uriworkermap.properties 詳細設定要參考官網的uri設定 這邊要跟workers.properties的 worker.list設定一致 /*.jsp=jspWorker […]

龙生   02 Aug 2017
View Details

访问maven项目总是报404

刚进公司,不是很熟悉maven,总是访问不了项目,总是报404的错; 解决如下; 选中“项目", 然后右击选择“properties”—->Deployment Asssembly, 然后将webContent项remove掉,还有test相关的文件也可以remove掉, test是测试相关的文件,     add一个folder文件,next-->next-->src下的main下的webapp文件,最后击“Finish”,     在add一个Java Build Path Entries,next—>Maven Dependencies文件,最后再点击"Finish"; 最后再点击"OK";重新启动tomcat,在浏览器中输入相应的地址:http://localhost:8080/MavenTest/index.jsp ,进行测试web项目是否创建成功。 //tomcat 没有jar问题

  from:http://blog.csdn.net/my_name_nb/article/details/59112305

龙生   01 Aug 2017
View Details

maven国内镜像(maven下载慢的解决方法)

Maven是当前流行的项目管理工具,但官方的库在国外经常连不上,连上也下载速度很慢。国内oschina的maven服务器很早之前就关了。今天发现阿里云的一个中央仓库,亲测可用。

修改${maven.home}/conf或者${user.home}/.m2文件夹下的settings.xml文件,在<mirrors>标签下加入上述内容即可。如下: <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <mirrors> <!--阿里云仓库--> <mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/repositories/central/</url> </mirror> <!--中央仓库1--> <mirror> <id>repo1</id> <mirrorOf>central</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://repo1.maven.org/maven2/</url> </mirror> <!--中央仓库2--> <mirror> <id>repo2</id> <mirrorOf>central</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://repo2.maven.org/maven2/</url> </mirror> </mirrors> </settings> from:http://www.cnblogs.com/xiongxx/p/6057558.html

龙生   01 Aug 2017
View Details

React Native之React速学教程(上)

本文出自《React Native学习笔记》系列文章。 React Native是基于React的,在开发React Native过程中少不了的需要用到React方面的知识。虽然官方也有相应的Document,但篇幅比较多,学起来比较枯燥。 通过《React Native之React速学教程》你可以对React有更系统和更深入的认识。为了方便大家学习,我将《React Native之React速学教程》分为上、中、下三篇,大家可以根据需要进行阅读学习。 概述 本篇为《React Native之React速学教程》的第一篇。本篇将从React的特点、如何使用React、JSX语法、组件(Component)以及组件的属性,状态等方面进行讲解。 What’s React React是一个用于组建用户界面的JavaScript库,让你以更简单的方式来创建交互式用户界面。 当数据改变时,React将高效的更新和渲染需要更新的组件。声明性视图使你的代码更可预测,更容易调试。 构建封装管理自己的状态的组件,然后将它们组装成复杂的用户界面。由于组件逻辑是用JavaScript编写的,而不是模板,所以你可以轻松地通过您的应用程序传递丰富的数据,并保持DOM状态。 一次学习随处可写,学习React,你不仅可以将它用于Web开发,也可以用于React Native来开发Android和iOS应用。 不是模板却比模板更加灵活: 心得:上图是GitHub Popular的首页截图,这个页面是通过不同的组件组装而成的,组件化的开发模式,使得代码在更大程度上的到复用,而且组件之间对的组装很灵活。 Get Started 使用React之前需要在页面引入如下js库 。 react.js react-dom.js browser.min.js 上面一共列举了三个库: react.js 、react-dom.js 和 browser.min.js ,它们必须首先加载。其中,react.js 是 React 的核心库,react-dom.js 是提供与 DOM 相关的功能,browser.min.js 的作用是将 JSX 语法转为 JavaScript 语法,这一步很消耗时间,实际上线的时候,应该将它放到服务器完成。 你可以从React官网下载这些库,也可以将其下载到本地去使用。 心得:在做React Native开发时,这些库作为React Native核心库已经被初始化在node_modules目录下,所以不需要单独下载。 使用React 解压从上述地址下载的压缩包,在根目录中创建一个包含以下内容的 “helloworld.html” 。

在 JavaScript 代码里写着 XML 格式的代码称为 JSX,下文会介绍。为了把 JSX 转成标准的 JavaScript,我们用<script type="text/babel">标签,然后通过Babel转换成在浏览器中真正执行的内容。 ReactDOM.render() ReactDOM.render 是 React 的最基本方法,用于将模板转为 HTML 语言,并插入指定的 DOM 节点。

上述代码的作用是将<h1>Hello, world!</h1>插入到元素id为example的容器中。 JSX JSX 是一个看起来很像 XML 的 JavaScript 语法扩展。 每一个XML标签都会被JSX转换工具转换成纯JavaScript代码,使用JSX,组件的结构和组件之间的关系看上去更加清晰。 JSX并不是React必须使用的,但React官方建议我们使用 JSX , 因为它能定义简洁且我们熟知的包含属性的树状结构语法。 […]

龙生   29 Jul 2017
View Details

React Native之React速学教程(中)

本文出自《React Native学习笔记》系列文章。 React Native是基于React的,在开发React Native过程中少不了的需要用到React方面的知识。虽然官方也有相应的Document,但篇幅比较多,学起来比较枯燥。 通过《React Native之React速学教程》你可以对React有更系统和更深入的认识。为了方便大家学习,我将《React Native之React速学教程》分为上、中、下三篇,大家可以根据需要进行阅读学习。 概述 本篇为《React Native之React速学教程》的第二篇。本篇将从组件(Component)的详细说明、组件的生命周期(Component Lifecycle)、isMounted是个反模式等方面进行讲解,让大家对组件(Component)有个更系统以及更深入的认识。 组件的详细说明 当通过调用 React.createClass() 来创建组件的时候,每个组件必须提供render方法,并且也可以包含其它的在这里描述的生命周期方法。 render ReactComponent render() render() 方法是必须的。 当该方法被回调的时候,会检测 this.props 和 this.state,并返回一个单子级组件。该子级组件可以是虚拟的本地 DOM 组件(比如 <div /> 或者 React.DOM.div()),也可以是自定义的复合组件。 你也可以返回 null 或者 false 来表明不需要渲染任何东西。实际上,React 渲染一个<noscript>标签来处理当前的差异检查逻辑。当返回 null 或者 false 的时候,this.getDOMNode() 将返回 null。 注意: render()函数应该是纯粹的,也就是说该函数不修改组件的 state,每次调用都返回相同的结果,不读写 DOM 信息,也不和浏览器交互(例如通过使用 setTimeout)。如果需要和浏览器交互,在 componentDidMount() 中或者其它生命周期方法中做这件事。保持 render() 纯粹,可以使服务器端渲染更加切实可行,也使组件更容易被理解。 心得:不要在render()函数中做复杂的操作,更不要进行网络请求,数据库读写,I/O等操作。 getInitialState object getInitialState() 初始化组件状态,在组件挂载之前调用一次。返回值将会作为 this.state的初始值。 心得:通常在该方法中对组件的状态进行初始化。 getDefaultProps object getDefaultProps() 设置组件属性的默认值,在组件类创建的时候调用一次,然后返回值被缓存下来。如果父组件没有指定 props 中的某个键,则此处返回的对象中的相应属性将会合并到 this.props (使用 in 检测属性)。 Usage:

注意 该方法在任何实例创建之前调用,因此不能依赖于 this.props。另外,getDefaultProps() 返回的任何复杂对象将会在实例间共享,而不是每个实例拥有一份拷贝。 心得:该方法在你封装一个自定义组件的时候经常用到,通常用于为组件初始化默认属性。 PropTypes object propTypes propTypes 对象用于验证传入到组件的 props。 可参考可重用的组件。 Usage:

心得:在封装组件时,对组件的属性通常会有类型限制,如:组件的背景图片,需要Image.propTypes.source类型,propTypes便可以帮你完成你需要的属性类型的检查。 mixins array mixins mixin 数组允许使用混合来在多个组件之间共享行为。更多关于混合的信息,可参考Reusable Components。 心得:由于ES6不再支持mixins,所以不建议在使用mixins,我们可以用另外一种方式来替代mixins,请参考:React Native之React速学教程(下)-ES6不再支持Mixins。 statics object statics statics 对象允许你定义静态的方法,这些静态的方法可以在组件类上调用。例如:

在这个块儿里面定义的方法都是静态的,你可以通过ClassName.funcationName的形式调用它。 注意 这些方法不能获取组件的 props 和 state。如果你想在静态方法中检查 props 的值,在调用处把 props 作为参数传入到静态方法。 displayName string displayName displayName 字符串用于输出调试信息。JSX 自动设置该值;可参考JSX in Depth。 isMounted boolean isMounted(),当组件被渲染到DOM,该方法返回true,否则返回false。该方法通常用于异步任务完成后修改state前的检查,以避免修改一个没有被渲染的组件的state。 心得:开发中不建议大家isMounted,大家可以使用另外一种更好的方式来避免修改没有被渲染的DOM,请下文的isMounted 是个反模式。 组件的生命周期(Component Lifecycle) 在iOS中UIViewController提供了(void)viewWillAppear:(BOOL)animated, – (void)viewDidLoad,(void)viewWillDisappear:(BOOL)animated等生命周期方法,在Android中Activity则提供了onCreate(),onStart(),onResume(),onPause(),onStop(),onDestroy()等生命周期方法,这些生命周期方法展示了一个界面从创建到销毁的一生。 那么在React […]

龙生   29 Jul 2017
View Details

React Native之React速学教程(下)

本文出自《React Native学习笔记》系列文章。

React Native是基于React的,在开发React Native过程中少不了的需要用到React方面的知识。虽然官方也有相应的Document,但篇幅比较多,学起来比较枯燥。 通过《React Native之React速学教程》你可以对React有更系统和更深入的认识。为了方便大家学习,我将《React Native之React速学教程》分为上、中、下三篇,大家可以根据需要进行阅读学习。

龙生   29 Jul 2017
View Details

深入浅出React(一):React的设计哲学 – 简单之美

编者按:自2013年Facebook发布以来,React吸引了越来越多的开发者,基于它的衍生技术,如React Native、React Canvas等也层出不穷。InfoQ精心策划“深入浅出React”系列文章,为读者剖析React开发的技术细节。 React最初来自Facebook内部的广告系统项目,项目实施过程中前端开发遇到了巨大挑战,代码变得越来越臃肿且混乱不堪,难以维护。于是痛定思痛,他们决定抛开很多所谓的“最佳实践”,重新思考前端界面的构建方式,于是就有了React。 React带来了很多开创性的思路来构建前端界面,虽然选择React的最重要原因之一是性能,但是相关技术背后的设计思想更值得我们去思考。之前我也曾写过一篇React的入门文章,并提供了示例代码,大家可以结合参考。 上个月React发布了最新的0.13版,并提供了对ES6的支持。在新版本中,一个小小的改变是React取消了函数的自动绑定,也就是说,以前可以这样去绑定一个事件:

而在以ES6语法定义的组件中,必须写为:

了解前端开发和JavaScript的同学都知道,做事件绑定时我们需要通过bind(或类似函数)来实现一个闭包以让事件处理函数自带上下文信息,这是由JavaScript语言特性决定的。而在0.13版本之前,React会自动在初始化时对组件的每一个方法做一次这样的绑定,类似于this.func = this.func.bind(this),这样在JSX的事件绑定中就可以直接写为onClick={this.handleSubmit}。 表面上看自动绑定给开发带来了便利,而Facebook却认为这破坏了JavaScript的语言习惯,其背后的神奇(Magic)逻辑或许会给初学者带来困惑,甚至开发者如果从React再转到其它库也可能会无所适从。基于同样的理由,React还取消了对mixin的支持,基于ES6的React组件不再能够以mixin的形式进行代码复用或者扩展。尽管这带来了很大不便,但Facebook认为mixin增加了代码的不可预测性,无法直观的去理解。关于mixin的思考,还可以参考这篇文章。 以简单直观、符合习惯的(idiomatic)方式去编程,让代码更容易被理解,从而易于维护和不断演进。这正是React的设计哲学。 编写可预测,符合习惯的代码 所谓可预测(predictable),即容易理解的代码。在年初的React开发者大会上,React项目经理Tom Occhino进一步阐述React诞生的初衷,在演讲中提到,React最大的价值究竟是什么?是高性能虚拟DOM、服务器端Render、封装过的事件机制、还是完善的错误提示信息?尽管每一点都足以重要。但他指出,其实React最有价值的是声明式的,直观的编程方式。 软件工程向来不提倡用高深莫测的技巧去编程,相反,如何写出可理解可维护的代码才是质量和效率的关键。试想,一个月之后你回头看你写的代码,是否一眼就明白某个变量,某个if判断的含义;一个新加入的同事想去增加一个小小的新功能或是修复某个Bug,他是否对自己的代码有足够的信心不引入任何副作用?随着功能的增加,代码很容易变得越来越复杂,这些问题也将越来越严重,最终导致一份难以维护的代码。而React号称,新同事甚至在加入的第一天就能开始开发新功能。 那么React是如何做的呢? 使用JSX直观的定义用户界面 JSX是React的核心组成部分,它使用XML标记的方式去直接声明界面,界面组件之间可以互相嵌套。但是JSX给人的第一印象却是相当“丑陋”。当下面这样的例子被第一次展示的时候,甚至很多人称之为“巨大的退步(Huge Step Backwards)”:

将HTML直接嵌入到JavaScript代码中看上去确实是一件足够疯狂的事情。人们花了多年时间总结出的界面和业务逻辑相互分离的“最佳实践”就这么被彻底打破。那么React为何要如此另类? 模板出现的初衷是让非开发人员也能对界面做一定的修改。但这个初衷在当前Web程序里已完全不适用,每个模板背后的代码逻辑严重依赖模板中的内容和DOM结构,两者是紧密耦合的。即使做到文件位置的分离,实际上两者还是一体的,并且为了两者之间的协作而不得不引入很多机制和概念。以Angularjs的首页示例代码为例:

尽管我们很容易看懂这一小段模板的含义,但你却无法开始写这样的代码,因为你需要学习这一整套语法。比如说,你得知道有ng-repeat这样的标记的准确含义,其中的”todo in todoList.todos”看上去是repeat语法的一部分,或许还有其它语法存在;可以看到有{{todo.text}}这样的数据绑定,那么如果要对这段文本格式化(加一个formatter)该怎么做;另外,ng-model背后又需要什么样的数据结构? 现在来看React怎么写这段逻辑:

可以看到,JSX中除了另类的HTML标记之外,并没有引入其它任何新的概念(事实上HTML标记也可以完全用JavaScript去写)。Angular中的repeat在这里被一个简单的数组方法map所替代。在这里你可以利用熟悉的JavaScript语法去定义界面,在你的思维过程中其实已经不需要存在模板的概念,需要考虑的仅仅是如何用代码构建整个界面。这种自然而直观的方式直接降低了React的学习门槛并且让代码更容易理解。 简化的组件模型:所谓组件,其实就是状态机器 组件并不是一个新的概念,它意味着某个独立功能或界面的封装,达到复用、或是业务逻辑分离的目的。而React却这样理解界面组件: 所谓组件,就是状态机器 React将用户界面看做简单的状态机器。当组件处于某个状态时,那么就输出这个状态对应的界面。通过这种方式,就很容易去保证界面的一致性。 在React中,你简单的去更新某个组件的状态,然后输出基于新状态的整个界面。React负责以最高效的方式去比较两个界面并更新DOM树。 这种组件模型简化了我们思考的方式:对组件的管理就是对状态的管理。不同于其它框架模型,React组件很少需要暴露组件方法和外部交互。例如,某个组件有只读和编辑两个状态。一般的思路可能是提供beginEditing()和endEditing()这样的方法来实现切换;而在React中,需要做的是setState({editing: true/false})。在组件的输出逻辑中负责正确展现当前状态。这种方式,你不需要考虑beginEditing和endEditing中应该怎样更新UI,而只需要考虑在某个状态下,UI是怎样的。显然后者更加自然和直观。 组件是React中构建用户界面的基本单位。它们和外界的交互除了状态(state)之外,还有就是属性(props)。事实上,状态更多的是一个组件内部去自己维护,而属性则由外部在初始化这个组件时传递进来(一般是组件需要管理的数据)。React认为属性应该是只读的,一旦赋值过去后就不应该变化。关于状态和属性的使用在后续文章中还会深入探讨。 每一次界面变化都是整体刷新 数据模型驱动UI界面的两层编程模型从概念角度看上去是直观的,而在实际开发中却困难重重。一个数据模型的变化可能导致分散在界面多个角落的UI同时发生变化。界面越复杂,这种数据和界面的一致性越难维护。在Facebook内部他们称之为“Cascading Updates”,即层叠式更新,意味着UI界面之间会有一种互相依赖的关系。开发者为了维护这种依赖更新,有时不得不触发大范围的界面刷新,而其中很多并不真的需要。React的初衷之一就是,既然整体刷新一定能解决层叠更新的问题,那我们为什么不索性就每次都这么做呢?让框架自身去解决哪些局部UI需要更新的问题。这听上去非常有挑战,但React却做到了,实现途径就是通过虚拟DOM(Virtual DOM)。 关于虚拟DOM的原理我在去年底的文章有过比较详细的介绍,这里不再重复。简而言之就是,UI界面是一棵DOM树,对应的我们创建一个全局唯一的数据模型,每次数据模型有任何变化,都将整个数据模型应用到UI DOM树上,由React来负责去更新需要更新的界面部分。事实证明,这种方式不但简化了开发逻辑并且极大的提高了性能。 以这种思路出发,我们在考虑不断变化的UI界面时,仅仅需要整体考虑UI的构成。编程模型的简化带来的是代码的精简和易于理解,也即React不断提到的可预测(Predictable)的代码,代码的功能一目了然易于理解。Tom Occhino在2015 React开发者大会上也分享了React在Facebook内部的应用案例,随着新功能被不断的添加到系统中,开发进度非但没有变慢,甚至越来越快。 单向数据流动:Flux 既然已经有了组件机制去定义界面,那么还需要一定的机制来定义组件之间,以及组件和数据模型之间如何通信。为此,Facebook提出了Flux框架用于管理数据流。Flux是一个相当宽松的概念框架,同样符合React简单直观的原则。不同于其它大多数MVC框架的双向数据绑定,Flux提倡的是单向数据流动,即永远只有从模型到视图的数据流动。 Flux引入了Dispatcher和Action的概念:Dispatcher是一个全局的分发器负责接收Action,而Store可以在Dispatcher上监听到Action并做出相应的操作。简单的理解可以认为类似于全局的消息发布订阅模型。Action可以来自于用户的某个界面操作,比如点击提交按钮;也可以来自服务器端的某个数据更新。当数据模型发生变化时,就触发刷新整个界面。 Flux的定义非常宽松,除了Facebook自己的实现之外,社区中还出现了很多Flux的不同实现,各有特点,比较流行的包括Flexible, Reflux, Flummox等等。 让数据模型也变简单:Immutability Immutability含义是只读数据,React提倡使用只读数据来建立数据模型。这又是一个听上去相当疯狂的机制:所有数据都是只读的,如果需要修改它,那么你只能产生一份包含新的修改的数据。假设有如下数据:

如果要修改年龄,那么你需要产生一份新的数据:

这样,原来的employee对象并没有发生任何变化,相反,产生了一个新的updated对象,体现了年龄发生了变化。这时候需要把新的updated对象应用到界面组件上来进行界面的更新。 只读数据并不是Facebook的全新发明,而是起源于Clojure, Scala, Haskell等函数式编程语言。只读的数据可以让代码更加的安全和易于维护,你不再需要担心数据在某个角落被某段神奇的代码所修改;也就不必再为了找到修改的地方而苦苦调试。而结合React,只读数据能够让React的组件仅仅通过比较对象引用是否相等来决定自身是否要重新Render。这在复杂的界面上可以极大的提高性能。 针对只读数据,Facebook开发了一整套框架immutable.js,将只读数据的概念引入JavaScript,并且在github开源。如果不希望一开始就引入这样一个较大的框架,React还提供了一个工具类插件,帮助管理和操作只读数据:React.addons.update。 React思想的衍生:React Native, React Canvas等等 在前几天的Facebook F8开发者大会上,React Native终于众望所归的发布,它将React的思想延伸到了原生移动开发。它的口号是“Learn Once, Write Anywhere”,有React开发经验的开发人员将可以无缝的进行React Native开发。无论是组件化的思想,调试工具,动态代码加载等React具有的强大特性都可以应用在React Native。相信这会对以后的移动开发布局产生重要影响。 React对UI层进行了完美的抽象,写Web界面时甚至能够做到完全的去DOM化:开发者可以无需进行任何DOM操作。因此,这也让对UI层进行整体替换成为了可能。React Native正是将浏览器基于DOM的UI层换成了iOS或者Android的原生控件。而Flipboard则将UI层换成了Canvas。 React Canvas是Flipboard出品的一套前端框架,所有的界面元素都通过Canvas来绘制,infoQ之前也有文章对其进行了介绍。Flipboard追求极致的性能和用户体验,因此对浏览器的缓慢DOM操作深恶痛绝,不惜大刀阔斧彻底舍弃了DOM,而完全用Canvas实现了整套UI控件。有兴趣的同学不妨一试。 小结 React并不是突然从哪里蹦出来,而是为了解决前端开发中的痛点而生。以简单为原则设计也决定了React具有极其平缓的学习曲线,开发者可以快速上手并应用到实际项目中。本文总结分析了其相关技术背后的设计思想,希望通过这个角度能让大家对React有一个总体的认识,从而在React的实际项目开发中,遵循简单直观的原则,进行高效率高质量的产品开发。 参考资料 React官方网站:http://facebook.github.io/react/ React博客:http://facebook.github.io/react/blog/ React入门:http://ryanclark.me/getting-started-with-react/ 颠覆式前端UI框架:React:http://www.infoq.com/cn/articles/subversion-front-end-ui-development-framework-react Immutable.js: http://facebook.github.io/immutable-js/ […]

龙生   29 Jul 2017
View Details
1 235 236 237 432