关于什么是gulp,它和grunt有什么区别等问题,这里不做任何介绍。本文主要介绍如何使用gulp-usemin这款插件,同时也会简单介绍本文中用到的一些插件。

什么是gulp-usemin

用来将HTML 文件中(或者templates/views)中没有优化的script 和stylesheets 替换为优化过的版本

gulp-usemin根据预先在html文件(或者其它模板/视图中的文件)中声明好的blocks来执行一系列任务(例如合并文件并重全名、排除一些只在开发过程中引入的脚本以及将css和js中的代码提取出来内嵌在html文件中)来处理未优化的样式和脚本。然后我们可以通过gulp.dest()方法将处理的结果输出到其它目录。

如何使用

首先需要了解在html中如何声明一个blocks,一个blocks定义如下:

<!-- build:<pipelineId>(alternate search path) <path> -->
... HTML Markup, list of script / link tags.
<!-- endbuild -->
​```
  • pipelineId:在配置文件中需要使用的 pipeline id 或者 指定 remove 声明用于移除整块blocks
  • alternate search path:(可选项)默认情况下任务读取的输入文件相对于blocks块中引入的路径,使用这一可选配置项可以修改文件引入的路径
  • path:最终合并和处理后输出的文件名及路径

这里使用gulp-usemin文档中给出的示例目录结构作为演示,目录结构如下:

|
+- app
| +- index.html
| +- assets
| +- js
| +- foo.js
| +- bar.js
| +- baz.js
| +- css
| +- clear.css
| +- main.css
+- dist
+- node_modules
+- gulpfile.js

这里我们用到了下面列举的一些gulp插件:

  • gulp-load-plugins:省去手动引用插件的麻烦
  • gulp-usemin:本文主要讲解的插件
  • gulp-uglify:压缩js
  • gulp-minify-css:压缩css
  • gulp-clean:清空目录
  • gulp-rev:添加md5戳

任务一:文件合并到指定的目录文件名下

这是一个很常规的任务,把需要合并的文件放置在对就的blocks里面,然后指出合并后的文件对应文件名即可。下面是合并前的app/index.html中未优化前的内容

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>gulp-usemin示例</title>
<!-- build:css style.css -->
<link rel="stylesheet" href="css/clear.css"/>
<link rel="stylesheet" href="css/main.css"/>
<!-- endbuild -->
</head>
<body>
<!-- build:js js/optimized.js -->
<script src="assets/js/foo.js"></script>
<script src="assets/js/bar.js"></script>
<!-- endbuild -->
</body>
</html>

然后,在app/gulpfile.js中给出对就的task,这里我们对合并后的css和javaScript进行了压缩,并最终输出到dist/目录下

'use strict';

var gulp = require('gulp'),
$ = require("gulp-load-plugins")(); gulp.task('usemin', function() {
return gulp.src('./app/index.html')
.pipe($.usemin({
js: [$.uglify()],
css: [$.minifyCss()]
}))
.pipe(gulp.dest('dist/'));
});

生成后的dist/目录如下

|
+- dist
| +- js
| +- optimized.js
| +- index.html
| +- style.css

最终在dist/index.html只有合并过后的文件引用,同时在app/index.html文件中的添加的blocks声明注释也自动去掉了。

当然这里也可以保留注释,只需要在配置中将enableHtmlComment设置为true`就可以了。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>gulp-usemin示例</title>
<link rel="stylesheet" href="style.css"/>
</head>
<body>
<script src="js/optimized.js"></script>
</body>
</html>

`dist/style.css为压缩后的样式

.clear{clear:both}.main{width:1200px;margin:0 auto}.btn{display:inline-block;text-align:center;border:none;background:#136fd2;color:#fff;border-radius:4px;box-shadow:0 -2px 0 #1360ba inset;padding:9px 10px;font-size:12px;font-weight:700;margin-bottom:4px}

dist/js/optimized.js如下:

console.log("foo"),console.log("bar");

任务二:将样式和脚本直接嵌入到页面中

使用gulp-usemin不光可以合并文件,可以将指定的文件嵌入到html文件中,这功能很强大。

在开始这个任务前先把上一个任务生成的文件使用gulp-clean全部清除掉

gulp.task('clean', function() {
gulp.src('./dist/*')
.pipe($.clean());
});

接下来更改app/index.html内容为

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>gulp-usemin示例</title>
<!-- build:inlinecss -->
<link rel="stylesheet" href="css/clear.css"/>
<link rel="stylesheet" href="css/main.css"/>
<!-- endbuild -->
</head>
<body>
<!-- build:inlinejs -->
<script src="assets/js/foo.js"></script>
<script src="assets/js/bar.js"></script>
<!-- endbuild -->
</body>
</html>

这里任务不变,最终在dist/index.html的内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>gulp-usemin示例</title>
<style>.clear {
clear: both;
}
.main {
width: 1200px;
margin: 0 auto;
} .btn {
display: inline-block;
text-align: center;
border: none;
background: #136fd2;
color: white;
border-radius: 4px;
box-shadow: 0 -2px 0 #1360ba inset;
padding: 9px 10px;
font-size: 12px;
font-weight: bold;
margin-bottom: 4px;
}</style>
</head>
<body>
<script>console.log('foo');
console.log('bar');</script>
</body>
</html>

虽然我们在配置中添加了压缩样式和脚本的功能,但观察生成后的文件,其实并没有被压缩。

任务三: 移除部分文件

这是是指最终生成的文件中不包含某些文件,比较常见的是在开发过种中手动使用 mockAjax 和 mockJSON 模拟ajax数据和请求,但在发布的时候这些文件引用需要手动删除掉。

同样先清空dist/目录,然后更改app/index.html如下

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>gulp-usemin示例</title>
<!-- build:css style.css -->
<link rel="stylesheet" href="css/clear.css"/>
<link rel="stylesheet" href="css/main.css"/>
<!-- endbuild -->
</head>
<body>
<!-- build:js js/optimized.js -->
<script src="assets/js/foo.js"></script>
<script src="assets/js/bar.js"></script>
<!-- endbuild --> <!-- build:remove -->
<script src="assets/js/baz.js"></script>
<!-- endbuild -->
</body>
</html>

这里的assets/js/baz.js是不会被输出到dist/js文件中,结果如下

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>gulp-usemin示例</title>
<link rel="stylesheet" href="style.css"/>
</head>
<body>
<script src="js/optimized.js"></script>
</body>
</html>

任务四:为文件添加md5戳

接下来在任务一的基础上对文件添加一个md5戳,这里使用gulp-rev插件

gulp.task('usemin', function() {

  return gulp.src('./app/index.html')
.pipe($.usemin({
js: [$.uglify(), $.rev()],
css: [$.minifyCss(), $.rev()]
}))
.pipe(gulp.dest('dist/'))
});

执行后dist/index.html如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>gulp-usemin示例</title>
<link rel="stylesheet" href="style-a28260ea41.css"/>
</head>
<body>
<script src="js/optimized-62fa5ef80a.js"></script>
</body>
</html>

生成后的dist/目录

|
+- dist
| +- js
| +- optimized-62fa5ef80a.js
| +- index.html
| +- style-a28260ea41.css

是不是很爽,这样就ok了?

但还不够完美,如果再去改一下css或者js文件,再次执行任务,会发现又生成了一个style-d4bd3b66b7.css(名字可能不同)样式,而且html对应的资源引用也是指向这个新生成的,同时原来的style-a28260ea41.css文件也还一直存在,很明显浪费了磁盘空间。那好手动删除了吧╯﹏╰,算了,直接使用gulp-clean把整个清空,重新生成一遍,但认真一想,如果项目要生成的文件成百上千,我再生成一次太耗费时间了,其实我只想更新一部分文件。

关于这个问题在网上找了好久的解决方案,这里找到了一个gulp-rev-outdated插件,使用它可以自定义保存多少个旧版本的文件,每次更新就会删除掉老的一个版本。其它的方案还在尝试中。

插件中有一个cleaner()方法,涉及到三个依赖文件gulp-util, rimrafthought2,请自行下载。

 'use strict';

var gulp = require('gulp'),
path = require('path'),
through = require('through2'),
del = require('del'),
$ = require("gulp-load-plugins")(); function cleaner() {
return through.obj(function(file, enc, cb){
del(path.resolve( (file.cwd || process.cwd()), file.path)).then(function() {
this.push(file);
cb();
}, function(err) {
this.emit('error', new $.util.PluginError('Cleanup old files', err));
});
});
} gulp.task('usemin', ['clean:rev'], function() { return gulp.src('./app/index.html')
.pipe($.usemin({
js: [$.uglify(), $.rev()],
css: [$.minifyCss(), $.rev()]
}))
.pipe(gulp.dest('dist/'))
}); gulp.task('clean:rev', function() {
gulp.src(['dist/**/*.*'], {read: false})
.pipe( $.revOutdated(1)) // 只保存一个旧版本的rev
.pipe(cleaner()) return;
}) // 清空dist目录下的所有文件
gulp.task('clean', function() {
gulp.src('./dist/*')
.pipe($.clean())
});

注意:由于文档中使用的rimraf插件gulp官方不建议使用了,所以改成了更为常用的del插件。

运行后的dist/目录如下:

|
+- dist
| +- js
| +- optimized-62fa5ef80a.js
| +- index.html
| +- style-2091d1f99f.css
| +- style-fffb5ca589.css

其中`dist/index.html内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>gulp-usemin示例</title>
<link rel="stylesheet" href="style-fffb5ca589.css"/>
</head>
<body>
<script src="js/optimized-62fa5ef80a.js"></script>
</body>
</html>

结语

注意,虽然本文介绍了gulp-usemin的使用方法,但这个插件现在已不推荐使用了,详情可以查看gulp黑名单,官方推荐使用 gulp-useref 来达到同样的目的。

本文示例代码地址:https://github.com/wujie520303/blogCode/tree/master/gulp/gulp-usemin-demo

gulp插件gulp-usemin简单使用的更多相关文章

  1. 利用gulp 插件gulp.spritesmith 完成小图合成精灵图,并自动输出样式文件

    安装依赖 yarn add gulp yarn add gulp.spritesmith 本次依赖的版本是: "gulp": "^3.9.1" "gu ...

  2. gulp插件gulp-nunjucks-render的使用及gulp4的简单了解

    之前写过一篇gulp的使用文章一篇迟到的gulp文章,代码合并压缩,less编译 最近有在用gulp,使用到一个gulp-nunjucks-render插件,感觉挺方便的 gulp-nunjucks- ...

  3. 使用gulp插件来自动刷新页面。

    http://itakeo.com/blog/2016/05/19/gulpreload/?none=123 使用gulp插件来自动刷新页面.再也不用修改一次,按一下F5了. 首选通过npm inst ...

  4. 将less编译成css的gulp插件

    简介:gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成:使用她,我们不仅可以很愉快的编写代码, ...

  5. 基于gulp编写的一个简单实用的前端开发环境好了,安装完Gulp后,接下来是你大展身手的时候了,在你自己的电脑上面随便哪个地方建一个目录,打开命令行,然后进入创建好的目录里面,开始撸代码,关于生成的json文件请点击这里https://docs.npmjs.com/files/package.json,打开的速度看你的网速了注意:以下是为了演示 ,我建的一个目录结构,你自己可以根据项目需求自己建目

    自从Node.js出现以来,基于其的前端开发的工具框架也越来越多了,从Grunt到Gulp再到现在很火的WebPack,所有的这些新的东西的出现都极大的解放了我们在前端领域的开发,作为一个在前端领域里 ...

  6. Gulp 插件及其使用

    前端现在有很多的自动打包工具,各有优缺点,而gulp作为其中的一员,也有着很受人们的青睐,简单粗暴,然而gulp本身并没有提供很多的API,真正的一些工作则是靠着插件完成的,本文简单介绍一些常用的gu ...

  7. gulp插件实现压缩一个文件夹下不同目录下的js文件(支持es6)

    gulp-uglify:压缩js大小,只支持es5 安装: cnpm: cnpm i gulp-uglify -D yarn: yarn add gulp-uglify -D 使用: 代码实现1:压缩 ...

  8. gulp插件(8) - gulp-sourcemaps(生成sourcemap)

    功能描述生成sourcemap文件(什么是sourcemap?请参考,简单讲就是文件压缩后不利于查看与调试,但是有了sourcemap,出错的时候,除错工具将直接显示原始代码,而不是转换后的代码) 插 ...

  9. 基于gulp编写的一个简单实用的前端开发环境

    自从Node.js出现以来,基于其的前端开发的工具框架也越来越多了,从Grunt到Gulp再到现在很火的WebPack,所有的这些新的东西的出现都极大的解放了我们在前端领域的开发,作为一个在前端领域里 ...

随机推荐

  1. SQL Server 分页方法汇总

    PageSize = 30 PageNumber = 201 方法一:(最常用的分页代码, top / not in) UserId UserId from UserInfo order by Use ...

  2. jQuery简单入门(四)

    4.表单应用 表单是HTML的重要组成部分,在采集.提交用户输入的信息和显示列表数据等需求中有重要作用 表单应用 一个简单的表单HTML示例: <form action=”url” method ...

  3. 描述Linux系统开机到登陆界面的启动过程(计时2分钟)

    简述: 1.开机BIOS自检 2.MBR引导 3.grub引导菜单 4.加载内核kernel 5.启动init进程 6.读取inittab文件,执行rc.sysinit,rc等脚本 7.启动minge ...

  4. HTML属性的长度问题

    越来越多的同学喜欢把数据存放在html属性上,比如 <p data-info="{a:1,b:2}">xxx</p> 一堆JSON数据放在data-info ...

  5. Mysql中使用find_in_set函数查找字符串

    mysql有个表的字段的存储是以逗号分隔的,如domain字段login.s01.yy.com,s01.yy.com,s02.yy.com.现在要查找s01.yy.com这个.我们用like查找好像不 ...

  6. System V IPC(2)-信号量

    一.概述                                                    System V信号量与System V消息队列不同.它不是用来在进程间传递数据.它主要 ...

  7. DevOps Workshop 研发运维一体化第一场(微软亚太研发集团总部)

    准备了近两周,写了大量的操作手册,设计了大量的动手实验场景,终于在中关村的微软大厦完成了两天的DevOps培训. 最初报名160人,按照之前的培训经验,一般能到一半就不错了,没想到这次现场登记人员就超 ...

  8. Neutron分析(4)—— neutron-dhcp-agent

    一.概述 neutron dhcp为租户网络提供DHCP服务,即IP地址动态分配,另外还会提供metadata请求服务. 3个主要的部件: DHCP agent scheduler:负责DHCP ag ...

  9. 笔记:html 拾遗之一

    html 拾遗之一 今天翻了下w3schools.com 把忘掉的语法记一下(仅常用但是不熟的部分) img alt 属性,当图片无法显示时可显示alt属性的文字 br 换行 < html la ...

  10. FFT,NTT 专题

    学习傅里叶的基本性质及其代码,可以参考大神理解 还有 ACdream 的博客 贴一下NTT的模板: using namespace std; typedef long long ll; int n; ...