nodejs iconfont处理
做前端优化,iconfont可以替换掉很多图片,减少请求,并有很好的兼容性,颜色大小也有很好的自由度。现在网上已经有很多公开的iconfont供我们使用。但是每个项目有不同的应用场景,网上的并不能满足所有的需求。设计在出ps的有很多svg的图标。
在线的矢量图标库,我们熟知的,http://www.iconfont.cn/,国内功能很强大且图标内容很丰富的矢量图标库。
可是我们自己做项目,每次都要上传iconfont,再下载最新的,要操作好多。表示本人是个懒人,操作了几遍就感觉生命在浪费。
最近在整理,nodejs gulp相关的插件,编写符合业务活动开发的gulp脚本,加快开发,并且前端优化。
所以就想着nodejs有没网络字体处理
font-carrier https://github.com/purplebamboo/font-carrier
用起来很简单,首先定义好适合项目的文件目录格式

//api参数说明
icon({
isWatch: true, //是否启动watch,监控更改
template: __dirname + "/_fonts_demo.tmpl", //产生的预览html模版
path: './qnk/font', //项目的font目录
fontName: 'iconfont', //字体文字
beginNum: 0xe001 //字体开始的最小值
}) //基于 模块chokidar 进行文件监控 path+'/*.svg'文件
//在svg文件新增,修改,删除的,会调用font.setSvg,更新字体信息,并更新对应的json配置,用于下次的恢复svg与unicode关系
//会实时生成 {fontName}.html 进行字体效果预览,该文件通过template生成,使用的模版语言是handlebars
下面看主要代码,现在的代码没有封装模块,主要是功能还有些欠缺
现在的功能是实时发布 矢量图标库,开发的时候,还是需要通过查看{fontName}.html,进行html编写
后期进一步结合项目情况,生成项目可以用的html模版,iconfont配置变量,在html的时候只需要根据svg文件名,编写,如{{我的红包}}
var fontCarrier = require('font-carrier')
var chokidar = require('chokidar');
var sysPath = require('path');
var Handlebars = require('handlebars');
var fs = require('fs');
var glob = require('glob')
//makeWatch ready前会有add响应,所以增加参数进行屏蔽
var makeWatch = function (flies, done) {
var files = [];
var _isdone = -1;
var watcher = chokidar.watch(flies, {
ignored: /[\/\\]\./,
persistent: true
});
watcher.on('add', path => {
if (_isdone == -1) {
files.push(path);
} else if (_isdone == 1) {
done('add', path);
}
}).on('change', path => {
if (_isdone == 1) {
done('change', path);
}
}).on('unlink', path => {
if (_isdone == 1) {
done('remove', path);
}
}).on('ready', function() {
_isdone = 1;
done('ready', files);
})
return watcher;
};
//defaults默认数值
var defaults = {
beginNum: 0xe001,
template: '<style>@font-face {font-family: "{{fontName}}";src: url("{{fontName}}.eot?t={{now}}"); src: url("{{fontName}}.eot?t={{now}}#iefix") format("embedded-opentype"),url("{{fontName}}.woff?t={{now}}") format("woff"),url("{{fontName}}.ttf?t={{now}}") format("truetype"),url("{{fontName}}.svg?t={{now}}#{{fontName}}") format("svg");}/n\
.{{fontName}} {font-family:"{{fontName}}" !important;font-size:16px;font-style:normal;-webkit-font-smoothing: antialiased;-webkit-text-stroke-width: 0.2px;-moz-osx-font-smoothing: grayscale;\}</style>/n\
<ul class="icon_lists clear">{{#each data}}<li><i class="icon {{../fontName}}">&#x{{val}};</i><div class="name">{{name}}</div><div class="code">&#x{{val}};</div></li>{{/each}}</ul>',
fontName: 'iconfont'
};
//通过现有的json配置 和 文件夹实际的svg目录,进行数据修正,获取正确的beginNum
var getExistsFontMap = function (map, dirPath, beginNum) {
var files = glob.sync(dirPath + '/*.svg');
var fileMap = {};
var res = {};
files.forEach(function (f) {
fileMap[sysPath.basename(f, '.svg')] = f;
})
for (var key in map) {
if (!fileMap[key])
delete map[key];
}
var _bNum;
for (var key in map) {
_bNum = map[key];
break;
}
_bNum = _bNum || beginNum;
for (var key in map) {
if (map[key] >= _bNum) {
_bNum = map[key] + 1;
}
}
for (var key in fileMap) {
res[key] = map[key] || _bNum++;
}
return {
fontMap: res,
beginNum: _bNum
}
}
//模块主方法
var icon = function (opts) {
var font = fontCarrier.create();//创建字体
var bNum = opts.beginNum || defaults.beginNum;
var template;
var fontMap = {};
if (opts.template) {
template = Handlebars.compile(fs.readFileSync(opts.template).toString());
} else {
template = Handlebars.compile(defaults.template);
}
var path = opts.path;
if (!path) {
throw new Error('must set path option.')
}
var fontPath = path;
var fontName = opts.fontName || defaults.fontName;
var dirPath = fontPath + '/svg';
var jsonPath = dirPath + '/' + fontName + '.json';
//字体信息保存
var save = function (action) {
//字体保存
font.output({
path: fontPath + '/' + fontName
})
//配置保存
fs.writeFileSync(jsonPath, JSON.stringify(fontMap));
var tab = [];
for (var key in fontMap) {
tab.push({name: key, val: fontMap[key].toString(16)})
}
//预览文件保存
fs.writeFile(fontPath + '/' + fontName + '.html', template({data: tab, fontName: fontName, now: +new Date}), (err) => {
if (err) throw err;
});
};
var setSvg = function (flie, key) {
fs.readFile(flie, (err, data) => {
if (err) {
throw err;
}
font.setSvg('&#x' + key.toString(16) + ';', data.toString());
save();
});
};
var fileExists = fs.existsSync(jsonPath);
var map = {};
if (fileExists) {
map = JSON.parse(fs.readFileSync(jsonPath).toString());
}
var res = getExistsFontMap(map, dirPath, bNum);
fontMap = res.fontMap;
bNum = res.beginNum;
for (var fileName in fontMap) {
font.setSvg('&#x' + fontMap[fileName].toString(16) + ';', fs.readFileSync(dirPath + '/' + fileName + '.svg').toString());
}
save();
//watch 文件修改逻辑
if (opts.isWatch) {
return makeWatch(dirPath + '/*.svg', function (action, flie) {
if (action == 'ready') {
} else if (action == 'change' || action == 'add') {
var fileName = sysPath.basename(flie, '.svg');
var n = fontMap[fileName] = fontMap[fileName] || bNum++;
//**文件存在busy状态,延时1秒读取文件,不能解决根本问题
setTimeout(function () {
setSvg(flie, n);
}, 1000);
} else if (action == 'remove') {
var fileName = sysPath.basename(flie, '.svg');
font.setSvg('&#x' + fontMap[fileName].toString(16) + ';', '');
delete fontMap[fileName];
save(action);
}
})
}
};
icon({
isWatch: true,
template: __dirname + "/_fonts_demo.tmpl",
path: './v3-mobile-snail-com/qnk/font'
})
nodejs iconfont处理的更多相关文章
- 微信小程序使用彩色图标(阿里巴巴 iconfont Symbol 的用法)微信小程序使用彩色图标(阿里巴巴 iconfont Symbol 的用法)
前提 需要安装好 nodejs (略) 用于下载插件 安装插件 npm install mini-program-iconfont-cli --save-dev 初始化配置文件 npx iconfon ...
- NodeJs之OS
OS Node.js提供了一些基本的底层操作系统的模块OS. API var os = require('os'); console.log('[arch] 操作系统CPU架构'+os.arch()) ...
- NodeJs之Path
Path模块 NodeJs提供的Path模块,使得我们可以对文件路径进行简单的操作. API var path = require('path'); var path_str = '\\Users\\ ...
- NodeJs之调试
关于调试 当我们只专注于前端的时候,我们习惯性F12,这会给我们带来安全与舒心的感觉. 但是当我们使用NodeJs来开发后台的时候,我想噩梦来了. 但是也别泰国担心,NodeJs的调试是很不方便!这是 ...
- NodeJs在Linux下使用的各种问题
环境:ubuntu16.04 ubuntu中安装NodeJs 通过apt-get命令安装后发现只能使用nodejs,而没有node命令 如果想避免这种情况请看下面连接的这种安装方式: 拓展见:Linu ...
- NodeJs之child_process
一.child_process child_process是NodeJs的重要模块.帮助我们创建多进程任务,更好的利用了计算机的多核性能. 当然也支持线程间的通信. 二.child_process的几 ...
- nodejs进阶(6)—连接MySQL数据库
1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...
- 图片访问实时处理的实现(nodejs和php)
我在访问时光网.网易云音乐等网站时,发现将它们页面中的一些图片URL修改一下就可以得到不同尺寸的图片,于是思考了其实现方案,我的思路是:URL Rewrite + 实时处理 + 缓存,对用户请求的UR ...
- nodejs进阶(4)—读取图片到页面
我们先实现从指定路径读取图片然后输出到页面的功能. 先准备一张图片imgs/dog.jpg. file.js里面继续添加readImg方法,在这里注意读写的时候都需要声明'binary'.(file. ...
随机推荐
- [置顶] highcharts封装使用总结
Highcharts 是一个用纯JavaScript编写的一个图表库, 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表,并且免费提供给个人学习.个人网站和非商业用途使用.目前High ...
- 【转载】solr教程,值得刚接触搜索开发人员一看
转载:http://blog.csdn.net/awj3584/article/details/16963525 Solr调研总结 开发类型 全文检索相关开发 Solr版本 4.2 文件内容 本文介绍 ...
- 新手必看的jQuery优化笔记十则
jQuery优化 1.简介 jQuery正在成为Web开发人员首选的JavaScript库,作为Web开发者,除了要了解语言和框架的应用技巧外,如何提升语言本身的性能也是开发人员应该思考的问题.文章就 ...
- STL中vector,Map,Set的实现原理
vector的数据安排以及操作方式,与array非常类似,两者唯一的区别是空间运用的灵活性,array是静态空间,一旦配置了就不能改变,如果你想要大一点的空间,就必须首先配置一块新空间,然后将原来的元 ...
- soap和http(转)
http:是一个客户端和服务器端请求和应答的标准(TCP).http协议其目的是为了提供一种发布和接收http页面的方法 一 http协议的客户端与服务器的交互:由HTTP客户端发起一个请求,建立一个 ...
- Linux系统编程(16)——正则表达式入门
字符是计算机软件处理文字时最基本的单位,可能是字母,数字,标点符号,空格,换行符,汉字等等.字符串是0个或更多个字符的序列.文本也就是文字,字符串.说某个字符串匹配某个正则表达式,通常是指这个字符串里 ...
- javax.Swing 使用GridBagLayout的程序栗子
摘自https://zhidao.baidu.com/question/110748776.html javax.Swing 使用GridBagLayout的程序栗子 总共两个文件,第一个是启动文件, ...
- 微信iOS WKWebview 网页开发适配指南
微信iOS客户端将于2017年3月1日前逐步升级为WKWebview内核,需要网页开发者提前做好网站的兼容检查和适配. 背景 WKWebView 是苹果在iOS 8中引入的新组件,目的是提供一个现代的 ...
- 【转】HDMI控制与组态剖析
HDMI能够称霸为王者之尊吗?目前消费者陷入的困境就是Audio/Video的连接线数量过度庞大,而HDMI最大卖点之一就是可使用单一的连接线完全取代众多的影音连接线,简洁又方便.缺点是技术版本变动太 ...
- ZOJ Monthly, June 2014 月赛BCDEFGH题题解
比赛链接:点击打开链接 上来先搞了f.c,,然后发现状态不正确,一下午都是脑洞大开,, 无脑wa,无脑ce...一样的错犯2次.. 硬着头皮搞了几发,最后20分钟码了一下G,不知道为什么把1直接当成不 ...