我的gulp第一个程序

我的gulp第一个程序

以前都是单枪匹马的干,从没用过模块化的打包工具,加入新的团队后,模块化开发学到不少,尤其是工具的使用。团队目前较多的使用gulp,也是最流行的一款前端打包工具。最近Team开始尝试用gulp,我也只是使用者,还没详细的看其实现原理等,属于小白。

今天就来把玩把玩建立自己的第一个gulp程序。

gulp和grunt一样是基于node,使用它们的前提是已经安装了node.js,具体安装过程可以百度一下,下面介绍我的第一个gulp程序创建过程:

1、在电脑某个盘中新建一个文件夹,比如gulp_test;

2、打开该文件夹,ctrl+shift打开命令窗口,输入:npm install gulp,马上可以看到gulp的下载。

3、继续安装插件gulp-htmlmin,从名字也可以看出是用来压缩hml的。

4、在gulp_test(你新建的文件夹名)中创建一个新的文件下比如src,用来放置你的资源文件。

5、在src中新建一个html,html内容随意。比如:

 

<!DOCTYPE html>
<html>
    <head>
        <title>TODO supply a title</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width">
    </head>
    <body>
        <h2>写在前面</h2>
        <p>本来是想写个如何编写gulp插件的科普文的,突然探究欲又发作了,于是就有了这篇东西。。。翻了下源码看了下<code>gulp.src()</code>的实现,不禁由衷感慨:肿么这么复杂。。。</p>
        <h2>进入正题</h2>
        <p>首先我们看下<code>gulpfile</code>里面的内容是长什么样子的,很有express中间件的味道是不是~<br />我们知道<code>.pipe()</code>是典型的流式操作的API。很自然的,我们会想到<code>gulp.src()</code>这个API返回的应该是个Stream对象(也许经过层层封装)。本着一探究竟的目的,花了点时间把gulp的源码大致扫了下,终于找到了答案。</p>
        <p>gulpfile.js</p>
        <h2>提前剧透</h2>
        <p>此处有内容剧透,如有对剧透不适者,请自行跳过本段落。。。</p>
        <blockquote>
            <p>gulp.src() 的确返回了定制化的Stream对象。可以在github上搜索<code>ordered-read-streams</code>这个项目。</p>
            <p>大致关系是:<br />ordered-read-streams --> glob-stream --> vinyl-fs --> gulp.src()</p>
 
 
        </blockquote>
        <h2>探究之路</h2>
        <p>首先,我们看下<code>require('gulp')</code>返回了什么。从gulp的源码来看,返回了<code>Gulp</code>对象,该对象上有<code>src</code><code>pipe</code><code>dest</code>等方法。很好,找到了我们想要的<code>src</code>方法。接着往下看<br />参考:<a href="https://github.com/gulpjs/gulp/blob/master/index.js#L62" target="_blank">https://github.com/gulpjs/gulp/blob/master/index.js#L62</a></p>
        <p>gulp/index.js</p>
        <pre class="hljs-dark"><code class="hljs js"><span class="hljs-keyword">var inst = <span class="hljs-keyword">new Gulp();
<span class="hljs-built_in">module.exports = inst;
</span></span></span></code></pre>
        <p>从下面的代码可以看到,<code>gulp.src</code>方法,实际上是<code>vfs.src</code>。继续<br />参考:<a href="https://github.com/gulpjs/gulp/blob/master/index.js#L25" target="_blank">https://github.com/gulpjs/gulp/blob/master/index.js#L25</a></p>
        <p>gulp/index.js</p>
        <pre class="hljs-dark"><code class="hljs js"><span class="hljs-keyword">var vfs = <span class="hljs-built_in">require(<span class="hljs-string">'vinyl-fs');
<span class="hljs-comment">// 省略很多行代码
Gulp.prototype.src = vfs.src;
</span></span></span></span></code></pre>
        <p>接下来我们看下<code>vfs.src</code>这个方法。从<code>vinyl-fs/index.js</code>可以看到,<code>vfs.src</code>实际是<code>vinyl-fs/lib/src/index.js</code><br />参考:<a href="https://github.com/wearefractal/vinyl-fs/blob/master/index.js" target="_blank">https://github.com/wearefractal/vinyl-fs/blob/master/index.js</a></p>
        <p>vinyl-fs/index.js</p>
        <pre class="hljs-dark"><code class="hljs js"><span class="hljs-pi">'use strict';
 
<span class="hljs-built_in">module.exports = {
  src: <span class="hljs-built_in">require(<span class="hljs-string">'./lib/src'),
  dest: <span class="hljs-built_in">require(<span class="hljs-string">'./lib/dest'),
  watch: <span class="hljs-built_in">require(<span class="hljs-string">'glob-watcher')
};
</span></span></span></span></span></span></span></span></code></pre>
        <p>那么,我们看下<code>vinyl-fs/lib/src/index.js</code>。可以看到,<code>gulp.src()</code>返回的,实际是<code>outputStream</code>这货,而<code>outputStream</code><code>gs.create(glob, options).pipe()</code>获得的,差不多接近真相了,还有几步而已。<br />参考:<a href="https://github.com/wearefractal/vinyl-fs/blob/master/lib/src/index.js#L37" target="_blank">https://github.com/wearefractal/vinyl-fs/blob/master/lib/src/index.js#L37</a></p>
      
        <p>参考:<a href="https://github.com/armed/ordered-read-streams/blob/master/index.js" target="_blank">https://github.com/armed/ordered-read-streams/blob/master/index.js</a></p>
        <h2>写在后面</h2>
        <p>兜兜转转一大圈,终于找到了<code>gulp.src()</code>的源头,大致流程如下,算是蛮深的层级。代码细节神马的,有兴趣的同学可以深究一下。</p>
        <blockquote>
            <p>ordered-read-streams --> glob-stream --> vinyl-fs --> gulp.src()</p>
        </blockquote>
    </body>
</html>

6、在gulp_test目录下创建gulpfile.js文件,内容如下:

var gulp = require('gulp');
var htmlmin = require('gulp-htmlmin');
 
gulp.task('minify', function() {
  gulp.src('src/*.html')
    .pipe(htmlmin({collapseWhitespace: true}))
    .pipe(gulp.dest('dist'))
});
gulp.task('watch', function () {
  console.log('这是测试这是测试!')
  gulp.watch('src/*.html', ['minify']);
});
gulp.task('default', ['minify', 'watch']);

7、在src目录下打开命令窗口,运行:gulp,你就能看到程序自动创建了dist文件,其中包含了被压缩后的html文件。

第一个gulp程序就这样搞定了,每次修改完代码后运行gulp就能自动压缩,很方便。

转载于:https://www.cnblogs.com/hutuzhu/p/4288114.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109548.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 创建linux中的nginx+php7+mysql环境—-PHP7安装

    创建linux中的nginx+php7+mysql环境—-PHP7安装

    2021年10月26日
    41
  • 极值点,驻点,拐点的关系_求驻点

    极值点,驻点,拐点的关系_求驻点极值点极值点:一阶导数发生变号的点,对于导数不存在的点,分析其左导数和右导数的正负是否相同,相同则不是极值点;若不同则为极值点。极值点是该点的x坐标值,而极值是该点对应的y坐标值。驻点驻点:只是单纯地符合f’(xo)=0的点,导数不存在的点不是驻点。拐点拐点:二阶导数发生变号的点,对于二阶导数不存在的点,分析其左二阶导数和右二阶导数的正负是否相同,相同则不是拐点;若不同则是拐点。常用结论:1.只要f’(xo)=0,那么该点就是驻点。2.若f’(xo)=0,而f”(xo)≠0,该点一定是极值点

    2025年7月1日
    2
  • 国外最流行的Bootstrap后台管理模板

    国外最流行的Bootstrap后台管理模板工欲善其事,必先利其器对于从事软件开发的您也一样,有一套熟悉的bootstrap后台ui框架让您的开发速度大幅度提升这是本人经常使用到的一些bootstrap后台框架推荐给大家第一名inspiniabootstrap演示地址http://cn.inspinia.cn效果图http://cn.inspinia.cnhttp://cn.inspinia.cn第二名…

    2022年4月25日
    38
  • 示波器的存储深度[通俗易懂]

    示波器的存储深度[通俗易懂]采集时间窗口=存储深度/采样率安捷伦的9000系列示波器在界面左上角上有显示采样率和存储深度,单位为MSa/s或者GSa/s已经Mpts,Mpts代表存储深度,pts是points的缩写,Mpts是指M个点。在每通道的存储深度为1Mpts的设置下,示波器可以10GSa/s采样率捕获1ms的波形。同一示波器,但每通道的存储深度是100Mpts的设置,那么在采样率相同的条件下可以捕获10ms…

    2022年8月31日
    3
  • 国外免备案服务器网站,免备案海外服务器对SEO的影响[通俗易懂]

    原标题:免备案海外服务器对SEO的影响在前期SEO工作中,我们经常选择一些国内比较特殊的路线,可以有效避免网站备案带来的麻烦。随着近年来日益严格的国际比较方案备案审查,在国内上线的网站必须申请备案。所以有些SEO人员会有这样一个疑问,使用香港主机或者海外服务器,不会文件网站对SEO有影响吗?小编建议您在国内运营的网站都备案,以免影响以后网站的运营。租用服务器哪个好?小编带你了解梦飞云。1.海外服…

    2022年4月8日
    118
  • java 中缀转后缀(逆波兰)[通俗易懂]

    java 中缀转后缀(逆波兰)

    2022年1月27日
    49

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号