鑑於本身的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給的思路.正則表達式