美文网首页
gulp4.0版入门及常用插件,gulp创建前端项目

gulp4.0版入门及常用插件,gulp创建前端项目

作者: Mihansy | 来源:发表于2019-10-10 13:40 被阅读0次

    本篇为gulp学习笔记。

    gulp安装及创建前端项目

    1,先安装node,npm,cnpm

    2,全局安装gulp脚手架工具:cnpm install --global gulp-cli

    3,创建项目:npx mkdirp myproject 进入该项目:cd myproject

    4,在项目根目录下,创建package.json文件:cnpm init

    5,安装gulp,作为项目开发时的依赖项:cnpm install gulp --save-dev

    6,检查gulp版本:gulp --version

    cli脚手架和本地版本都成功即可,如下:

    CLI version: 2.2.0

    Local version: 4.0.2

    7,自己在编辑器中创建gulpfile.js文件,这是gulp配置文件。

    在配置文件 gulpfile.js 中,引入gulp和gulp常用插件:

    
    //src获取文件,dest拷贝文件,pipe让文件流走入下一个环节,watch监听文件变化,parallel并行任务,series串行任务
    
    const { src, dest, watch, parallel, series } = require('gulp')
    
    const htmlMin = require('gulp-htmlmin')  //压缩html文件
    
    const less = require('gulp-less')  //用于把less文件编译成css文件
    
    const minifyCss = require('gulp-clean-css') //压缩css文件
    
    const minifyJs = require('gulp-uglify') //压缩js文件
    
    const concat = require('gulp-concat')  //合并多个js文件为一个js文件
    
    const rename = require('gulp-rename')  //重命名文件
    
    const imageMin = require('gulp-imagemin') //压缩图片
    
    const clean = require('gulp-clean')  //每次构建gulp之前,清除目标文件dist
    
    const fileInclude = require('gulp-file-include')  //模块化:在页面中引入公共头部/底部等模块
    
    const connect = require('gulp-connect') //创建本地服务器,浏览器页面自动刷新
    
    const autoprefixer = require('gulp-autoprefixer') //兼容处理,根据浏览器自动添加css前缀。需要在package.json中添加browserslist键名
    
    //gulp自动给css,js批量添加版本号,解决缓存
    
    const rev = require('gulp-rev') //版本号生成插件(hash编码)
    
    const revCollector = require('gulp-rev-collector') //替换版本号路径插件
    
    //const runSequence = require('run-sequence') //同步执行任务,有了series后,用不上了
    
    

    设置任务:

    
    const serverConfig = {
    
    root: 'dist',  //从哪个目录开启server
    
    port: 3000,  //端口
    
    livereload: true  //自动刷新
    
    }
    
    function server() {  //启动服务器任务
    
    connect.server(serverConfig)
    
    }
    
    //将头部,底部等公共模块,include进入到各个需要的html页面中,
    
    //将html文件中的css,js文件引入路径全部替换成带有版本号的
    
    //然后压缩html,然后复制输出到dist文件夹,最后自动刷新页面。
    
    function html() {
    
    var options = {
    
    collapseWhitespace: true, //清除空格,压缩html
    
    collapseBooleanAttributes: true, //省略布尔属性的值
    
    removeComments: true, //清除html中注释的部分
    
    removeEmptyAttributes: true, //清除所有的空属性
    
    removeScriptTypeAttributes: true, //清除所有script标签中的type="text/javascript"属性。
    
    removeStyleLinkTypeAttributes: true, //清楚所有Link标签上的type属性。
    
    minifyJS: true, //压缩html中的javascript代码。
    
    minifyCSS: true //压缩html中的css代码。
    
    };
    
    //src第一个参数是生成的json路径,第二个参数是要更换的html
    
    return src(['dist/static/**/*.json', 'src/view/**/*.html'])
    
      .pipe(fileInclude({
    
      prefix: '@@', //变量前缀 @@include
    
      basepath: 'src/view/common' //引用文件路径,即公共头部底部模块的路径
    
      }))
    
    .pipe(revCollector()) //更换html中引入的css,js版本
    
    .pipe(htmlMin(options)) //压缩html
    
    .pipe(dest('dist')) //将处理后的html输出到dist文件夹中
    
    .pipe(connect.reload()) //当html发生变化时,自动刷新页面
    
    }
    
    function css(){
    
      return src('src/static/css/*')
    
        .pipe(autoprefixer()) //给浏览器添加前缀,兼容样式
    
        .pipe(less()) //将.less文件编译为.css文件
    
    .pipe(minifyCss())  //将编译后的css文件压缩
    
    .pipe(rev()) //将所有匹配到的文件名全部生成相应的版本号
    
    .pipe(dest('./dist/static/css'))  //将css文件输出到dist目录
    
    .pipe(rev.manifest()) //把所有生成带版本号的文件名全部保存到json文件中
    
    .pipe(dest('./dist/static/css')) //把json文件保存到以下路径中
    
    }
    
    function js(){
    
      return src('src/static/js/**/*.js')
    
        .pipe(rename({suffix:'.min'}))  //重命名 xxx.min.js
    
        .pipe(minifyJs())  //压缩js文件
    
    //.pipe(concat('all.min.js'))  //合并所有js文件为一个
    
    .pipe(rev()) //js文件生成版本号,
    
    .pipe(dest('./dist/static/js')) //将js文件输出到dist/js目录下
    
    .pipe(rev.manifest()) //并将所有带有版本号的文件放入json中
    
    .pipe(dest('./dist/static/js')) //把json文件输出到dist/js目录下
    
    }
    
    function destJsLib(){ //复制js文件夹下面的lib到dist目录中
    
    return src('src/static/js/lib/**/*')
    
    .pipe(dest('dist/static/js/lib'))
    
    }
    
    function image() {
    
    return src('src/static/image/*')
    
      .pipe(imageMin())  //压缩图片
    
      .pipe(dest('dist/static/image'))
    
    }
    
    //监听html,js,css文件变化,重新构建dist文件
    
    function watcher() {
    
        //watch第一个参数是glob字符串或数组,
    
        //第二个参数是function或series/parallel
    
    //return watch(['src/view/**/*.html', 'src/static/js/**/*.js','src/static/css/*'], parallel(html, js,css))
    
    //watch()方法也可以不使用return,多个watch这么写时,触发哪个就执行哪个,不会同时执行多个watch
    
    watch('src/view/**/*.html', series(html))
    
    watch('src/static/js/**/*.js', series(js))
    
    watch('src/static/css/*', series(css))
    
    }
    
    function del() { //每次构建之前,先清除dist文件
    
    return src('./dist/*')
    
    .pipe(clean())
    
    }
    
    function build(cb) {  //打包生成文件
    
        console.log('打包生成文件,需要在这里修改服务器API')
    
    cb()
    
    }
    
    

    执行任务:

    
    //执行gulp命令,默认执行default任务,生成开发环境dist文件夹
    
    exports.default = series(del, parallel(destJsLib, image), css, js, html, parallel(server, watcher))
    
    //series(任务1,任务2,……) 按顺序执行认任务
    
    //parallel(任务1,任务2,……) 同时执行任务,并发执行任务
    
    //也可以执行gulp build命令,打包生成文件,这是生产环境build文件,提交给服务器更新用
    
    exports.build = build
    
    

    最后,在cmd终端输入gulp,默认执行exports.default任务。

    也可以执行多个任务,使用 gulp taskName执行。

    以上就是gulpfile.js文件中的内容,可以自己配置。

    另外需要注意,在使用gulp插件自动给css,js批量添加版本号时,需要修改node_modules插件配置,如下如下几处:

    1,更改gulp-rev文件(node_modules--->gulp-rev--->index.js)

    
    将 manifest[originalFile] = revisionedFile;
    
    改为 manifest[originalFile] =  originalFile + '?v=' + file.revHash;
    
    

    2,更改rev-path文件(node_module--->gulp-rev--->node_module--->rev-path--->index.js)

    
    将 return modifyFilename(pth, (filename, ext) => `${filename}-${hash}${ext}`);
    
    改为 return modifyFilename(pth, (filename, ext) => `${filename}${ext}`);
    
    

    3,更改gulp-rev-collector(node_modules--->gulp-rev-collector--->index.js)

    
    将 var cleanReplacement = path.basename(json[key]).replace(new RegExp( opts.revSuffix ), '' );
    
    改为 var cleanReplacement =  path.basename(json[key]).split('?')[0];
    
    

    4,更改gulp-rev-collector(node_modules--->gulp-rev-collector--->index.js)

    
    将  regexp: new RegExp( prefixDelim + pattern, 'g' ),
    
    改为 regexp: new RegExp( prefixDelim + pattern+'(\\?v=\\w{10})?', 'g' ),
    
    

    如果不做这些配置的话,css,js文件后面跟着的时一些hash数据,配置后,就变成以下这样,每次更改css,js文件后,?v=后面版本号自动变化,清除缓存。

    http://localhost:3000/static/css/reset.css?v=ff120aefe0

    相关文章

      网友评论

          本文标题:gulp4.0版入门及常用插件,gulp创建前端项目

          本文链接:https://www.haomeiwen.com/subject/hknopctx.html