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 相关文章推荐
javascript之对系统的toFixed()方法的修正
May 08 Javascript
javascript中IE浏览器不支持NEW DATE()带参数的解决方法
Mar 01 Javascript
JS分页控件 可用于无刷新分页
Jul 23 Javascript
jquery实现定时自动轮播特效
Dec 10 Javascript
Node.js 应用跑得更快 10 个技巧
Apr 03 Javascript
解析JavaScript模仿块级作用域
Dec 29 Javascript
jsTree事件和交互以及插件plugins详解
Aug 29 Javascript
angularJs复选框checkbox选中进行ng-show显示隐藏的方法
Oct 08 Javascript
微信小程序-form表单提交代码实例
Apr 29 Javascript
js cavans实现静态滚动弹幕
May 21 Javascript
Vue elementUI表单嵌套表格并对每行进行校验详解
Feb 18 Vue.js
JS实现简单的九宫格抽奖
Jun 28 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
php中全局变量global的使用演示代码
2011/05/18 PHP
php计算两个日期时间差(返回年、月、日)
2014/06/19 PHP
使用PHP similar text计算两个字符串相似度
2015/11/06 PHP
PHP如何通过date() 函数格式化显示时间
2020/11/13 PHP
自己整理的一个javascript日期处理函数
2010/10/16 Javascript
基于jQuery的试卷自动排版系统实现代码
2011/01/06 Javascript
Javascript实现简单的富文本编辑器附演示
2014/06/16 Javascript
javascript格式化指定日期对象的方法
2015/04/21 Javascript
jQuery中$.each()函数的用法引申实例
2016/05/12 Javascript
jQuery的层级查找方式分析
2016/06/16 Javascript
Vue如何实现组件的源码解析
2017/06/08 Javascript
mui 打开新窗口的方式总结及注意事项
2017/08/20 Javascript
Vue的移动端多图上传插件vue-easy-uploader的示例代码
2017/11/27 Javascript
谈谈vue中mixin的一点理解
2017/12/12 Javascript
微信小程序日期时间选择器使用方法
2018/02/01 Javascript
ES6知识点整理之函数数组参数的默认值及其解构应用示例
2019/04/17 Javascript
在微信小程序中使用图表的方法示例
2019/04/25 Javascript
基于Node的Axure文件在线预览的实现代码
2019/08/28 Javascript
JavaScript 链表定义与使用方法示例
2020/04/28 Javascript
python简单获取数组元素个数的方法
2015/07/13 Python
深入解析Python中的上下文管理器
2016/06/28 Python
pandas数据处理基础之筛选指定行或者指定列的数据
2018/05/03 Python
深入浅析Python的类
2018/06/22 Python
python 对类的成员函数开启线程的方法
2019/01/22 Python
利用anaconda作为python的依赖库管理方法
2019/08/13 Python
python小项目之五子棋游戏
2019/12/26 Python
Python尾递归优化实现代码及原理详解
2020/10/09 Python
Python实现区域填充的示例代码
2021/02/03 Python
CSS书写规范、顺序和命名规则
2014/03/06 HTML / CSS
CSS3打造百度贴吧的3D翻牌效果示例
2017/01/04 HTML / CSS
天巡全球:Skyscanner Global
2017/06/20 全球购物
副科竞争上岗演讲稿
2014/05/12 职场文书
党员批评与自我批评思想汇报
2014/10/08 职场文书
辞职信格式模板
2015/02/27 职场文书
监护人证明
2015/06/19 职场文书
环境卫生标语
2015/08/03 职场文书