一个简单的 grunt 插件, 作用是 把 css 文件中的  /images/  替换成指定的  url path, 以实现 图片 cdn 路劲改造

插件项目文件结构

grunt-contrib-staticpath
|--tasks
|----staticpath.js
|--package.json

package.json

{
"name": "grunt-contrib-staticpath",
"version": "1.0.2",
"description": "A grunt plugin to help front engineer replacing public static path of css.",
"main": "tasks/staticpath.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git@192.168.1.22:node/grunt-contrib-staticpath.git"
},
"keywords": [
"grunt-contrib-staticpath"
],
"author": "ecalf",
"license": "ISC"
}
staticpath.js
var
path = require('path'); module.exports = function (grunt) {
"use strict"; grunt.registerMultiTask('publicPath', 'Replace publicPath of image and update the CSS file.', function () {
var done = this.async(); var options = this.options({
imagepath:"/images/",
imagepathPublic:"//node-img.b0.upaiyun.com/wmzy-pc/images/"
}); //console.log("options>>>",options);
//console.log("this.files>>>",this.files) function replaceCSSImagesPath(cssData){
var oldPath = options.imagepath;
var newPath = options.imagepathPublic; var reg = new RegExp('url\\(\\s*([\\\'\\\"])?'+oldPath,'gi');
//console.log("todo reg:",reg)
cssData = cssData.replace(reg,'url($1'+newPath);
//console.log("done cssData.replace");
//console.log('indexOf ',newPath,': ',cssData.indexOf(newPath));
return cssData
} function donePathReplace(cssData, destCSS){
grunt.file.write(destCSS, cssData);
grunt.log.writelns(('Done! [Replace publicPath of image, Created] -> ' + destCSS));
} function staticPathIterator(file, callback){
var src = file.src[0];
var fileName = path.basename(src, '.css'); var destCSS = file.dest;
var cssData = grunt.file.read(src);
var newCssData = replaceCSSImagesPath(cssData); donePathReplace(newCssData, destCSS);
callback(null);
} grunt.util.async.forEachSeries(this.files, staticPathIterator, function(success){
done(success);
});
});
};

使用时在 Gruntfile.js 中的配置

publicPath:{
options:{
imagepath:"/images/",
imagepathPublic:"//node-img.b0.upaiyun.com/wmzy-pc/images/"
},
autoPublicPath:{
files: [
{
expand: true,
cwd: "public/src/css/",
src: "**/*.css",
dest: "public/src/css/"
}
]
} },

用法:

grunt.loadNpmTasks('grunt-contrib-staticpath');

//test task
grunt.registerTask('test',["publicPath"]);

grunt 插件的更多相关文章

  1. 快速开发Grunt插件----压缩js模板

    前言 Grunt是一款前端构建工具,帮助我们自动化搭建前端工程.它可以实现自动对js.css.html文件的合并.压缩等一些列操作.Grunt有很多插件,每一款插件实现某个功能,你可以通过npm命名去 ...

  2. node.js安装及grunt插件,如何进行脚本压缩

    http://gruntjs.com/pluginshttp://gruntjs.com/getting-startedhttp://gruntjs.com/configuring-tasks#glo ...

  3. Grunt 插件使用汇总

    最近使用了很多 Grunt 插件,这里把使用 Grunt 中涉及的从开发.代码检查.单元测试.E2E 测试,直到发布所涉及的插件,做一个比较完全的汇总. 环境搭建 1. 创建 Web 前端开发环境 2 ...

  4. 如何开发 Grunt 插件

    创建 grunt 插件 准备工作:(node/npm/git 安装,在此不做赘述) yeoman generator 可以自动生成一个插件模板. 安装 yo npm install -g yo 安装 ...

  5. 详解Grunt插件之LiveReload实现页面自动刷新(两种方案)

    http://www.jb51.net/article/70415.htm    含Grunt系列教程 这篇文章主要通过两种方案详解Grunt插件之LiveReload实现页面自动刷新,需要的朋友可以 ...

  6. chrome下的Grunt插件断点调试——基于node-inspector

    之前调试grunt插件时,都是通过人肉打log来调试.不仅效率低,而且会产生一堆无用的代码.于是简单google了下node断点调试的方法,总结了下. 借助node-inspector,我们可以通过C ...

  7. [转载]Grunt插件之LiveReload 实现页面自动刷新,所见即所得编辑

    配置文件下载  http://vdisk.weibo.com/s/DOlfks4wpIj LiveReload安装前的准备工作: 安装Node.js和Grunt,如果第一次接触,可以参考:Window ...

  8. 使用Grunt 插件打包Electron Windows应用

    最近利用Electron来创建跨桌面应用的趋势似乎很火.看了几个用Electron开发的应用,这些应用在windows下面的安装方式,都是类似一个绿色软件的安装方法,下载.zip->解压到相应目 ...

  9. grunt插件[font-spider] : 转码,压缩字体 @font-face

    字蛛插件:压缩与转码静态页面中的 WebFont 需要注意的是,目前只支持 grunt@0.4.1 package.json { "name": "fontS" ...

随机推荐

  1. Zypper常用命令

    Zypper是OpenSUSE和企业版SUSE中软件包管理器ZYpp的命令行接口. 主要用于:1.管理软件包:zypper可用来安装.删除.更新和查询本地或远程的软件包.2.管理仓库:zypper可用 ...

  2. 洛谷P4774 [NOI2018]屠龙勇士 [扩欧,中国剩余定理]

    传送门 思路 首先可以发现打每条龙的攻击值显然是可以提前算出来的,拿multiset模拟一下即可. 一般情况 可以搞出这么一些式子: \[ atk_i\times x=a_i(\text{mod}\ ...

  3. P3966 [TJOI2013]单词

    P3966 [TJOI2013]单词 题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次. 输入输出 ...

  4. 《剑指offer》数字在排序数组中出现的次数

    本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:

  5. 一个spring mvc 需要用到到文件

    一. 类 org.springframework.stereotype.Controller; org.springframework.web.bind.annotation.RequestMappi ...

  6. Django—常用功能

    索引 一.静态文件 二.中间件 三.Admin站点 3.1 列表页选项 3.2 编辑页选项 3.3 重写模板 四.上传图片 4.1 在管理页面admin中上传图片 4.2 自定义form表单中上传图片 ...

  7. python_urllib2:urlerror和httperror

    urllib2的异常错误处理 在我们用urlopen或opener.open方法发出一个请求时,如果urlopen或opener.open不能处理这个response,就产生错误. 这里主要说的是UR ...

  8. 2018-2019-2 20165206 网络攻防技术 Exp5 MSF基础应用

    - 2018-2019-2 20165206<网络攻防技术>Exp5 MSF基础应用 - 实验任务 1.1一个主动攻击实践,如ms08_067; (1分) 1.2 一个针对浏览器的攻击,如 ...

  9. kafka单节点的安装,部署,使用

    1.kafka官网:http://kafka.apache.org/downloads jdk:https://www.oracle.com/technetwork/java/javase/downl ...

  10. mysql 服务器负载过高的解决分析之路

    最近我们有台 mysql 服务器一直报负载过高,不停的收到阿里云的报警短信,让我很抓狂,登陆上服务器,看下一下,慢查询日志 发现有60多万的慢查询日志,一看这个就知道是搜索带来的,一直想把搜索的服务给 ...