requirejs + vue 項目搭建詳解,requirejsvue

來源:互聯網
上載者:User

requirejs + vue 項目搭建詳解,requirejsvue

以前都是支援 司徒正美 的,畢竟咱們也是跟著 司徒正美 一起走進了前端的世界。所以一般MVVM都是用avalon的,當然也是考慮到項目需要支援IE6,7,8的考慮。當然在用的時候也有一些小坑和bug,都處理了。今年正美正好升級avalon2.0,加入虛擬dom的時候,不穩定了,就考試尋找其他的mvvm架構。

看了比較流行的一些架構,最後選擇了vue。選擇他的原因是 文檔比較全,而且還有中文的(你懂的),生態圈比較好,有vux, vue-loader, vue-router ,組件化設計的也很好。

項目搭建的時候主要還是通過requirejs進行js模組載入(還沒接觸webpack,以前都是avalon+requirejs,習慣性思維了,下面就寫寫心路曆程吧)

方案1,考慮能不能通過寫個 requirejs 外掛程式進行vue組件檔案的載入

失敗,主要是vue組件檔案有template,script,style標籤標籤,主要通過requirejs,讀取vue檔案string檔案進行正則分析在轉換js, 有點捨近求遠的方法,而且這種方式只能同網域名稱ajax請求

方案2,通過編寫gulp外掛程式,將vue檔案轉換為可以通過requirejs載入的js檔案。

這個方案是可行的,只是template,script,style資訊,需要通過正則匹配,在動態載入到當前文檔中,只是有些公用方法頻繁調用。

所以加入了vueComment檔案,把動態加入的方法整理在一起

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], "\\'").replace(reg[1], "\\\n") + "<\/template>');\n";    return "";  }).replace(regStyle, function (t, h) {    appendJs += "\tVue.appendCSS(\n'" + h.replace(reg[0], "\\'").trim().replace(reg[1], "\\\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);}

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援幫客之家。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.