• React入门教程第二课--gulpfile详解


    相信大家看过不少项目,对这个文件的说明都很少。

    不知道是大家默认了都会,还是说默认都不去更改这个文件。

    反正我刚开始看总觉得很难看懂。

    这篇教程,我根据项目构建需求编写这个文件。

    将会对这个文件的内容做一个比较详细的说明。

    里面用到的工具只保证满足需求,不保证是最好用的。

    后续也会对这个文件做持续的优化。

    一、首先我们先看看现在的gulpfile.js。

    var gulp = require('gulp');
    var browserify = require('browserify');
    var babelify = require('babelify');
    var source = require('vinyl-source-stream');
    gulp.task('default', function () {
        return browserify('./source/app.js')
            .transform(babelify)
            .bundle()
            .pipe(source('oni.js'))
            .pipe(gulp.dest('./build/'))
    });
    将这个任务改名为buildJS
    gulp.task('buildJS', function () {
        return browserify('./source/app.js')
            .transform(babelify)
            .bundle()
            .pipe(source('oni.js'))
            .pipe(gulp.dest('./build/'))
    });

    上一篇教程中我已经对这些内容做了详细的说明,这里不再重复了。

    二、上面是对js的简单处理,接下来我们加入对sass的编译。

    1、首先添加gulp-sass模块

    $ cd OniReact

    $ npm install --save-dev gulp-sass

    注:

    #由于UI组件库内部使用的是SASS,所以框架里面也使用SASS
    #Windows环境需要Visual C++ 组件
    #1) 安装 .NET Framework 2.0 SDK;
    #2) 安装 Microsoft Visual Studio 2005;
    #3) 如果将该组件安装到了其他位置,请将其位置添加到系统路径中。
    
    安装sass时出现以上错误,可参考下载这两个程序,尝试安装。只要安装执行完毕,再试试sass能不能安装。这两个程序不需要全部安装成功。这跟你电脑本身的环境有关系。
    #下载:http://download.microsoft.com/download/5/f/7/5f7acaeb-8363-451f-9425-68a90f98b238/visualcppbuildtools_full.exe?__hstc=268264337.e725531c29a2a967a67a93da74b55322.1474945795781.1474945795781.1474945795781.1&__hssc=268264337.1.1474945795783&__hsfp=414218078&fixForIE=.exe
    #下载:http://download.microsoft.com/download/D/2/3/D23F4D0F-BA2D-4600-8725-6CCECEA05196/vs_community_ENU.exe

    在gulpfile头部引用模块  var sass = require('gulp-sass');

    gulp.task('buildCSS', function () {
        gulp.src('./style/app.scss')
            .pipe(plumber({errorHandler: notify.onError('Error: <%= error.message %>')}))
            .pipe(sass())
            .pipe(gulp.dest('./build'))
    })

    src;这里指监听入口。一般选择主sass文件。

    中间配置使用gulp-sass解析

    最后dest指输出位置。

    2、在style文件夹下新建app.scss文件

    3、执行这个task将会在build文件夹下生成一个app.css文件

     $ cd OniReact

    $ gulp buildCSS


    注:我这里项目名字被我修改过,你们跟着教程就好,不用理会这个图里的地址。

    打开build文件夹下的index.html在里面引用生成的css文件。

    <link rel="stylesheet" href="app.css?v=001"/>
    三、设置默认的gulp的task

    gulp.task('default',['buildJS','buildCSS']);
    $ gulp 执行,将会自动执行buildJS和buildCSS这两个任务。

    四、添加监听

    其实我们最主要的就是编译js和编译css,现在的写法已经能够满足基本的使用需求了。

    但是现在没写完一行代码,想要查看效果就要编译一次。

    于是在这里引入监听,当文件更改是自动执行编译。

    1、编写监听source

    gulp.task('watchSource', function () {
        gulp.watch('./source/**/*', ['buildJS'])
    });
    监听文件source下的任意文件或者文件夹下面的任意文件。

    当文件更改时,执行buildJS。

    2、编写监听style

    gulp.task('watchStyle', function () {
        gulp.watch('./style/**/*',['buildCSS'])
    })
    3、修改默认任务

    gulp.task('default',['watchSource','watchStyle']);
    4、执行gulp

    $ gulp


    这次执行跟之前几次的不同,在执行完成之后命令行并没有停止,而是一直在监听。

    注:需要关掉开发工具的自动保存功能。方法自行查阅资料

    现在我们做一个简单的测试,验证功能可用。

    5、测试监听css

    在style/app.scss里面键入

    div{
      height: 100px;
    }
    按下保存。命令行里自动执行编译


    6、测试监听js

    在source/app.js里修改'Hello Word',改成 'Hello Word...'保存。


    5和6可以直接查看build下面的对应文件查看。

    五、处理代码错误。

    1、首先假设说我们在编程的时候出现了语法错误。

    css错误


    命令行中输出如下log,并且关闭gulp。我们在修改完成之后,还要在执行$ gulp

    现在我们加入错误机制,只打印错误信息,不关闭gulp。(任何繁琐的行为都是错误的。比如一直输入gulp)


    同样的看一下js错误



    2、添加事件模块和日志模块

    $npm install --save-dev gulp-plumber

    var plumber = require('gulp-plumber');//事件
    $npm install --save-dev gulp-notify

    var notify = require('gulp-notify');//错误
    3、在buildCSS中加入

    .pipe(plumber({errorHandler: notify.onError('Error: <%= error.message %>')}))
    如:

    gulp.task('buildCSS', function () {
        gulp.src('./style/app.scss')
            .pipe(plumber({errorHandler: notify.onError('Error: <%= error.message %>')}))
            .pipe(sass())
            .pipe(gulp.dest('./build'))
    });
    测试发现css错误,会报错但是不会停止gulp。是我们预期的功能。

    在buildJS中同样处理。(官方好像说明过这个,我之前看材料看到了,这次去找没找到。)

    但是js错误,还是会停止gulp。

    所以我们使用监听错误事件的方式来处理。

    .on('error', function(err){
        var args = Array.prototype.slice.call(arguments);
        notify.onError({
            title: "Build JS Error",
            message: "<%= error.message %>"
        }).apply(this, args);
        this.emit('end');
    })
    遇到错误打印错误信息之后,直接停止这次编译。这样就不会关闭gulp了。

    修改完buildJS如下:

    gulp.task('buildJS', function () {
        return browserify('./source/app.js')
            .transform(babelify)
            .bundle()
            .on('error', function(err){
                var args = Array.prototype.slice.call(arguments);
                notify.onError({
                    title: "Build JS Error",
                    message: "<%= error.message %>"
                }).apply(this, args);
                this.emit('end');
            })
            .pipe(source('oni.js'))
            .pipe(gulp.dest('./build/'))
    });
    测试可用,当发生错误时,命令行中输出,gulp没有关闭。


    六、建立web服务器

    1、添加模块gulp-webserver

    $ npm install --save-dev gulp-webserver

    2、编写task

    gulp.task('webserver', function () {
        gulp.src('build').pipe(webserver({
            port:8897,
            fallback: 'index.html',
            open:true
        }))
    });
    src是指web-server的目录,port设置端口号,fallback是启动入口,open是设置是否自动打开浏览器,我这里设置true,执行这个task就会自己打开一个页面。

    3、修改gulp默认task

    gulp.task('default',['watchSource','watchStyle','webserver']);

    4、执行gulp

    $ gulp



    七、混淆压缩代码

    1、引入模块varuglify=require('gulp-uglify');//压缩

    $ npm install -save-dev gulp-uglify
    在buildJS中加入.pipe(uglify())
    
    
    gulp不支持的流,添加管道。这部分的内容我不是很清楚是什么意思,我只知道这么用。
    2、引入模块var streamify = require('gulp-streamify');
    $ npm install -save-dev gulp-streamify
    修改.pipe(streamify(uglify())),修改后的buildJS如下:
    gulp.task('buildJS', function () {
        return browserify('./source/app.js')
            .transform(babelify)
            .bundle()
            .on('error', function(err){
                var args = Array.prototype.slice.call(arguments);
                notify.onError({
                    title: "Build JS Error",
                    message: "<%= error.message %>"
                }).apply(this, args);
                this.emit('end');
            })
            .pipe(source('oni.js'))
            .pipe(streamify(uglify()))
            .pipe(gulp.dest('./build/'))
    });
    平时开发把.pipe(streamify(uglify()))注释掉。发布的时候再开起来就可以了。
    这个教程只是做一个技术提要,不要将这个文件用于实际的项目中,这里面有坑,我将会在下一个教程中对这个文件进行优化。
    到此本节课的内容全部讲解完毕,关于以上内容有不了解的地方,可以通过评论的方式,留言,我会给出参考文献链接。
    

    项目地址:https://Git.oschina.NET/xiaohuOni/OniReact-Demo

    SVN地址:svn://git.oschina.net/xiaohuOni/OniReact-Demo

    之前的demo都用百度云盘,后来全部过期了。

    题外话:
    
    之前的ionic的公众号被我改名了,因为开始更新React的内容,后续可能会更新其他的。
    一时想不到什么好名字,就用我自己的网名命名了,大家有什么好的名字可以直接回复公众号。
    一年能够修改一次,呵呵。
    请大家关注公众号:ionic__   呵呵,这个不让改。
    
    
    
    
    
    

  • 相关阅读:
    JavaScript学习-4——DOM对象、事件
    JavaScript学习-3——数组、函数、递归
    CSS样式学习-3、轮廓、伪类/元素、display-flex布局
    目前为止学习过的循环解析过程
    早期自学jQuery-二事件
    Hive问题 记录
    `how to install hive
    mongodb读取测试
    reading list
    HIVE相关命令记录
  • 原文地址:https://www.cnblogs.com/xiaohuoni/p/7642288.html
Copyright © 2020-2023  润新知