前端模块化开发学习之gulp&browserify篇
随着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 ...
随机推荐
- 06_WebService与Socket的区别
[区别] 区别1. Socket是基于TCP/IP的传输层协议. WebService是基于HTTP协议传输数据的,HTTP是基于TCP的应用层协议. 区别2. WebService采用了基于HTTP ...
- Win7下Boost库的安装
Boost库是C++领域公认的经过千锤百炼的知名C++类库,涉及编程中的方方面面,简单记录一下使用时的安装过程 1.boost库的下载 boost库官网主页:www.boost.org 2.安装 将下 ...
- linux一部分常用的命令
如今的web项目,一般在windows下开发,然后部署在linux上.搜索了一下原因,大概是说,linux免费,此外,linux长时间运行都没有问题,可以达到1到2年不停机.因此,需要学习一些常用的l ...
- 系统监控的一些工具w , vmstat
w 命令:--w 查看的是系统整体上的负载 # w 15:23:46 up 3:34, 2 users, load average: 0.03, 0.05, 0.00 USER TTY FROM LO ...
- ES6笔记-正则表达式和字符串正则方法
RegExp构造函数 在ES5中,RegExp构造函数的参数有两种情况. 第一种情况是,参数是字符串,这时第二个参数表示正则表达式的修饰符(flag). var regex = new RegExp( ...
- web2.0最全的国外API应用集合
web2.0最全的国外API应用集合 原文地址:http://www.buguat.com/post/98.html 2.0时代,越来越多的API被大家广泛应用,如果你还不了解API是何物,请看这里的 ...
- 股票API
实时股票数据接口大全 股票数据的获取目前有如下两种方法可以获取:1. http/javascript接口取数据2. web-service接口 1.http/javascript接口取数据 1.1Si ...
- HDU 1532 Drainage Ditches 最大流 (Edmonds_Karp)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1532 感觉题意不清楚,不知道是不是个人英语水平问题.本来还以为需要维护入度和出度来找源点和汇点呢,看 ...
- Forget asp.net membership,ASP.NET Identity Overview
http://www.asp.net/identity http://www.asp.net/identity/overview/getting-started/introduction-to-asp ...
- C与OC、C++的区别
C语言的特点:1)C语言是结构化语言,层次清晰,调试和维护比较容易2)表现能力和处理能力比较强,可直接访问内存的物理地址3)c语言实现对硬件的编辑,c语言课用语系统软件的开发,也可用语应用软件的开发, ...