Grunt usemin
yeoman/grunt-usemin 用来将 HTML 文件中(或者 templates/views)中没有优化的 script 和 stylesheets 替换为优化过的版本。
usemin
暴露两个内置的任务,分别为:
useminPrepare
为将指定文件中的 usemin block 转换为单独的一行(优化版本)准备配置。这通过为每个优化步骤生成名为generated
的子任务来完成。usemin
使用优化版本替换 usemin 块,如果在磁盘上可以找到 revisioned 版本,则替换为 revisioned 版本。
usemin
可能用到的插件:
usemin
的典型步骤是,先使用 useminPrepare
,然后调用每个优化步骤的 generated
子任务,最后调用 usemin
。如:
1
2
3
4
5
6
7
8
9
|
// simple build task
grunt.registerTask('build', [
'useminPrepare',
'concat:generated',
'cssmin:generated',
'uglify:generated',
'filerev',
'usemin'
]);
|
关于目录和任务,最主要的区别是 useminPrepare
的需要指定输入路径、临时路径(默认为 .tmp
)和输出路径,这个输出路径用来为处理器管道输出正确的配置,然后 usemin
只和输出路径有关,所有需要的资源都应该已经输入到了目标目录中(变化或者只是拷贝)。
合并文件默认生成到临时目录(.tmp
)下,混淆后的文件默认生成到指定的 dest 目录下。
useminPrepare
useminPrepare
试图为应用到 usemin 块的步骤(如 concatenation and uglify-cation)准备正确的配置。这需要输入目录,临时目录和目标目录。usemin 块中引用的文件要么是相对路径要么是绝对路径(/images/foo.png
or ../../images/foo.png
)。通过绝对路径引用的文件在指定的搜索路径集合中查找,默认路径为包含 usemin 块的 html/css 文件所在的路径。相对路径引用的文件也在包含 usemin 块文件所在的路径中查找。如果不指定 root,绝对路径和相对路径其实都是相对当前检查的 html/css 文件所在的目录。
useminPrepare
任务更新 grunt 配置,以便对被标记的文件(i.e. usemin 块)应用配置好的变化流程。JS 的默认变换流程由 concat
和 uglifyjs
组成,当可以配置。
usemin 块可以如下表达:
1
2
3
|
<!-- build:<type>(alternate search path) <path> -->
... HTML Markup, list of script / link tags.
<!-- endbuild -->
|
- type: 可以是
js
,css
或者使用 block replacement function 定义的自定义类型。 - alternate search path: (可选) 默认情况下,输入文件时相对 usemin 块所在的文件,Alternate search path 让你改变相对路径。这个对应
options.root
选项。 - path: 优化后的文件路径。
如:
1
2
3
4
5
6
|
<!-- build:js js/app.js -->
<script src="js/app.js"></script>
<script src="js/controllers/thing-controller.js"></script>
<script src="js/models/thing-model.js"></script>
<script src="js/views/thing-view.js"></script>
<!-- endbuild -->
|
变换流程
变换流程有有序的步骤组成:每个步骤都会变换文件,为了让步骤能够正确执行,useminPrepare
会修改配置。
JS 默认流程是 concat -> uglifyjs
,CSS 的默认流程是 concat —> cssmin。此外,一些后处理器可以进一步地修改配置。useminPrepare.options.flow
用来配置流程,可以在目标上指定,也可以在整个任务上指定。你可以分别指定 steps
或者后处理器 post
。
例如,假设目录结构如下:
|
+- app
| +- index.html
| +- assets
| +- js
| +- foo.js
| +- bar.js
+- dist
我们想优化 foo.js
and bar.js
,并生成到使用相对路径的 optimized.js
文件中。index.html
包含下面的 usemin 块;
1
2
3
4
|
<!-- build:js assets/js/optimized.js -->
<script src="assets/js/foo.js"></script>
<script src="assets/js/bar.js"></script>
<!-- endbuild -->
|
如果想让我们的文件生成到 dist
目录中,我们可以使用下面的 useminPrepare
配置:
1
2
3
4
5
6
7
8
|
{
useminPrepare: {
html: 'app/index.html',
options: {
dest: 'dist'
}
}
}
|
这会产生如下配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
{
concat:
{
'.tmp/concat/assets/js/optimized.js': [
'app/assets/js/foo.js',
'app/assets/js/bar.js'
]
},
uglify:
{
'dist/assets/js/optimized.js': ['.tmp/concat/assets/js/optimized.js']
}
}
|
路径
useminPrepare
解析你的 HTML 标签,找到每个 block,然后初始化对应的 Grunt 配置,当 type=js
时,使用 concat/uglify
,当type=css
时,使用 concat/cssmin
。你不用在指定 concat/uglify/cssmin 的相关配置。
useminPrepare
只有一个目标: html
,这个文件中包含相关文件的列表。例如,在 Gruntfile.js
文件中:
1
2
3
|
useminPrepare: {
html: 'index.html'
}
|
默认,它会将这个 html 文件所在的目录当做 ‘root’ 目录,其他文件都将相对这个路径。如果你想改变这个根目录,可以使用 root
选项。useminPrepare
的目标也可以使用 grunt 的 src-dest 文件语法。
兄弟目录中的 HTML 文件和 资源文件:
app
|
+- html
| +- index.html
+- assets
| +- js
| +- foo.js
| +- bar.js
+- dist
我们想优化 foo.js
and bar.js
,并且生成到使用绝对路径引用的 optimized.js
目录中。index.html
包含的 usemin 块:
1
2
3
4
|
<!-- build:js /assets/js/optimized.js -->
<script src="/assets/js/foo.js"></script>
<script src="/assets/js/bar.js"></script>
<!-- endbuild -->
|
我们想让文件生成到 dist
目录,使用的 useminPrepare
配置为:
1
2
3
4
5
6
7
8
9
|
{
useminPrepare: {
html: 'html/index.html',
options: {
root: 'app',
dest: 'dist'
}
}
}
|
这会生成下面的配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
{
concat:
{
'.tmp/concat/assets/js/optimized.js': [
'app/assets/js/foo.js',
'app/assets/js/bar.js'
]
},
uglify:
{
'dist/assets/js/optimized.js': ['.tmp/concat/assets/js/optimized.js']
}
}
|
usemin
usemin
目标使用优化后的文件替换 html/css 中 images, scripts, css 的引用。 usemin
任务完成两件事:
- 首先,使用变换流程创建的优化文件替换替换所有的 usemin 块。
- 然后,试图使用 grunt-filerev 创建的 revved 版本替换资源文件(i.e. images, scripts, …)的引用。
查找资源
usemin
默认会去找 grunt-filerev 创建的映射对象,该对象存在于 grunt.filerev.summary
。如果没找到,则会到磁盘上查找。
通过使用 options.revmap
,你可以提供映射对象。
路径
当 usemin
试图使用资源的引用替换为他们的 revved 版本时,他们必须查找目录(asset search paths)集合。资源索索路径集合默认是相对当前处理的的文件所在的目录,当让,你可以使用 options.root
修改。
Example 1: file dist/html/index.html
has the following content:
1
2
|
<link rel="stylesheet" href="styles/main.css">
<img src="../images/test.png">
|
usemin
默认会在 dist/html
下查找 revved 版本:
styles/main.css
:main.css
的 revved 版本会在dist/html/styles
下找到。比如dist/html/styles/main.1234.css
会被匹配到,而dist/html/main.1234.css
不会被匹配,引用文件的路径很重要。../images/test.png
:test.png
的 revved 版本会在dist/images
查找。
Example 2: file dist/html/index.html
has the following content:
1
2
|
<link rel="stylesheet" href="/styles/main.css">
<img src="/images/test.png">
|
usemin
默认会在 dist/html
下查找 styles/main.css
和 images/test.png
的 revved 版本。假设我们的资源分散在dist/assets
,通过修改资源的搜索路径列表为 ['dist/assets']
,revved 版本就会在 dist/assets
下找到(如dist/assets/images/test.875487.png
and dist/assets/styles/main.98090.css
)。如:
1
2
3
4
5
6
|
usemin: {
html: 'dist/html/index.html',
options: {
assetsDirs: ['dist/assets']
}
}
|
转 http://inching.org/2014/10/28/grunt-usemin/
Grunt usemin的更多相关文章
- Grunt usemin前端自动化打包流程
前端优化是尽量减少http请求,所以我们需要尽量合并压缩文件,然后调用压缩后的文件,比如多个css文件压缩成一个,多个js文件合并压缩等,usemin能够自动在html中使用压缩后的文件,达到上面的目 ...
- Grunt Part 2
Objectives and Outcomes In this exercise, you will continue to learn to use Grunt, the task runner. ...
- Gruntjs: grunt-usemin使用心得
grunt-usemin: Replaces references to non-optimized scripts or stylesheets into a set of HTML files u ...
- grunt之filerev、usemin
窃以为这两个插件是比较有用的,filerev是给js.css进行编码重命名,usemin修改html中被重命名的js.css文件的引用.另外说明下之前将concat.cssmin.uglify放在一篇 ...
- Grunt(页面静态引入的文件地址的改变探究)-V2.0
相关插件的引用: grunt-usemin 对页面的操作 grunt-contrib-cssmin 压缩css load-grunt-tasks 瘦身gruntfile grunt-rev给md5 ...
- grunt安装与配置
安装 CLI npm install -g grunt-cli//全局安装 npm init //初始化package.json npm init 命令会创建一个基本的package.json文件 ...
- 前端资源构建-Grunt环境搭建
前端资源构建-Grunt 随着前端开发的复杂度越来越高,前端页面动辄上几十个js,十几个html页面.用户打开一个页面需要加载一堆的css,js,html文件,对于有大量用户的web应用来说,既消耗服 ...
- grunt构建前端自动化
一.grunt是基于nodejs的,所以首先我们需要安装node 二.全局安装grunt 可以参考 http://www.gruntjs.net/docs/getting-started/ 进行安装. ...
- Grunt 自动化部署之css、image、javascript、html压缩Gruntfile.js配置
grunt.initConfig方法 用于模块配置,它接受一个对象作为参数.该对象的成员与使用的同名模块一一对应. 每个目标的具体设置,需要参考该模板的文档.就cssmin来讲,minify目标的参数 ...
随机推荐
- svg学习之旅(1)
Canvas 与 SVG 的比较 下表列出了 canvas 与 SVG 之间的一些不同之处. Canvas 依赖分辨率 不支持事件处理器 弱的文本渲染能力 能够以 .png 或 .jpg 格式保存结果 ...
- js设计模式--迭代器模式
迭代器模式: 迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该方法中的内部表示.js中我们经常会封装一个each函数用来实现迭代器. 理解的意思:提供一个方法,去把对象的每一项按 ...
- 四色GDOI&GDOI2015滚粗记
好吧自己太弱写不了什么四色NOI只能学学别人写个四色GDOI了...首先自己还是太弱所以就被学校卡了个名额就进不了省队了QAQ.自己GDOI觉得考得不错可是NOIP毕竟少了人家5分根本追不上去好不QA ...
- Unity3d的序列帧动画
马上这星期就要过去了,为了完成每星期写一篇博客的目标,熬夜也要写完. 最近项目中用到了很多序列帧动画,之前看教程也接触过序列帧动画,但当时没用到,就没仔细研究,这次就借着这个机会好好总结一下序列帧动画 ...
- index_merge引发的死锁排查
概述 前几天排查了一个死锁问题,最开始百思不得其解,因为发生死锁的两个事务是单语句事务,语句类型相同(where属性列相同,仅值不同),而且语句都走了相同的索引,但最终确实发生了死锁.通过定位排查发现 ...
- 【Zookeeper】源码分析之请求处理链(四)
一.前言 前面分析了SyncReqeustProcessor,接着分析请求处理链中最后的一个处理器FinalRequestProcessor. 二.FinalRequestProcessor源码分析 ...
- WPF 多语言解决方案 - Multilingual App Toolkit
1.首先安装Multilingual App Toolkit 2.新建项目,在VS中点击"工具" -> "Multilingual App Toolkit&qu ...
- 关于 parseInt 的一道有意思的面试题
看完标题,入坑过的同学脑海里很快会浮现出这道经典面试题,没碰到过的同学不妨跟着楼主先来复习一遍 parseInt 的用法(主要参考 MDN). parseInt 是 JavaScript 中的一个全局 ...
- Hibernate框架Criteria查询
本文章适合一些初学者 一.使用Criteria查询数据 1.条件查询 1.1:使用Criteria查询的步骤 1.使用Sess ...
- 2017-3-2 C#链接数据库实现登陆
只是链接一个数据库就有好多的知识:) 实际操作下来,主要是两种登陆方式: 1.Windows的身份验证: 2.Sql Sever的身份验证: 两种的方法不同,但是主要是通过复制创建数据库的字符串来链接 ...