鉴于本身的APP有个离线模式,因此在使用iconfont的时候不得不将字体文件保存到本地,经过离线的方式加载,因此有了如下的文章.html
local://
'为前缀 ;/
'在android下若是加载的是字体对应的就是assets
目录,若果加载的图片就从drawable
目录, 因此iconfont.ttf放置在src/assets
目录下的话,字体的url加载方式应该为('local:///iconfont.ttf')
bundle resources
下.(加载方法未测试)道理我都懂,可仍然过很差这一辈子 Talk is cheap.
/** * 初始化加载iconfont字体 * * @type {{initIconfont: (function())}} */ let iconfontUtils = { initIconfont() { let dom = weex.requireModule('dom'); //经过获取platform判断加载字体文件的路径,(待完善,在手机的playground中,是没法加载本地文件的) let platform = weex.config.env.platform.toLowerCase(); let url; if ( "android" == platform) { //本地资源采用'local:// '的方式加载 //第三个斜杠是表明当前目录,对于android来讲,若是加载的是字体,那么就是assets目录,同理`/iconfont.ttf'`就是加载`assets`目录下的iconfont.ttf文件 url = "url('local:///font/iconfont.ttf')";//注意我这里是将字体文件放在'assets/font/''目录下的,因此 } else if ("ios" == platform) { //todo 理论上同android未测试 url = "url('local:///font/iconfont.ttf')"; } else { url = "url('http://at.alicdn.com/t/xxxxxxx.ttf')" } dom.addRule('fontFace', { 'fontFamily': "iconfont", 'src': url }); } } export default iconfontUtils;
加载本地的字体库的话,静态写死在<text>元素下,如<text class='iconfont'><text>,这样正常,可是若是经过Mustache进行数据绑定{{font}}(这里的font='')时,页面中显示是错误的.android
参考hayvane在Weex关于字体图标的bug的回答ios
在template中 text写死 时,weex-template-compiler在编译阶段使用了he进行decode,而在template中Mustache进行数据绑定fontName(fontName:"")时不会进行decode.git
var he = require('he'); getFontName: function() { return he.decode(this.fontName) }
he
致使打包体积过大经过正则表达式将iconfont的字符取出替换,用String.fromCharCode()方法处理github
decode(text) { // 正则匹配 图标和文字混排 eg: 我去上学校,每天不迟到 let regExp = /&#x[a-z]\d{3,4};?/; if (regExp.test(text)) { return text.replace(new RegExp(regExp, 'g'), function (iconText) { let replace = iconText.replace(/&#x/, '0x').replace(/;$/, ''); return String.fromCharCode(replace); }); } else { return text; } }
方案二感谢hizhengfu给的思路.正则表达式