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

    关于gulp的使用,已经在之前写过一篇文章,但是遗留了一个问题。问题是实现文件的增量式更新,就是给html引入的js和css文件打上标记。每次更新标记更新。

    上篇文章想通过开发同时实现标记的实时更新,后来借鉴了别人的实现,原来的确是应该将这个过程分为开发和生产两个环境的,于是茅塞顿开。于是有了本文。

    代码

    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-rev": "^8.1.1",
    26     "gulp-rev-collector": "^1.3.1",
    27     "gulp-sass": "^4.0.1",
    28     "gulp-spriter": "^1.1.5",
    29     "gulp-uglify": "^3.0.0",
    30     "gulp-util": "^3.0.8",
    31     "run-sequence": "^2.2.1"
    32   }
    33 }

    gulpfile.js下的代码

      1 var gulp = require('gulp'),
      2     clean = require("gulp-clean"),
      3     htmlmin = require('gulp-htmlmin'),
      4     rev = require('gulp-rev'), //添加时间戳
      5     revCollector = require('gulp-rev-collector'), //时间戳添加后再html 里面替换原有的文件
      6     sass = require('gulp-sass'),
      7     base64 = require('gulp-base64'),
      8     imageMin = require('gulp-imagemin'),
      9     uglify = require('gulp-uglify'),
     10     clean_css = require('gulp-clean-css'),
     11     clean = require('gulp-clean'), //清除原来文件
     12     babel = require("gulp-babel"),
     13     browserSync = require('browser-sync').create(),
     14     plumber = require('gulp-plumber'),
     15     runSequence = require('run-sequence'),
     16     autoprefixer = require('gulp-autoprefixer');
     17 //编译sass 
     18 gulp.task('scss', function() {
     19     gulp.src('src/scss/*.scss')
     20 
     21         .pipe(plumber({
     22             errHandler: e => {
     23                 gutil.log(e); // 抛出异常
     24             }
     25         }))
     26         .pipe(sass())
     27         .pipe(base64({
     28             extensions: ['svg', 'png', 'jpg', 'jpeg'],
     29             maxImageSize: 8 * 1024, // bytes 
     30             debug: true
     31         }))
     32         .pipe(autoprefixer({
     33             browsers: ['last 2 versions'],
     34             cascade: false
     35         }))
     36         .pipe(gulp.dest('src/css/'))
     37 });
     38 
     39 //清除css文件
     40 gulp.task("cleancss", function() {
     41     gulp.src("src/css/", { read: false })
     42         .pipe(clean())
     43 })
     44 
     45 
     46 
     47 //开发环境
     48 gulp.task('dev', ['cleancss','scss'], function(done) {
     49 
     50     browserSync.init({
     51         //指定服务器启动根目录  
     52         server: "./src"
     53     });
     54     //监听sass编译,修改了才删除
     55     gulp.watch("src/scss/*.scss", ['scss']);
     56 
     57     //监听任何文件变化,实时刷新页面  
     58     gulp.watch(["src/*.html", "src/imgs/*","src/css/*.css", "src/js/*.js"]).on('change', browserSync.reload);
     59 });
     60 
     61 
     62 //构建生产环境
     63 //清除图片文件
     64 gulp.task("cleanimgs", function() {
     65     gulp.src("dist/imgs/", { read: false })
     66         .pipe(clean())
     67 })
     68 //清除html文件
     69 gulp.task("cleanhtml", function() {
     70     gulp.src("dist/html/*.html", { read: false })
     71         .pipe(clean())
     72 })
     73 //清除js文件
     74 gulp.task("cleanjs", function() {
     75     gulp.src("dist/js/*.js", { read: false })
     76         .pipe(clean())
     77 })
     78 //清除css文件
     79 gulp.task("cleandistcss", function() {
     80     gulp.src("dist/css/*.css", { read: false })
     81         .pipe(clean())
     82 })
     83 //拷贝压缩imgs
     84 gulp.task("imgs", function() {
     85     gulp.src('src/imgs/*')
     86         .pipe(imageMin({ progressive: true }))
     87         .pipe(plumber({
     88             errHandler: e => {
     89                 gutil.log(e); // 抛出异常
     90             }
     91         }))
     92         .pipe(gulp.dest('dist/imgs/'))
     93 })
     94 //拷贝压缩html
     95 gulp.task("html", function() {
     96     var options = {
     97         removeComments: true, //清除HTML注释
     98         collapseWhitespace: true, //压缩HTML
     99         collapseBooleanAttributes: true, //省略布尔属性的值 <input checked="true"/> ==> <input />
    100         removeEmptyAttributes: true, //删除所有空格作属性值 <input id="" /> ==> <input />
    101         removeScriptTypeAttributes: true, //删除<script>的type="text/javascript"
    102         removeStyleLinkTypeAttributes: true, //删除<style>和<link>的type="text/css"
    103         minifyJS: true, //压缩页面JS
    104         minifyCSS: true //压缩页面CSS
    105     };
    106     gulp.src('src/*.html')
    107         .pipe(htmlmin(options))
    108         .pipe(gulp.dest('dist/'));
    109 })
    110 //转译es6
    111 gulp.task("es6", function() {
    112     gulp.src('src/js/*.js')
    113         .pipe(babel({
    114             presets: ['es2015']
    115         }))
    116         .pipe(uglify())
    117         .pipe(rev())
    118         .pipe(gulp.dest('dist/js/'))
    119         .pipe(rev.manifest())
    120         .pipe(gulp.dest('dist/rev/js'))
    121 })
    122 //给css文件后添加时间戳
    123 gulp.task('revcss', function() {
    124     gulp.src('src/css/*.css')
    125         .pipe(rev())
    126         .pipe(gulp.dest('./dist/css'))
    127         .pipe(rev.manifest())
    128         .pipe(gulp.dest('dist/rev/css'))
    129 });
    130 
    131 
    132 //给js文件后添加时间戳
    133 gulp.task('rev', function() {
    134 
    135     gulp.src(['./dist/rev/*/*.json', './src/*.html'])
    136         //- 读取 rev-manifest.json 文件以及需要进行css名替换的文件
    137         .pipe(revCollector())
    138         //- 执行文件内js名的替换
    139         .pipe(gulp.dest('./dist/'));
    140     //- 替换后的文件输出的目录
    141 });
    142 
    143 //生产环境,异步rev
    144 gulp.task('build', ['cleanimgs','cleanhtml','cleanjs','cleandistcss','imgs','html','es6','revcss'],function(){
    145     gulp.start('rev');
    146 });

    目录结构

    在src中写开发环境代码,在dist中生成html代码。分别执行gulp dev个gulp build。

    src的目录结构

    dist的目录结构

    rev下

    本文结束。

  • 相关阅读:
    钱途第三章(不同类别的风险投资)
    羊皮卷之九
    MAP平台界面公式的 package 包名自定义
    java类Timer和TimerTask的使用
    钱途第五章(创业初期的公司安排)
    MYSQL 双向同步方案:
    羊皮卷之六
    羊皮卷之十
    羊皮卷之一
    MAP平台自定义查询
  • 原文地址:https://www.cnblogs.com/zhensg123/p/9132174.html
Copyright © 2011-2022 走看看