随着web应用的发展,前端的比重占得越来越多,编写代码从而也越来越复杂。而通常我们需要将不同功能或者不同模块的代码分开写,最后在html中一起加载,这样做是可以的,但是当你需要进行维护或者是二次开发的时候,你会觉得十分费劲,因为你不知道文件之间复杂的关系,所以我们需要利用一些插件来配合进行模块化的开发。
所谓模块化的开发,写过nodejs的人都知道,文件之间的依赖可以用require()实现,但是浏览器端是不支持这样的依赖形式的,而browserify却可以解决这个问题,再加上gulp这个强大的构建工具,使得前端的模块化开发变得简单了。
接下来就利用gulp和browserify两个工具,将ReactJs编写的一个小Demo进行展示:
先来看下我们最终的目录结构,以便读者的后续操作:
一.如何用React编写Demo
React是Facebook于2013年开源的一套框架,它从刚开始的UI框架逐渐演变成了新的Web解决方案。它的主要特点有三个:
---Just the UI
---Virtual DOM
---data flow
一个语言的框架,重要的不是记住它的接口,而是要掌握它的思想,要理解并掌握React,需要从这三个特性入手。
Just the UI
没错,React在UI上有非常有优势的地方,这个优势主要来源于React可以将一个网页,甚至是一个项目工程的静态页面切割成不同的块,也就是组件。
组件化的开发可以避免模板(如ejs)开发复杂的逻辑,同时它不影响其他框架库类合并使用,更有利于团队开发。可见React使开发有了更便捷,使维护更简单。
Virtual DOM
熟悉前端的人都知道,传统的DOM渲染及操作是很耗时的,特别是在DOM操作比较频繁的情况下,DOM是性能出现瓶颈的主要因素。
而React采用虚拟DOM,利用diff算法来进行DOM管理,这里的虚拟DOM其实是保存在内存中,所以速度是非常快的。而且虚拟DOM可以在服务器端渲染,在性能方面这是很有创新的。可见React使网站性能更好。
data flow
React中的数据流与Angular是不同的,或许你认为Angular的双向数据流对于数据交互非常轻松,但是React基于属性Props和状态State的单向数据流会给你带来条理非常清晰的逻辑,当然你还可以引入其他框架或者库类来进行与后台的数据交换,这一切的数据都是由组件(React中组件就是一个个状态机)的属性和状态决定。可见React使任务逻辑更清晰。
React是很创新的,对现代工业化前端的开发,维护以及使用的性能都是非常好的提升。还有关于React一些细节就不在这里细说了。
接下来我们开始编写我们的React Demo。这是一个类似问卷的一个小Demo,包含了3个判断题的组件的一个页面,我们最后需要将用户填写的结果上传到服务器,例子很简单,大家主要要体验下这个开发过程。
首先在创建一个工程项目:
1.创建一个项目文件夹,并且在sublime text中打开
2.使用cmd进入这个文件夹,然后npm init创建package.json文件,这个文件展示工程的相关信息,包括插件的信息。(前提是要先安装npm)
3.编写子组件Child.jsx(判断题组件),从现在开始我们直接采用模块化的语法来编写JSX文件,写过Node的小伙伴会觉得很熟悉,它其实和服务器端的CommonJs规范是差不多的。有关React的语法可以通过React的官方文档进行了解。
facebook.github.io/react/index.html >>Learn React Now !
var React = require("react/addons"); // 判断题可以看作对和错只能选一个的题目,因此是一个单选框
var Child = React.createClass({
// 状态对象包含判断题的当前选项的值
// @param : value
// @key : true,false
getInitialState : function(){
return{
value : "true"
};
},
handleChange : function(event){
//通过事件委托连接子组件和父组件,将子组件中的value状态传入到父组件中
if(this.props.onChange){
this.props.onChange(event);
}
//更改子组件的状态,重新渲染UI上。
this.setState({
value : event.target.value
});
},
render : function(){
return(
<div>
<label>{this.props.label}</label>
<input type="radio" name={this.props.name} checked={this.state.value == "true"} value="true" onChange={this.handleChange} />
"true"
<input type="radio" name={this.props.name} checked={this.state.value == "false"} value="false" onChange={this.handleChange} />
"false"
</div>
)
}
}); module.exports = Child;
4.编写父组件Parent.jsx(提交组件)。
var React = require("react/addons");
var Child = require("./Child.jsx"); var Parent = React.createClass({
getInitialState : function(){
return{
//题目编号
name : ["judge-1","judge-2","judge-3"],
//题目名称
label : ["do you think yxy is handsome?",
"do you like this boke?",
"do you want to know React?"
],
//用户默认选项
value1 : "true",
value2 : "true",
value3 : "true"
}
},
handleChange : function(value,event){
var newState = {};
//通过子组件传过来的value改变当前父组件的value
newState[value] = event.target.value;
//设置新状态
this.setState(newState);
},
handleSubmit : function(event){
//取消提交默认事件
event.preventDefault();
//打印父组件存放的数据
console.log(this.state);
},
render : function(){
var renderChilds = [];
renderChilds = this.state.name.map(function(value,index){
return(
<Child name={this.state.name[index]} label={this.state.label[index]} onChange={this.handleChange.bind(this,"value"+(index+1))}></Child>
);
}.bind(this));
return(
<form onSubmit={this.handleSubmit}>
{renderChilds}
<button type="submit">提交</button>
</form>
);
}
}); module.exports = Parent;
5.最后的出口文件app.jsx。
var React = require("react/addons");
var Parent = require("./Parent.jsx"); React.render(<Parent></Parent>,document.body);
Perf = React.addons.Perf;
6.目前为止我们工程的目录如下:
React编写告一段落。
二.Gulp入门及操作
什么是Gulp
Gulp是一个基于流的自动化构建工具,需要注意两点,一为自动化,二为流。
在Gulp之前又一款名为Grunt的工具拉开了前端自动化的帷幕。所谓自动化,就是自动帮你完成一些工程中需要我们去手动完成的一些重复繁琐的操作,简单的比如预处理,压缩,合并文件等等。而"流",代表着Gulp通过IO流的通道高效地进行自动化任务,前面提到的Grunt是与之相反,它没进行一次任务都会打开一次IO通道,任务耗时自然没有Gulp好。
了解Grunt -> 官网 : http://gruntjs.com/ 中文官网 : http://www.gruntjs.net/
了解Gulp -> 官网 : http://gulpjs.com/ 中文官网 : http://www.gulpjs.com.cn/
安装Gulp
安装及项目使用过程在官网都有介绍,这里再简单说一下。
1.全局安装Gulp
npm install -g gulp
2.作为项目的开发依赖安装
npm install gulp --save-dev
如何使用Gulp管理文件
1.创建gulpfile.js文件于项目根目录,在其中编写我们的任务代码。
var gulp = require('gulp'); gulp.task('default', function() {
// 将你的默认的任务代码放在这
});
2.在gitBash或者其他窗口命令中执行任务
gulp
关于Gulp
Gulp的学习非常简单,反复练习几次你就会发现Gulp的方便之处~
三.Browserify入门及操作
上一点中,我们知道了gulp是一款非常强大的自动化构建工具,然而我们最开始也提到了浏览器中是不能直接解析类似require()这样的语法的。所以我们需要Browserify这个强大的工具。
什么是Browserify
Browserify 可以让你使用类似于 node 的 require() 的方式来组织浏览器端的 Javascript 代码,通过预编译让前端 Javascript 可以直接使用 Node NPM 安装的一些库。
了解Browserify -> 官网 : http://browserify.org/
安装Browserify
安装Browserify和安装Gulp是一样的简单。
1.全局安装Browserify
npm install -g browserify
2.作为项目的开发依赖安装
npm install browserify --save-dev
如何使用Browserify
1.利用Browserify解决require()依赖问题,将app.js中所有依赖项加载并整合到goal.js中。html只要加载goal.js即可。
browserify app.js > goal.js
关于Browserify
Browserify解决了js在浏览器端的依赖问题,但是还有一个更为强大的工具名曰webpack!它可以将js,css,png等很多文件的依赖问题解决,而Browserify只能解决js。但已经足够强大,有关webpack的内容我和大家都还需要慢慢去了解。
四.演示Demo
终于到了激动人心的时候,现在我会结合前面两个工具来进行前端模块化开发的模拟。
1.包含所有依赖到node_modules文件中,package.json中会出现对应依赖项。
1.1 React框架.
npm install react --save-dev
安装React是为了使我们编写的React组件能够顺利使用。
1.2 Gulp工具.
npm install gulp --save-dev
安装Gulp方便自动化构建我们的文件
1.3 Browserify工具
npm install browserify --save-dev
安装Browserify解决js依赖问题。
*1.4 reactify工具
npm install reactify --save-dev
将jsx编译为js,类似与JSXTransform.js。
*1.5 react-tools工具
npm install react-tools --save-dev
*1.6 vinyl-source-stream工具
npm install vinyl-source-stream --save-dev
这个要着重说一下,使用gulp时,你可能会陷入“流不兼容”的问题。这主要是因为常规流和Vinyl文件对象有差异,或是使用了仅支持buffer(不支持流)库的gulp插件与常规流不兼容。
如果我们需要将gulp和(或)gulp插件与常规的可读流一起使用,我们就需要先把可读流转换为vinyl。
如果实在不能理解,可以取百度Google更多资料,推荐看看这篇文章 : http://segmentfault.com/a/1190000000711469
2.编写gulpfile.js文件
在编写之前要明确我们的目的 ->将所有的jsx及jsx所依赖的js文件合并到一个新的js文件中
因此gulpfile.js文件如下 :
var gulp = require("gulp");
var browserify = require("browserify");
var source = require("vinyl-source-stream");
var reactify = require("reactify"); //gulp主动设置的命令
gulp.task("combine",function(){
//通过browserify管理依赖
browserify({
//入口点,app.jsx
entries : ["./app.jsx"],
//利用reactify工具将jsx转换为js
transform : [reactify]
})
//转换为gulp能识别的流
.bundle()
//合并输出为app.js
.pipe(source("app.js"))
//输出到当前文件夹中
.pipe(gulp.dest("./"));
}); //gulp默认命令
gulp.task("default",["combine"]);
3.执行gulp命令
4.查看我们的目录结构
5.打开index.html
6.执行4次提交操作,观察数据是否正确显示
7.可以看到value1,value2,value3的值随我们的不同提交而改变。
总结:
前端如今已经步入工业化的时代,结合多样的工具可以让我们更高效地进行开发,当然现在的前端工具仍处于不稳定的阶段,但我们也需要不断的摸索,从grunt到gulp,再到当下最火的webpack,前端多样化的工具的更新迭代从未停下脚步,因此我们更不应该停止学习的脚步。
同样的,gulp+browserify的开发模式可能会随着前端的浪潮逐渐被埋没,但它的思想是永恒的,我们要做的便是抛下浮躁,去探索更好的开发模式。
前端模块化开发学习之gulp&browserify篇的更多相关文章
-
JavaScript学习总结(六)——前端模块化开发
早期的javascript版本没有块级作用域.没有类.没有包.也没有模块,这样会带来一些问题,如复用.依赖.冲突.代码组织混乱等,随着前端的膨胀,模块化显得非常迫切. 前端模块化规范如下: 一.前端模 ...
-
ASP.NET Core Web开发学习笔记-1介绍篇
ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...
-
legend3---11、php前端模块化开发
legend3---11.php前端模块化开发 一.总结 一句话总结: 把常用的前端块(比如课程列表,比如评论列表)放进模块列表里面,通过外部php变量给数据,可以很好的实现复用和修改 页面调用 @p ...
-
构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)
通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...
-
Unity 3D游戏开发学习路线(方法篇)
Unity 3D本来是由德国的一些苹果粉丝开发的一款游戏引擎,一直只能用于Mac平台,所以一直不被业外人士所知晓.但是后来也推出了2.5版,同时发布了PC版本,并将其发布方向拓展到手持移动设备.Uni ...
-
[整理]前端模块化开发AMD CMD
前端模块化开发的价值 AMD (中文版) CMD 模块定义规范 标准构建 http://seajs.org http://chaoskeh.com/blog/why-seajs.html http:/ ...
-
前端模块化开发篇之grunt&;webpack篇
几个月前写了一篇有关gulp和browserify来做前端构建的博客,因为browserify用来做js的打包时可能有些麻烦(特别是在写React的时候),所以这里再强烈推荐一款js打包工具-webp ...
-
web前端学习路线:HTML5教程之前端模块化开发
1. 命名冲突 首先从一个简单的习惯开始. 由于以前一直做 JavaEE 开发的缘故,在 JavaScript 开发中,我已经习惯将项目中的一些通用功能抽象出来,形成一个个的独立函数,以便于实现代码复 ...
-
JAVAScript:前端模块化开发
目录 一:前端模块化概要 1.1.模块化概要 1.2.函数封装 1.3.对象封装 1.4.立即执行函数表达式(IIFE) 1.5.模块化规范 1.5.1.CommonJS 1.5.2.AMD((Asy ...
随机推荐
-
修改Windows Server 2008+IIS 7+ASP.NET默认连接限制,支持海量并发连接数
WIN7中IIS7默认配置的服务器同时最多只能处理5000个请求,如果由于某些情况(程序问题等)造成同时请求超过5000时,将会导致服务器错误.为此,修改服务器的设置,从而支持10万个同时请求. 具体 ...
-
HTML5设计网页动态条幅广告(Banner) 已经加上完整源代码
横幅广告(Banner): 1.横幅广告是网络广告的常见形式,一般位于网页的醒目位置上:当用户单击这些横幅广告时,通常可以链接到相应的广告页面: 2.设计横幅广告时,要力求简单明了,能够体现出主要的中 ...
-
HQL基础查询语句
HQL基础查询语句 1.使用hql语句检索出Student表中的所有列 //核心代码 @Test public void oneTest() { Query query=session.createQ ...
-
在Ubuntu6.06 在搭建SVN服务器及在windows建立svn+ssh客户端
部门现在使用的Linux系统是Ubuntu6.06,内核版本为2.6.15-57-386.由于系统比较老,所有用网上介绍的方法搭建SVN服务器经常出错,所以参考文章[1],将自己的搭建过程记录下. 1 ...
-
css优先级之特殊性
在前端开发的时候,css构建样式规则,这个时候我们会遇到一个问题:当我们对同一个元素做多个样式规则,其中发生了冲突的时候,css是如何选择最终呈现的样式 如下: div{ color:red; } d ...
-
结对开发五--对一千个数long型的一维数组求最大子数组的和
一.设计思想 我们根据第一个实验,再让他自动生成1000个随机long型数.大致思想和实验一一样,自己已埋入炸弹. 二.实验代码 package com.minirisoft; import java ...
-
Python学习之路并发编程--信号量、事件、队列及生产消费模型
1. 信号量 对于多进程来说,多个进程同时修改数据,就可能出现安全隐患,所以引入了锁,这一机制,但锁只能有一把来控制一个的开关,当你需要几把锁的时候,就可能用到信号量的概念.他是用了锁的原理,内置了一 ...
-
SourceInsight快捷键
下载安装与设置 https://blog.csdn.net/k346k346/article/details/77412413 常用设置总结的还是比较全面的 问题: SourceInsight4.0中 ...
-
【Python实践-7】输出100以内的所有素数
#输出100以内的所有素数,素数之间以一个空格区分(注意,最后一个数字之后不能有空格). i= l=[] : k= ,i): : k=k+ : l.append(i) i=i+ print(" ...
-
Atcoder #017 agc017 D.Game on Tree 树上NIM 博弈
LINK 题意:树上NIM的模板题,给出一颗树,现有操作删去端点不为根节点的边,其另一端节点都将被移除,不能取者为败 思路:一看就是个NIM博弈题,只是搬到树上进行,树上DFS进行异或 记得#014D ...