目录
1.所需工具和版本
2.工具安装
3.开发环境配置
4.生产环境配置
5.项目目录结构
首页 web前端 js教程 gulp实用配置(2)——中小项目

gulp实用配置(2)——中小项目

Jul 09, 2017 pm 06:10 PM
gulp 实用

上一篇的gulp配置很简单,主要就是为了demo的查看和调试,这一篇则会相对详细一些,包括压缩合并打时间戳等。

在互联网环境比较好的城市,需要多人协作的,大一点的项目应该都用上了模块化(这里主要指commonjs和ES6模块系统,不是再早的require.js和sea.js)。代码也会更注重如何分离和注入,而不再是单纯的合并。

但是在很多小公司,开发模式或技术都还是比较传统的,或者一些小项目也完全不需要用上那些比较前沿的技术。

所以这篇配置就主要为了这样的中小项目。

1.所需工具和版本

包管理工具:yarn v0.24.5

自动化构建工具:gulp v4.0

2.工具安装

yarn add global gulpjs/gulp#4.0

3.开发环境配置

<span style="color: #0000ff">var</span> gulp = require('gulp'<span style="color: #000000">),
    pug </span>= require('gulp-pug'<span style="color: #000000">),
    less </span>= require('gulp-less'<span style="color: #000000">),
    </span><span style="color: #008000">//</span><span style="color: #008000">当发生异常时提示错误 确保本地安装gulp-notify和gulp-plumber</span>
    notify = require('gulp-notify'<span style="color: #000000">),
    plumber </span>= require('gulp-plumber'<span style="color: #000000">),
    sourcemaps </span>= require('gulp-sourcemaps'<span style="color: #000000">),
    browserSync </span>= require('browser-sync'<span style="color: #000000">).create()
    reload </span>=<span style="color: #000000"> browserSync.reload;

</span><span style="color: #0000ff">var</span> LessAutoprefix = require('less-plugin-autoprefix'<span style="color: #000000">),
    autoprefix </span>= <span style="color: #0000ff">new</span> LessAutoprefix({ browsers: ['last 2 versions'<span style="color: #000000">] });

</span><span style="color: #008000">//</span><span style="color: #008000"> 文件路径</span>
<span style="color: #0000ff">var</span> paths =<span style="color: #000000"> {
  pug: {
    src: </span>'src/pug/pages/*.pug'<span style="color: #000000">,
    dest: </span>'dev/html/'<span style="color: #000000">,
    watch: </span>'src/pug/**/*.pug'<span style="color: #000000">
  },
  less: {
    src: </span>'src/less/**/*.less'<span style="color: #000000">,
    dest: </span>'dev/css/'<span style="color: #000000">,
    watch: </span>'src/less/**/*.less'<span style="color: #000000">
  },
  js: {
    src: </span>'src/js/**/*.js'<span style="color: #000000">,
    dest: </span>'dev/js/'<span style="color: #000000">,
    watch: </span>'src/js/**/*.js'<span style="color: #000000">
  },
  img: {
    src: </span>'src/img/**/*'<span style="color: #000000">,
    dest: </span>'dev/img/'<span style="color: #000000">,
    watch: </span>'src/img/**/*'<span style="color: #000000">
  }
}

</span><span style="color: #008000">//</span><span style="color: #008000"> 启动 browserSync 服务,自己启动server,并且为浏览器实时刷新提供服务</span>
gulp.task('browserSync', <span style="color: #0000ff">function</span><span style="color: #000000">() {
  </span><span style="color: #0000ff">return</span><span style="color: #000000"> browserSync.init({
    server: {
      baseDir: </span>'./'<span style="color: #000000">
    },
    files: </span>'./dev/**/*'<span style="color: #000000">
  });
})

</span><span style="color: #008000">//</span><span style="color: #008000"> 将pug文件转换为html</span>
gulp.task('pug', <span style="color: #0000ff">function</span><span style="color: #000000"> buildHTML() {
  </span><span style="color: #0000ff">return</span><span style="color: #000000"> gulp.src(paths.pug.src)
    .pipe(plumber({errorHandler: notify.onError(</span>'Error: <%= error.message %>'<span style="color: #000000">)}))
    .pipe(pug())
    .pipe(gulp.dest(paths.pug.dest));
});

</span><span style="color: #008000">//</span><span style="color: #008000"> 编译less文件</span>
gulp.task('less', <span style="color: #0000ff">function</span><span style="color: #000000">() {
  </span><span style="color: #0000ff">return</span><span style="color: #000000"> gulp.src(paths.less.src)
    .pipe(plumber({errorHandler: notify.onError(</span>'Error: <%= error.message %>'<span style="color: #000000">)}))
    .pipe(sourcemaps.init())
    .pipe(less({
      plugins: [autoprefix]
    }))
    .pipe(sourcemaps.write())
    .pipe(gulp.dest(paths.less.dest));
})

</span><span style="color: #008000">//</span><span style="color: #008000"> 复制js文件</span>
gulp.task('js', <span style="color: #0000ff">function</span><span style="color: #000000">() {
  </span><span style="color: #0000ff">return</span><span style="color: #000000"> gulp.src(paths.js.src)
    .pipe(gulp.dest(paths.js.dest));
})

</span><span style="color: #008000">//</span><span style="color: #008000"> 复制img文件</span>
gulp.task('img', <span style="color: #0000ff">function</span><span style="color: #000000">() {
  </span><span style="color: #0000ff">return</span><span style="color: #000000"> gulp.src(paths.img.src)
    .pipe(gulp.dest(paths.img.dest));
})


</span><span style="color: #008000">//</span><span style="color: #008000"> 监听文件变化</span>
gulp.task('watch', <span style="color: #0000ff">function</span><span style="color: #000000">() {
  gulp.watch(paths.pug.watch, gulp.parallel(</span>'pug'<span style="color: #000000">))
  gulp.watch(paths.less.watch, gulp.parallel(</span>'less'<span style="color: #000000">))
  gulp.watch(paths.js.watch, gulp.parallel(</span>'js'<span style="color: #000000">))
  gulp.watch(paths.img.watch, gulp.parallel(</span>'img'<span style="color: #000000">))
})

</span><span style="color: #008000">//</span><span style="color: #008000"> 默认任务,在命令行输入`gulp`来启动任务</span>
gulp.task('default', gulp.parallel('watch', 'browserSync', 'pug', 'less', 'js'))
登录后复制

gulp-pug这个插件是用来编译pug模板的,也就是以前的jade模板,pug模板是一个很强大的前后端通用的模板引擎,而且学习也很简单,具体用法可以看我另外一篇关于pug的教程文章——基于express+mongodb+pug的博客系统——pug篇。

大家知道gulp在监听任务的过程中,如果某个环节出了错误,gulp就会被中断,然后得重新启动gulp任务才行,这是一件很麻烦的事。这里可以通过gulp-notify和gulp-plumber两个插件来避免gulp任务中断。

4.生产环境配置

<span style="color: #0000ff">var</span> gulp = require('gulp'<span style="color: #000000">),
  del </span>= require('del'<span style="color: #000000">),
  pug </span>= require('gulp-pug'<span style="color: #000000">),
  less </span>= require('gulp-less'<span style="color: #000000">),
  cleanCSS </span>= require('gulp-clean-css'<span style="color: #000000">),
  base64 </span>= require('gulp-tobase64'<span style="color: #000000">),
  </span><span style="color: #008000">//</span><span style="color: #008000"> img64 = require('gulp-imgbase64'),</span>
  imagemin = require('gulp-imagemin'<span style="color: #000000">),
  babel </span>= require('gulp-babel'<span style="color: #000000">),
  uglify </span>= require('gulp-uglify'<span style="color: #000000">),
  rev </span>= require('gulp-rev'), <span style="color: #008000">//</span><span style="color: #008000"> 添加时间戳</span>
  revCollector = require('gulp-rev-collector'<span style="color: #000000">);


</span><span style="color: #0000ff">var</span> LessAutoprefix = require('less-plugin-autoprefix'<span style="color: #000000">),
  autoprefix </span>= <span style="color: #0000ff">new</span><span style="color: #000000"> LessAutoprefix({
    browsers: [</span>'last 2 versions'<span style="color: #000000">]
  });

</span><span style="color: #008000">//</span><span style="color: #008000"> 文件路径</span>
<span style="color: #0000ff">var</span> paths =<span style="color: #000000"> {
  pug: {
    src: </span>'src/pug/pages/*.pug'<span style="color: #000000">,
    dest: </span>'dist/html/'<span style="color: #000000">
  },
  less: {
    src: </span>'src/less/main.less'<span style="color: #000000">,
    dest: </span>'dist/css/'<span style="color: #000000">
  },
  js: {
    src: [</span>'src/js/**/*.js', '!src/js/lib/*.js'<span style="color: #000000">],
    dest: </span>'dist/js/'<span style="color: #000000">
  },
  img: {
    src: </span>'src/img/**/*'<span style="color: #000000">,
    dest: </span>'dist/img/'<span style="color: #000000">
  }
};


</span><span style="color: #008000">//</span><span style="color: #008000"> 将pug文件转换为html</span>
gulp.task('pug', <span style="color: #0000ff">function</span><span style="color: #000000">() {
  </span><span style="color: #0000ff">return</span><span style="color: #000000"> gulp.src(paths.pug.src)
    .pipe(pug())
    .pipe(gulp.dest(paths.pug.dest));
});

</span><span style="color: #008000">//</span><span style="color: #008000"> 编译less文件</span>
gulp.task('less', <span style="color: #0000ff">function</span><span style="color: #000000">() {
  </span><span style="color: #0000ff">return</span><span style="color: #000000"> gulp.src(paths.less.src)
    .pipe(less({
      plugins: [autoprefix]
    }))
    .pipe(base64({
      maxsize: </span>8<span style="color: #000000">
    }))
    .pipe(cleanCSS({
      compatibility: </span>'ie8' <span style="color: #008000">//</span><span style="color: #008000"> 兼容性前缀保留</span>
<span style="color: #000000">    }))
    .pipe(rev())
    .pipe(gulp.dest(paths.less.dest))
    .pipe(rev.manifest())
    .pipe(gulp.dest(</span>'rev/css'<span style="color: #000000">))
});

</span><span style="color: #008000">//</span><span style="color: #008000"> 压缩图片</span>
gulp.task('img', <span style="color: #0000ff">function</span><span style="color: #000000">() {
  </span><span style="color: #0000ff">return</span><span style="color: #000000"> gulp.src(paths.img.src)
    .pipe(imagemin({
      optimizationLevel: </span>3<span style="color: #000000">,
      progressive: </span><span style="color: #0000ff">true</span><span style="color: #000000">,
      interlaced: </span><span style="color: #0000ff">true</span><span style="color: #000000">
    }))
    .pipe(gulp.dest(paths.img.dest));
});

</span><span style="color: #008000">//</span><span style="color: #008000"> 编译JS文件</span>
gulp.task('js', <span style="color: #0000ff">function</span><span style="color: #000000">() {
  </span><span style="color: #0000ff">return</span><span style="color: #000000"> gulp.src(paths.js.src)
    .pipe(babel({
      presets: [</span>'es2015'<span style="color: #000000">]
    }))
    .pipe(uglify())
    .pipe(rev())
    .pipe(gulp.dest(paths.js.dest))
    .pipe(rev.manifest())
    .pipe(gulp.dest(</span>'rev/js'<span style="color: #000000">));
});
</span><span style="color: #008000">//</span><span style="color: #008000"> 引用的外部 JS 库,不需要做压缩和打时间戳等处理</span><span style="color: #008000">
//</span><span style="color: #008000"> 所以直接复制就行</span>
gulp.task('copyJs', <span style="color: #0000ff">function</span><span style="color: #000000">() {
  </span><span style="color: #0000ff">return</span> gulp.src('src/js/lib/*.js'<span style="color: #000000">)
    .pipe(gulp.dest(</span>'dist/js/lib/'<span style="color: #000000">))
})

</span><span style="color: #008000">//</span><span style="color: #008000"> 替换加了MD5时间戳的文件</span>
gulp.task('rev', gulp.series(gulp.parallel('img64', 'less', 'js'), <span style="color: #0000ff">function</span><span style="color: #000000">() {
  </span><span style="color: #0000ff">return</span> gulp.src(['rev/**/*.json', 'dist/html/*.html'<span style="color: #000000">])
    .pipe(revCollector({
      replaceReved: </span><span style="color: #0000ff">true</span><span style="color: #000000">
    }))
    .pipe(gulp.dest(paths.pug.dest));
}));
</span><span style="color: #008000">//</span><span style="color: #008000"> Clean 任务执行前,先清除之前生成的文件</span>
gulp.task('clean', <span style="color: #0000ff">function</span><span style="color: #000000">() {
  </span><span style="color: #0000ff">return</span> del('dist/'<span style="color: #000000">)
});

</span><span style="color: #008000">//</span><span style="color: #008000"> 默认任务,在命令行输入`gulp`来启动任务</span>
gulp.task('default', gulp.series('clean', gulp.series('img', gulp.parallel('rev', 'copyJs'))))
登录后复制

在生成环境中,代码需要压缩合并,另外在每次代码更新发布新版本时,为了用户客户端能下载更新代码,所以我们还需要给CSS和JS文件打上时间戳。

gulp-rev这个插件就专门给文件打MD5戳的,打完MD5戳之后,HTML文件里的引用当然也需要更改,如果每个都去手动更改肯定会是一件很麻烦的事,所以我们还需要gulp-rev-collector这个插件来帮我们替换打了MD5戳的文件。

gulp-imgbase64,这个插件可以指定html文件中,哪些img元素转换为base64,需要更加个性化转换的可以使用这个插件。

5.项目目录结构

XXX——

  | — dist

    | — html

    | — css

    | — img

    | — js

      | — lib

  | — dev

    | — html

    | — css

    | — img

    | — js

      | — lib

  | — src

    | — pug

      | — components

      | — pages

      | — layout.pug

    | — less

      | — pages

      | — main.less

      | — reset.less

      | — common.less

      | — feature.less

    | — img

    | — js

      | — lib

src文件夹里是主要的业务代码,这里面是需要长期维护的代码。

dev文件夹是开发时gulp生成代码的地方。

dist文件夹是生成时gulp生成代码的地方。

在这份配置里,我并没有像其他很多人那样,把开发时通过gulp生成的代码也放在src文件夹里,因为那样会造成很多引用上的麻烦,而且把开发和生产的代码环境都分开,能很好保持src文件夹里的纯净,不会有任何杂乱代码。

所以一些没经过gulp处理的文件,我会直接把它们复制到dev或者dist文件夹里对应的位置。

dist文件夹在每次gulp任务生成代码前都会被清空,所以我们不用关心dist文件夹里的内容。

而dev文件夹可能会有很多冗余文件,但我们也不需要担心它会对我们造成任何影响,文件删除或覆盖都不重要,只需要保证src文件夹里的文件正确即可。

 

以上是gulp实用配置(2)——中小项目的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1666
14
CakePHP 教程
1425
52
Laravel 教程
1327
25
PHP教程
1273
29
C# 教程
1252
24
PyCharm新手指南:学会在PyCharm中删除项目 PyCharm新手指南:学会在PyCharm中删除项目 Feb 23, 2024 pm 09:39 PM

PyCharm新手指南:删除项目的实用技巧PyCharm是一款功能强大的Python集成开发环境(IDE),在进行项目开发时,有时候需要删除项目或项目中的文件。本文将介绍在PyCharm中删除项目的实用技巧,并提供具体的代码示例帮助新手更好地理解和应用。1.删除项目删除项目意味着删除整个项目文件夹,这在我们需要清理或重建项目时非常有用。在PyCharm中删

全角英文字母转换为半角形式的实用技巧 全角英文字母转换为半角形式的实用技巧 Mar 26, 2024 am 09:54 AM

全角英文字母转换为半角形式的实用技巧在现代生活中,我们经常会接触到英文字母,在使用电脑、手机等设备时也经常需要输入英文字母。然而,有时候我们会遇到全角英文字母的情况,而我们需要使用的是半角形式。那么,如何将全角英文字母转换为半角形式呢?下面就为大家介绍一些实用的技巧。首先,全角英文字母和数字是指在输入法中占据一个全角位置的字符,而半角英文字母和数字则是占据一

从零开始学习Django框架:实用教程和示例 从零开始学习Django框架:实用教程和示例 Sep 28, 2023 am 08:42 AM

从零开始学习Django框架:实用教程和示例Django是一种流行的PythonWeb应用程序框架,它简化了网站的开发过程。它提供了一套强大的工具和库,帮助开发者构建高效、可扩展和安全的Web应用程序。对于初学者来说,学习Django可能会有些困难,但是通过一些实用的教程和示例,你可以快速上手并了解这个框架的核心概念和用法。本文将带你逐步学习Django框

【Linux工具】-yum/gdb使用教程! 【Linux工具】-yum/gdb使用教程! Mar 07, 2024 am 11:10 AM

yum是一种常用的软件包管理工具,而gdb是一种强大的调试工具。下面是它们的使用教程:yum使用教程:安装软件包:使用yuminstall命令安装软件包。例如,要安装ApacheWeb服务器,可以运行yuminstallhttpd。升级软件包:使用yumupdate命令升级已安装的软件包。例如,运行yumupdate将升级系统中的所有软件包。删除软件包:使用yumremove命令删除软件包。例如,要删除ApacheWeb服务器,可以运行yumremovehttpd。搜索软件包:使用yumsear

Linux系统如何查看服务器带宽及网络使用情况? Linux系统如何查看服务器带宽及网络使用情况? Mar 06, 2024 pm 05:52 PM

要查看Linux服务器的带宽和网络使用情况,可以使用以下命令和工具:ifconfig命令:ifconfig命令用于显示和配置网络接口信息,包括带宽和网络使用情况。使用以下命令查看所有网络接口的信息:ifconfig该命令将显示每个网络接口的详细信息,包括接收和发送的数据包数量以及网络使用情况。ip命令:ip命令是一个更强大的替代品,用于显示和配置网络接口和路由表等信息。使用以下命令查看所有网络接口的信息:ip-slink该命令将显示每个网络接口的统计信息,包括接收和发送的数据包数量以及网络使用情

学习如何在Laravel Elixir中运用Gulp框架 学习如何在Laravel Elixir中运用Gulp框架 Jan 22, 2024 am 11:27 AM

LaravelElixir是一个较为流行的前端自动化工具集,它基于Gulp,简化了许多以前需要手动进行的任务。但LaravelElixir的优雅API设计,并不意味着开发人员完全不用了解Gulp的使用。相反,了解Gulp的使用可以更好地理解LaravelElixir的工作原理,提高开发效率。本文将介绍如何在LaravelElixir框架中使用Gulp

使用Terraform来管理OpenStack集群 使用Terraform来管理OpenStack集群 Feb 18, 2024 pm 04:42 PM

Terraform是一种声明性语言,可以作为你正在建设的基础设施的蓝图。经过一段时间拥有OpenStack生产环境和家庭实验室后,我确认了从管理员和租户的角度对于部署和管理工作负载的重要性。Terraform是用于管理基础设施即代码的开源软件工具,通过声明性语言创建基础设施蓝图。它支持Git管理,并适用于GitOps。本文介绍了使用Terraform管理OpenStack集群的基础知识。我使用Terraform重新创建了OpenStack演示项目。安装Terraform我使用CentOS作为跳板

Ubuntu如何判断哪个串口在工作 Ubuntu如何判断哪个串口在工作 Feb 29, 2024 am 08:00 AM

使用命令行工具:可以使用命令ls/dev来列出系统中所有的串口设备,通常串口设备的名称以ttyS或ttyUSB开头。可以使用dmesg|greptty命令来查看系统启动时串口设备的信息。您可以使用串口监控工具如minicom、PuTTY等来打开串口设备,以便进行数据测试。通过成功发送和接收数据,您可以验证串口的正常工作状态。可以借助专门的串口检测工具(例如SerialPortMonitor、RealTerm等)来扫描系统内的串口设备,进而进行测试和调试工作。

See all articles