requirejs + vue 項目搭建

來源:互聯網
上載者:User

標籤:

以前都是支援 司徒正美 的,畢竟咱們也是跟著 司徒正美 一起走進了前端的世界。所以一般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);}

 

requirejs + vue 項目搭建

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.