送干货,实用内联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处理时将其移除 -->
 data-src="./b.js" 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了 入门吧!

 

周末愉快,共勉~!

donate

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: 首先在编辑器里面插入javascript代码: 确定后会在编辑器插入这样的代码: <pre
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代码高亮,因为SyntaxHighlighter的应用非常广泛,所以将kindeditor默认的prettify替换为SyntaxHighlighter代码高亮插件 上一篇“让kindeditor显示高亮代码”中已经
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)
原生JS实现别踩白块小游戏(一)