以前都是支持 司徒正美 的,畢竟咱們也是跟著 司徒正美 一起走進(jìn)了前端的世界。所以一般MVVM都是用avalon的,當(dāng)然也是考慮到項目需要支持IE6,7,8的考慮。當(dāng)然在用的時候也有一些小坑和bug,都處理了。今年正美正好升級avalon2.0,加入虛擬dom的時候,不穩(wěn)定了,就考試尋找其他的mvvm框架。
看了比較流行的一些框架,最后選擇了vue。選擇他的原因是 文檔比較全,而且還有中文的(你懂的),生態(tài)圈比較好,有vux, vue-loader, vue-router ,組件化設(shè)計的也很好。
項目搭建的時候主要還是通過requirejs進(jìn)行js模塊加載(還沒接觸webpack,以前都是avalon+requirejs,習(xí)慣性思維了,下面就寫寫心路歷程吧)
方案1,考慮能不能通過寫個 requirejs 插件進(jìn)行vue組件文件的加載
失敗,主要是vue組件文件有template,script,style標(biāo)簽標(biāo)簽,主要通過requirejs,讀取vue文件string文件進(jìn)行正則分析在轉(zhuǎn)換js, 有點舍近求遠(yuǎn)的方法,而且這種方式只能同域名ajax請求
方案2,通過編寫gulp插件,將vue文件轉(zhuǎn)換為可以通過requirejs加載的js文件。
這個方案是可行的,只是template,script,style信息,需要通過正則匹配,在動態(tài)載入到當(dāng)前文檔中,只是有些公用方法頻繁調(diào)用。
所以加入了vueComment文件,把動態(tài)加入的方法整理在一起
define(['Vue'], function (Vue) { Vue.appendHTML = function (text) { document.body.insertAdjacentHTML('beforeEnd', text); }; var style; var doc = document; Vue.appendCSS = function (text) { text = text + " "; if (!style) { var head = doc.getElementsByTagName("head")[0]; var elms = head.getElementsByTagName("style"); if (elms.length == 0) { if (doc.createStyleSheet) { doc.createStyleSheet(); } else { var tmp = doc.createElement('style'); tmp.setAttribute("type", "text/css"); head.appendChild(tmp); } elms[0].setAttribute("media", "screen"); } style = elms[0]; } if (style.styleSheet) { style.styleSheet.cssText += text; } else if(doc.getBoxObjectFor) { style.innerHTML += text; } else { style.appendChild(doc.createTextNode(text)) } }; });
gulp-vue nodejs主要代碼如下,通過文件名,來確定組件名字
var through = require('through2');var gutil = require('gulp-util');var regTpl = /<template>([/s/S]+?)<//template>/;var regStyle = /<style>([/s/S]+?)<//style>/; var regJs = /<script>([/s/S]+?)<//script>/; var reg = [/'/g, //n/g, /([^//]+)/.vue$/];var vueWrite = function (file, str) { var match = file.path.match(reg[2]); var id = "vue-tpl-" + match[1]; var appendJs = ""; var res = ""; str = str.replace(regTpl, function (t, h) { appendJs += "/tVue.appendHTML(/n'<template id=/"" + id + "/">" + h.replace(reg[0], "http://'").replace(reg[1], "http:///n") + "<//template>');/n"; return ""; }).replace(regStyle, function (t, h) { appendJs += "/tVue.appendCSS(/n'" + h.replace(reg[0], "http://'").trim().replace(reg[1], "http:///n") + "');/n" return ""; }).replace(regJs, function (t, h) { res = "define(function (require) {/n/trequire('VueCommon'); /n/tvar Vue = require('Vue');/n/tvar exports;/n" + appendJs + h + ";/n/texports.template = '#" + id + "';/n/texports = Vue.extend(exports);/n/tVue.component('" + match[1] + "', exports);/n/treturn exports;/n});" return ; }) return res;};module.exports = function(opt){ function run (file, encoding, callback) { if (file.isNull()) { return callback(null, file); } if (file.isStream()) { return callback(new gutil.PluginError('gulp-vue', 'doesn/'t support Streams')); } file.contents = new Buffer(vueWrite(file, file.contents.toString())); file.path = file.path + '.js'; callback(null, file); } return through.obj(run);}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。
|
新聞熱點
疑難解答