requirejs + vue 项目搭建详解


Posted in Javascript onJune 16, 2017

以前都是支持 司徒正美 的,毕竟咱们也是跟着 司徒正美 一起走进了前端的世界。所以一般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);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
初探jquery——表单应用范例
Feb 20 Javascript
关于JS控制代码暂停的实现方法分享
Oct 11 Javascript
js 获取和设置css3 属性值的实现方法
May 06 Javascript
js 输出内容到新窗口具体实现代码
May 31 Javascript
JavaScript 实现打印,打印预览,打印设置
Dec 30 Javascript
javascript批量修改文件编码格式的方法
Jan 27 Javascript
jQuery及JS实现循环中暂停的方法
Feb 02 Javascript
AngularJS ng-bind-template 指令详解
Jul 30 Javascript
JS实现页面打印功能
Mar 16 Javascript
微信小程序获取用户openId的实现方法
May 23 Javascript
jQuery实现简单弹幕效果
Nov 28 jQuery
Vue 中使用lodash对事件进行防抖和节流操作
Jul 26 Javascript
jQuery 控制文本框自动缩小字体填充
Jun 16 #jQuery
jQuery序列化后的表单值转换成Json
Jun 16 #jQuery
详解探索 vuex 2.0 以及使用 vuejs 2.0 + vuex 2.0 构建记事本应用
Jun 16 #Javascript
基于AngularJS实现的工资计算器实例
Jun 16 #Javascript
Angular+Node生成随机数的方法
Jun 16 #Javascript
JS利用正则表达式实现简单的密码强弱判断实例
Jun 16 #Javascript
vue高德地图之玩转周边
Jun 16 #Javascript
You might like
CURL状态码列表(详细)
2013/06/27 PHP
PHP简单实现无限级分类的方法
2016/05/13 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
2017/11/17 PHP
PHP判断是否微信访问的方法示例
2019/03/27 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
Ext javascript建立超链接,进行事件处理的实现方法
2009/03/22 Javascript
JQuery 引发两次$(document.ready)事件
2010/01/15 Javascript
JavaScript isPrototypeOf和hasOwnProperty使用区别
2010/03/04 Javascript
jquery弹出关闭遮罩层实例
2013/08/06 Javascript
JS控制输入框内字符串长度
2014/05/21 Javascript
javascript将数字转换整数金额大写的方法
2015/01/27 Javascript
JavaScript使用DeviceOne开发实战(一) 配置和起步
2015/12/01 Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
2016/08/16 Javascript
JS 插件dropload下拉刷新、上拉加载使用小结
2017/04/13 Javascript
详解Node中导入模块require和import的区别
2017/08/11 Javascript
Vue的实例、生命周期与Vue脚手架(vue-cli)实例详解
2017/12/27 Javascript
node结合swig渲染摸板的方法
2018/04/11 Javascript
Node.js EventEmmitter事件监听器用法实例分析
2019/01/07 Javascript
Vue路由管理器Vue-router的使用方法详解
2020/02/05 Javascript
Vue记住滚动条和实现下拉加载的完美方法
2020/07/31 Javascript
[55:47]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第三局
2016/02/27 DOTA
[03:16]DOTA2完美大师赛小组赛精彩集锦
2017/11/22 DOTA
Python进阶篇之字典操作总结
2016/11/16 Python
Python爬虫之UserAgent的使用实例
2019/02/21 Python
Pyecharts 中Geo函数常用参数的用法说明
2021/02/01 Python
Mytheresa美国官网:德国知名的女性奢侈品电商
2017/05/27 全球购物
英国领先的露营和露营车品牌之一:OLPRO
2019/08/06 全球购物
微软巴西官方网站:Microsoft Brasil
2019/09/26 全球购物
转预备党员政审材料
2014/02/06 职场文书
讲文明树新风演讲稿
2014/05/12 职场文书
艺术设计专业毕业生推荐信
2014/07/08 职场文书
乡镇机关党员民主评议表自我评价
2014/09/21 职场文书
2014乡镇领导班子四风对照检查材料思想汇报
2014/10/05 职场文书
自查自纠整改报告
2014/11/06 职场文书
MySQL表类型 存储引擎 的选择
2021/11/11 MySQL
redis数据一致性的实现示例
2022/03/18 Redis