在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称(OpenSource Name):i5ting/stuq-gulp开源软件地址(OpenSource Url):https://github.com/i5ting/stuq-gulp开源编程语言(OpenSource Language):JavaScript 94.8%开源软件介绍(OpenSource Introduction):StuQ-Gulp实战和原理解析大家好,我是桑世龙,github和cnodejs上的i5ting,目前在天津创业,公司目前使用技术主要是nodejs,算所谓的MEAN(mongodb + express + angular + node),所有代码都部署在阿里云上 我的名字i5ting,原因是我媳妇叫张婷,哈哈 闲言少叙,下面开始正题 《Gulp实战和原理解析》 本次主要讲3部分
什么是gulp?简单的讲,gulp是一个构建工具,一个streaming构建工具,一个nodejs写的构建工具 总之,它是一个构建工具 那么什么是构建工具呢? 构建工具本质就是为了自动化构建,解放程序员、提供程序员效率的工具 我们来举个例子,最早的make,因为每次都cc编译,太恶心了,而且当文件特别多的时候,编译速度又慢下来,能不能按需编译,增量编译? make是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作的 例子就不举了,写过c的人多少都知道点 其实编译在每个语言世界里,都是痛,骨子里的风湿一样,于是产生了make类似的东西
它们的共同特点
如此看来,nodejs的构建系统也应该是这样的,可以说gulp是node世界里和上面几个构建工具最像的一个,它们太像了,以至于学习起来特别简单 其实上面还提了一个streaming,是流式的意思,后面讲原理的时候会深入讲解 入门指南说是入门指南,还是得从npm开始科普 1. 安装 gulp:建议全局安装 $ npm install --global gulp 但最多的是作为项目的开发依赖(devDependencies)安装: $ npm install --save-dev gulp 2. 创建gulpfile在项目根目录下创建一个名为 var gulp = require('gulp');
gulp.task('default', function() {
// 将你的默认的任务代码放在这
}); gulpfile和makefile、build.xml等是类似的,定义task的地方。 定义好task,下面运行一下 3. 运行 gulp:$ gulp 默认的名为 default 的任务(task)将会被运行,在这里,这个任务并未做任何事情。 想要单独执行特定的任务(task),请输入 是不是很简单? 下面比较一下grunt和gulp gulp vs gruntGulp 和 Grunt 类似。但相比于 Grunt 的频繁的 IO 操作,Gulp 的流操作,能更快地完成构建。 grunt是基于dsl声明式写法,出来的早,但写起来比较恶心,可读性非常差。。。。 nodejs里sails的因为基于grunt被鄙视,ionic里也是,好在ionic现在也是gulp的 鄙视完grunt,就该吹吹gulp了 话说2014年gulp火了之后,很快风头就盖过了grunt,好不好,试了才知道 why gulp?前端本身就对js非常了解,gulp可以说是plain js,语法都再简单不过,所以大家比较容易接受 1. 基于nodejs基于nodejs的小而美哲学,写gulp task是件很愉快的事儿 而且还可以结合nodejs世界里最好的包管理器npm,写cli或者模块特别简单 而且可以写c/c++ addon,给你无限可能 而且还有shelljs这样的库,结合shell,给你无限可能 2. 易于使用通过代码优于配置的策略,Gulp 让简单的任务简单,复杂的任务可管理。 而且对ant,rake,make等了解的人非常容易上手 3. 构建快速利用 Node.js stream的威力,你可以快速构建项目并减少频繁的 IO 操作。 而且gulp的核心代码可以高效利用你所有核的cpu,高效运行,尤其是大文件处理,后面会讲到 4. 插件机制Gulp 严格的插件指南确保插件如你期望的那样简洁高质得工作。 5. 易于学习通过最少的 API,掌握 Gulp 毫不费力 这得益于gulp的设计,api简单,调用关系和依赖清晰,当然如果理解linux 管道或者其他类似的构建工具会容易 而且每个任务都拆分成一个task,结构清晰,利用stream和pipe写法,组成task,也是非常容易学习的。 总结这里说了gulp的各种好处,它通用,高效,使用简单,学习成本低,总之,我就是要告诉你:它是非常好的构建工具,而且是长久看好的。 它也有缺点,这样说也不太合适,更准确的说,它是一个通用构建工具,所以在构建实践上,需要写的人有好的实践 像fib3这样的,只是基于比较好的构建实践而已,其他方面是不能和gulp相提并论的。 gulp快速入门都说得来个hello world hello world创建gulpfile.js
然后只需执行命令
定义作业就是这么加单
自定义作业custom task with name stuq
then run
这里的stuq是作业名称 自己定义一个task就是这么简单 依赖作业
这里的task有3个参数 default是方法名称,只有default比较奇怪,会默认调用。 相当于c里的main方法 ['watch']这是依赖的作业列表,它们是由顺序的,按数组顺序依次执行 第三个参数是成功执行完上面的依赖作业后执行的回调函数 这里要强调,依赖作业数组里的都执行完了,才会执行第三个参数,即当前作业具体内容 我们不妨改一下,看看多个依赖如何定义
是不是很简单?放心,这只是入门,下面看一下流式处理 流式处理比如混淆压缩js,使用gulp-uglify插件
pipe是管道的意思,也是stream里核心概念,也就是说:上一个的输出,是下一个的输入。 src里所有js,经过处理1,处理2,然后压缩变成min.js,中间的处理pipe可以1步,也可以是n步 反正第一步处理的结果是第二步的输入,以此类推,就像生产线一样,每一步都是一个task是不是很好理解呢? 每个独立操作单元都是一个task,使用pipe来组装tasks 于是gulp就变成了基于task的积木式的工具 好吧,是时候总结一下了 总结
至此,task相关的概念都讲完了,你已经会使用gulp了,找几个插件就足以工作了 如果想高级玩法,可以自己写插件,可以尝试gulp 4的一些api,比如并行等。。。 大家有任何不明白或者想提问的可以随时回复到StuQ微信公众号后台,我会在答疑阶段统一回答 下面看以项目实战,以目前最火的微信前端组的weui项目为例,看看gulp是如何被使用的(其实如何使用gulp构建前端项目) 项目实战先说一下weui是一个什么项目: WeUI 为微信 Web 服务量身设计的h5框架 WeUI是一套同微信原生视觉体验一致的基础样式库,为微信 Web 开发量身设计,可以令用户的使用感知更加统一。包含button、cell、dialog、toast、article、icon等各式元素。 它是使用less编写,最终编译成css,压缩成weui.min.css的,当然这里面还使用了一下比较好的开发实践
下面我们来扒光它 准备工作首先看目录结构
还有src和dist目录,一般src是源码,dist是构建后生成的目录,至此,我们似乎明白了点什么 首先clone代码
上面说了,有package.json,此时需要安装依赖模块
至此就准备完了,下面看一下gulpfile.js 看一下它有哪些tasks看一下它有哪些tasks,查看命令是
看这个的目的,其实就为了了解当前gulpfile里tasks,以便让大家有一个概况了解 大概有7个task,其中styles和release是有依赖作业的。 也就是说,整个项目目前的task比较少,比较适合讲解,而且是腾讯公司的项目,大家应该会比较认可一些 ok,下面我们分别看一下每个task 上面讲过,所有的task定义在gulpfile.js里,那么我们就结合源码,看一下gulpfile.js的task是如何定义,以及如何应用的 default
这是默认作业,也就是在根目录,执行
相当于
其实make,rake,ant等都有类似约定。 这里面值得说明的是
比如此时可以执行
然后它就会打开网页,跳转到http://localhost:8080/example/ 从task定义里可知
说明server是一个task,这里的start就相当于call或者invoke某个task的方法。 注:yargs是一个nodejs模块,目前最好的解析cli参数的库 当然,如果这样,是不是太简单了呢?而且亲,你还有2个参数没说呢 是的
这里要说的就是一个开发惯例,
看一下定义
这里的意思的如果有w参数,就先调release task,然后watch作业。 这里牵连出3个task,有server,watch,release,容我慢慢道来 btw:这里的 serverserver task一看就知道是启动服务器,一般前端开发,都是起一个服务器在浏览器里测试 所以还是比较容易理解 看代码
代码里的几个关键词
browserSync是一个nodejs模块,专门做的是livereload的事儿,也就是说,我们在编辑器里写代码,保存了,文件就会变动,文件变动了就会触发操作系统的监控事件,这时让浏览器刷新 于是,代码变了,不用刷新浏览器就能看到效果。。。 这其实就是传说中得livereload... 又可以偷懒了,祭奠f5吧!!! 其他(server,port,startPath)是browserSync的配置项,有兴趣自己扒文件吧 这里稍稍提一下weinre,因为weui这个项目是移动端h5页面,所以才会用到weinre调试的,是远程调试h5的利器 http://people.apache.org/~pmuellr/weinre-docs/latest/ 总结一下 整个server就是browserSync提供的3个功能
还不错吧,下面看一下更实用的一个task: watch监控 watch
watch其实就干了2件事儿
大家伙只要了解文件变动能干坏事即可,其他可自由发挥 如果gulp内置的watch无法满足,你还可以使用gulp-watch这个单独模块,哈哈,如果有兴趣还可以研究一下操作系统底层监控文件变动接口,有点意思 releaserelease是发布最终css的task
release只是依赖styles task,相当于styles的别名。 值得说明的是,weui是less写的,需要编译成css,然后最终发布的是css文件 那么,
其实都是一样的思路,编译成js或css,然后发布 这些预处理器,让开发方便,高效的同时,也增加了前端的复杂度,真是老子那句话 福兮祸所伏,祸兮福所倚... 阿门。。。 阿弥托佛。。。 source下面一个source task 上面的都比较简单,只是作业定义和作业依赖定义而已,下面看一下真实的流式处理
回故一下,上面讲的流式内容
这代码里的src里的,所有不是less的文件,都丢到dist目录
然后,它又pipe一个,仅仅是为了表示顺序,无上下文传递关系(偷懒做法而已,不可取) 这样写起来是不是非常简单? 我知道你会回答是,下面我们来 讲个不简单的 styles下面是关于样式处理的task
这是整个gulpfile里最长的一个task 下面拆成2部分分析一下
part1
和上面的source task类似,只有less编译不一样,这里就不详细讲解了 下面看一下part2
整体是分了3个阶段
实战总结至此,我们就讲完了所有gulpfile里的内容,以及每个task的细节 结论是:这是一个比较典型的gulp项目,还不错 当然它也不是非常完美,比如作业依赖可以优化、代码校验检测、release没有reversion处理等 下面简单看一下package.json package.json这里有2个地方需要注意
是gulpfile里引用的模块
执行npm test即可发布最终css。 有人说gulp只是一些命令,没啥技术含量,大家先笑笑,一会我们就来讲讲 下面看一下gulp的核心原理:nodejs stream 核心:streamhttp://nodejs.org/api/stream.html 官方文档解释 A stream is an abstract interface implemented by various objects in Node.js. For example a request to an HTTP server is a stream, as is stdout. Streams are readable, writable, or both. All streams are instances of EventEmitter Stream是nodejs各种对象实现的抽象接口。 比如一个http server的请求是一个stream,stdout也是一个。 Streams可读、可写,或者兼有的。 所有的stream对象都是EventEmitter的实例 好理解么? 不好理解,还是从流式理解吧~ 什么是流式
linux pipe流式和linux pipe是一样的(也可能是最早的起源) 举例
可以看出,上一个的输出,是下一个的输入 下面理解一下nodejs里的stream nodejs里的stream
等于
知道gulp里的pipe是怎么来的了吧? Stream在nodejs中是EventEmitter的实现,并且有多种实现形式,例如:
连著名request模块都支持stream 为什么使用Stream呢?
推荐阅读nodejs里有五种基本的Stream:readable,writable,transform,duplex,and "classic” 时间原因,具体使用请自己查阅api文档 https://github.com/substack/stream-handbook 八卦更多ruby作者,松本行弘,上半年基本没干啥,写了一个叫streem的语言, In Streem, a simple cat program looks like this:
prototype of stream based programming language 可见stream的上一个输出是下一个输入的应用有多么的深入人心 https://github.com/matz/streem orchestrator下面介绍gulp的核心 orchestrator这是gulp底层依赖的task相关的核心库,它定义了task执行方式和依赖,而且支持最大可能的并发 gulp的高效即来源于此 本身stream对大文件读写就非常棒,再加上上面说的种种特性,使得gulp流行是必然的。 https://github.com/orchestrator/orchestrator 更多实践gulp有非常多插件,它可以做的更多 i5ting_toc你好奇本文是如何生成toc和发布到git pages上的么? 这竟然也和gulp有关系? 是的,本文是使用markdown写的,然后使用gulp把markdown生成html,并push到git pages上去 实现思路
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论