zoukankan      html  css  js  c++  java
  • 基于gulp的前端自动化开发构建

    就前端的发展而言会越来越朝着后端的标准化靠近,后端的工程化以及模块化都很成熟。基于这样一个思路,开始探索如何优化目前的开发流程。而使用的工具就是gulp。

    个人觉得gulp比较webpack更为简单实用,gulp依靠插件工作,webpack除了插件还有各种loader。当然这不是重点,重点是能够确实解决问题。目前公司对前端开发并没有一个明确的要求,所以个人根据现有的开发流程以及开发认识,写了如下的代码。

    目录结构,src内部的相关文件和代码,最终编译到dist中,dist就是发布的代码

    然后是package.json文件

     1 {
     2   "name": "gulpf",
     3   "version": "1.0.0",
     4   "description": "",
     5   "main": "index.js",
     6   "scripts": {
     7     "test": "echo "Error: no test specified" && exit 1"
     8   },
     9   "author": "",
    10   "license": "ISC",
    11   "devDependencies": {
    12     "babel-core": "^6.26.0",
    13     "babel-preset-es2015": "^6.24.1",
    14     "browser-sync": "^2.23.6",
    15     "del": "^3.0.0",
    16     "gulp": "^3.9.1",
    17     "gulp-autoprefixer": "^5.0.0",
    18     "gulp-babel": "^7.0.1",
    19     "gulp-base64": "^0.1.3",
    20     "gulp-clean": "^0.4.0",
    21     "gulp-clean-css": "^3.9.3",
    22     "gulp-htmlmin": "^4.0.0",
    23     "gulp-imagemin": "^4.1.0",
    24     "gulp-plumber": "^1.2.0",
    25     "gulp-sass": "^4.0.1",
    26     "gulp-spriter": "^1.1.5",
    27     "gulp-uglify": "^3.0.0",
    28   }
    29 }

    然后是gulpfile.js具体的代码

     1 var gulp = require('gulp'),
     2     clean=require("gulp-clean"),  
     3     htmlmin = require('gulp-htmlmin'),
     4     sass=require('gulp-sass'),
     5     base64=require('gulp-base64'),
     6     imageMin = require('gulp-imagemin'),
     7     uglify = require('gulp-uglify'),
     8     clean_css = require('gulp-clean-css'),
     9     babel = require("gulp-babel"),
    10     browserSync = require('browser-sync').create(),
    11     plumber = require('gulp-plumber'),
    12     autoprefixer = require('gulp-autoprefixer');
    13 //编译sass 
    14 gulp.task('scss', function () {  
    15     gulp.src('src/scss/*.scss')
    16 
    17         .pipe(plumber({ errHandler: e => {
    18                 gutil.log(e); // 抛出异常
    19             }}))  
    20         .pipe(sass())
    21         .pipe(base64({
    22                 extensions:     ['svg','png','jpg','jpeg'],
    23                 maxImageSize:   8*1024, // bytes 
    24                 debug:          true
    25             }))
    26         .pipe(autoprefixer({
    27             browsers: ['last 2 versions'],
    28             cascade: false
    29         }))
    30         .pipe(clean_css())
    31         .pipe(gulp.dest('dist/css/'))  
    32 }); 
    33 
    34 //转译es6
    35 gulp.task("es6",function(){
    36     gulp.src('src/js/*.js')  
    37         .pipe(babel({
    38             presets: ['es2015']
    39         }))
    40         .pipe(uglify()) 
    41         .pipe(gulp.dest('dist/js/')) 
    42 })
    43 
    44 //清除图片文件
    45 gulp.task("cleanimgs",function(){
    46     gulp.src("dist/imgs/",{read:false})
    47     .pipe(clean())
    48 })
    49 //清除html文件
    50 gulp.task("cleanhtml",function(){
    51     gulp.src("dist/html/*.html",{read:false})
    52     .pipe(clean())
    53 })
    54 //拷贝压缩imgs
    55 gulp.task("imgs",function(){
    56     gulp.src('src/imgs/*')  
    57         .pipe(imageMin({progressive: true})) 
    58         .pipe(plumber({ errHandler: e => {
    59                 gutil.log(e); // 抛出异常
    60             }}))    
    61         .pipe(gulp.dest('dist/imgs/')) 
    62 })
    63 //拷贝html
    64 gulp.task("html",function(){
    65     var options = {
    66         removeComments: true,//清除HTML注释
    67         collapseWhitespace: true,//压缩HTML
    68         collapseBooleanAttributes: true,//省略布尔属性的值 <input checked="true"/> ==> <input />
    69         removeEmptyAttributes: true,//删除所有空格作属性值 <input id="" /> ==> <input />
    70         removeScriptTypeAttributes: true,//删除<script>的type="text/javascript"
    71         removeStyleLinkTypeAttributes: true,//删除<style>和<link>的type="text/css"
    72         minifyJS: true,//压缩页面JS
    73         minifyCSS: true//压缩页面CSS
    74     };
    75     gulp.src('src/*.html')
    76         .pipe(htmlmin(options))
    77         .pipe(gulp.dest('dist/'));
    78 })
    79 
    80 //默认任务
    81 gulp.task('default',['cleanimgs','scss','es6','imgs','cleanhtml','html'],function(done) {  
    82  
    83     browserSync.init({  
    84         //指定服务器启动根目录  
    85         server: "./dist"  
    86     });  
    87     //监听sass编译,修改了才删除
    88     gulp.watch("src/scss/*.scss", ['cleancss','scss']);
    89     //监听sass编译  
    90     gulp.watch("src/js/*.js", ['es6']);
    91     //监听图片变化
    92     gulp.watch("src/imgs/*", ['cleanimgs','imgs']);
    93     //监听html变化
    94     gulp.watch("src/*.html", ['html']);
    95     //监听任何文件变化,实时刷新页面  
    96     gulp.watch(["src/scss/*.scss","src/js/*.js","src/*.html","src/imgs/*"]).on('change',browserSync.reload);  
    97 }); 

    上述代码实现的功能有

    1,实时刷新浏览器,不管是html变化,css变化,还是js变化

    2,使用sass,转译sass为css,并且自动加浏览器前缀并且压缩

    3,对es6进行转译并且压缩

    4,对小图片进行base64转化,减少http请求数

    5,压缩html文件内容

    6,gulp-plumber这个插件的作用是,避免插件错误,终端gulp执行

    当然,本代码还有优化的余地,比如雪碧图的使用,比如合并相关的css和js文件,再比如给js文件和css加MD5进行增量式更新,放置缓存。并且直接替换html中代码。

    倒是尝试了给js和css添加md5,但是最终效果不稳定,所以没有写文章中,本文就算是工程化构建代码的一个1.0版本吧,至少对自己开发还是有很大帮助的。后续会考虑研究加上md5.

    本文结束。

  • 相关阅读:
    使用PhantomJS报warnings.warn('Selenium support for PhantomJS has been deprecated, please use headless '解决方法
    案例:执行 JavaScript 语句
    案例:网站模拟登录
    爬虫中Selenium和PhantomJS
    爬虫中采集动态HTML介绍
    Oracle系列十五 控制用户权限
    Oracle系列十四 序列、索引和同义词
    Oracle系列十三 视图
    多线程爬虫案例
    CentOS7静默安装Oracle 18g数据库(无图形化界面)
  • 原文地址:https://www.cnblogs.com/zhensg123/p/8868336.html
Copyright © 2011-2022 走看看