送干货,实用内联gulp插件——gulp-embed
现在npm上有很多gulp内联工具,用于把脚本和样式内嵌到HTML页面上,之前搞项目我也在这些插件中寻觅许久,但均不满足公司项目的一个需求—— HTML上同时插入了开发(dev版,src文件夹下,比如 src/index.html)和gulp处理后(build版,dest文件夹下,比如 dest/index.html)的两种版本的脚本,要求运行src文件夹下的该页面时,能忽略掉引入的build版的脚本(比如src/a.js);而在运行dest文件夹下的该页面时,能忽略的引入的dev版的脚本(比如dest/b.js)。
事实上解决该问题的方案挺简单,比如往 src/index.html 插入这段代码:
<script type="text/javascript" src="./a.js" data-embed="disable"></script> <!-- gulp处理时将其移除 -->
<script type="text/javascript" data-src="./b.js" data-embed></script> <!-- gulp处理时将其内联到页面 -->
在我们运行 src/index.html 时,由于第二行<script> 中是以 data-src 而非 src 的形式来引用脚本,故它是不会被执行处理的。
然后我们需要有一款工具,在gulp构建时,把页面上带有 data-embed="disable" 属性的,比如第一条<script>,将其从构建后的html页面(dest/index.html)上移除掉,另将带有 data-embed 属性的,比如第二条<script>上的 data-src 更变为 src,并将对应脚本内嵌到页面上。
这样一来 src/index.html 就只会执行 src/a.js,而 dest/index.html 就只会执行 dest/b.js(且内嵌到页面上了)。

找不到适宜的轮子当然只能自行造轮子了,基于 resource-embedder 我折腾了这款 gulp-embed ,除了支持 resource-embedder 默认的参数(建议去github看,这里不赘述),相比其它内联插件还支持我上述的解决方案(不止脚本,样式也支持),另外还支持远程文件(下载成功后内联到页面)。
安装方法
自然是常规的npm安装形式:
npm install --save-dev gulp-embed
使用示例
gulpfile配置:
gulp.task('embed', function () {
gulp.src('./src/*.html')
.pipe(embed())
.pipe(gulp.dest('./dest/'));
});
html页面:
<!doctype html>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title>demo</title>
<link rel="stylesheet" href="css/a.css" data-embed /> <!-- 构建后会内联到页面上 -->
<link rel="stylesheet" href="css/b.css" data-embed="false" /> <!-- 构建后不会内联到页面上 -->
</head>
<body>
<div id="container"></div>
<textarea id="debug" cols="100" rows="30"></textarea>
<script type="text/javascript" data-src="./js/a.js" data-embed></script> <!-- 构建后会内联到页面上,即使使用了data-src属性 -->
<script type="text/javascript" src="./js/b.js" data-embed="disable"></script><!-- 构建后会从页面上移除 -->
</body>
</html>
基本上都是依靠 data-embed 属性来灵活控制文件最终的内嵌、去留与否,感觉还是蛮方便的。

为什么要内嵌文件到页面?
我在 浅谈WEB页面提速 一文中其实有提过,将小块的、复用不高的css、js代码段直接写在页面上有助于减少冗余请求,事实上在走Gzip的情况下(比如移动端),大部分的脚本和样式都可以直接内联到页面上来减少首屏时间(Gzip压缩率还是很高的)。
为什么要按开发模式和构建模式引入两种脚本?
项目需求!项目需求!项目需求!重要的事情说三遍,每个项目都会有一些你可能没意料过的小需求,如我司项目构建时要下载一些变动较高的远程文件再打包处理,如果开发模式直接引入一些可临时替代的文件,可以在构建前就直接在dev文件上做调试和定位问题,有助于提升开发效率。
另外现在很多内嵌插件都不支持远程脚本/样式的下载,如果你有这方面的需求,也可以使用 gulp-embed 哦~
什么?你还不知道gulp是啥?
快看下我的老文章 是时候搁置Grunt,耍一耍gulp了 入门吧!
周末愉快,共勉~!

送干货,实用内联gulp插件——gulp-embed的更多相关文章
- 利用gulp 插件gulp.spritesmith 完成小图合成精灵图,并自动输出样式文件
安装依赖 yarn add gulp yarn add gulp.spritesmith 本次依赖的版本是: "gulp": "^3.9.1" "gu ...
- gulp插件(gulp-jmbuild),用于WEB前端构建
源码地址:https://github.com/jiamao/gulp-jmbuild https://github.com/jiamao/gulp-jmbuild gulp-jmbuild gulp ...
- gulp 插件
原文链接:http://www.mamicode.com/info-detail-517085.html gulp是什么? http://gulpjs.com/ 相信你会明白的! 与著名的构建工具gr ...
- gulp插件gulp-usemin简单使用
关于什么是gulp,它和grunt有什么区别等问题,这里不做任何介绍.本文主要介绍如何使用gulp-usemin这款插件,同时也会简单介绍本文中用到的一些插件. 什么是gulp-usemin 用来将H ...
- 将less编译成css的gulp插件
简介:gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成:使用她,我们不仅可以很愉快的编写代码, ...
- Gulp插件笔记
初次接触Gulp是出于网页模块化的需要,用过之后发现这个任务管理工具有很多实用的插件,意外地好用,于是打算写下这篇笔记把用到的Gulp插件记录一下.至于想了解Gulp基本用法的同学可以去Gulp官网查 ...
- 常用 Gulp 插件汇总 —— 基于 Gulp 的前端集成解决方案(三)
前两篇文章讨论了 Gulp 的安装部署及基本概念,借助于 Gulp 强大的 插件生态 可以完成很多常见的和不常见的任务.本文主要汇总常用的 Gulp 插件及其基本使用,需要读者对 Gulp 有一个基本 ...
- gulp插件gulp-ruby-sass和livereload插件
gulp-ruby-sass是gulp的一个插件,主要是用来实现sass编译,livereload插件主要是实现文件保存时浏览器自动刷新,避免了手动f5的频繁的操作 准备工作:chrome浏览器安装l ...
- gulp插件autoprefixer
gulp的autoprefixer插件可以根据我们的设置帮助我们自动补全浏览器的前缀(如:-moz.-ms.-webkit.-o) 1)首先安装gulp,不知道怎么安装请看这里 2)安装autopre ...
随机推荐
- ***git自动化部署总结
在网上搜了一堆没用找到太仔细的教程,于是花费2天时间,自己研究了下.现在分享如下: 思路:利用crontab定时去去执行git pull脚本 首先,用git clone命令将中央库的代码下载到阿里云 ...
- JAVA基础(一)
1.Java class中的static修饰的成员表面其属于该类所共有,而不是属于某个实例.static修饰的成员不能直接调用非static修饰的成员. 2.Java构造器不能定义返回类型,也不能使用 ...
- postgresql数据库
新建一个虚拟机,在本地跑程序,连虚拟机数据库报错: no pg_hba.conf entry for host "192.168.1.4" Google下,发现是要修改postgr ...
- SSH框架整合(全注解)
全部jar包 目录结构 配置案例 package cn.yzu.Tbook.action; import javax.annotation.Resource; import org.apach ...
- MySLQ 为数据库远程授权的方法与问题的解决解决方法
Mysql通过远程的连接工具连接,提示Can't connect to MySQL server (10060). 这个时候我们需要分析,看哪里设置不当而导致的该问题. 工具/原料 mysql数 ...
- EditText键盘弹出时,会将布局底部的导航条顶上去(解决方法之一)
这只是其中一种方法android:windowSoftInputMode有很多属性可以添加,必须是一个state...|ajust... 我只是觉得这种比较好用 在项目的AndroidManifest ...
- 用SqlBulkCopy批量安插数据时提示来自数据源的 String 类型的给定值不能转换为指定目标列的类型 int
dr["description"] = ds.Tables[0].Rows[i]["组织描述"].ToString(); dr[& ...
- [转]ORACLE中Like与Instr模糊查询性能大比拼
instr(title,'手册')>0 相当于 title like '%手册%' instr(title,'手册')=1 相当于 title like '手册%' instr(titl ...
- 【SAP BO】无法识别账户信息:无法访问CMS。计算机上的CMS由于某个严重错误而停止。(FWM 20031)
1.系统环境 OS:Windows Server 2008 R2 RDBMS:Oracle 11g R2(Server.Client同时存在) BI:SAP Business Objects 4.2 ...
- [BZOJ1997][HNOI2010] 平面图判定
Description Input Output 是的..BZOJ样例都没给. 题解(from 出题人): 如果只考虑简单的平面图判定,这个问题是非常不好做的. 但是题目中有一个条件— ...