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获取DOM元素位置和尺寸大小的方法
Apr 12 Javascript
JS中怎样判断undefined(比较不错的方法)
Mar 27 Javascript
node.js中的fs.truncateSync方法使用说明
Dec 15 Javascript
jquery队列函数用法实例
Dec 16 Javascript
jQuery取消特定的click事件
Feb 29 Javascript
jQuery的实例及必知重要的jQuery选择器详解
May 20 Javascript
js css实现垂直方向自适应的三角提示菜单
Jun 26 Javascript
JS本地刷新返回上一页代码
Jul 25 Javascript
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
Oct 31 Javascript
mpvue中配置vuex并持久化到本地Storage图文教程解析
Mar 15 Javascript
基于JS实现父组件的请求服务过程解析
Oct 14 Javascript
JavaScript架构localStorage特殊场景下二次封装操作
Jun 21 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
咖啡语言
2021/03/03 咖啡文化
PHP处理bmp格式图片的方法分析
2017/07/04 PHP
PHP与SQL语句写一句话木马总结
2019/10/11 PHP
TP5框架页面跳转样式操作示例
2020/04/05 PHP
javascript js cookie的存储,获取和删除
2007/12/29 Javascript
js 中 document.createEvent的用法
2010/08/29 Javascript
Jquery中删除元素的实现代码
2011/12/29 Javascript
node在两个div之间移动,用ztree实现
2013/03/06 Javascript
jquery 设置元素相对于另一个元素的top值(实例代码)
2013/11/06 Javascript
JavaScript使用replace函数替换字符串的方法
2015/04/06 Javascript
JavaScript获取页面中超链接数量的方法
2015/11/09 Javascript
使用ReactJS实现tab页切换、菜单栏切换、手风琴切换和进度条效果
2016/10/17 Javascript
jquery插件bootstrapValidator表单验证详解
2016/12/15 Javascript
简单实现js菜单栏切换效果
2017/03/04 Javascript
详解如何构建Angular项目目录结构
2017/07/13 Javascript
Angularjs实现上传图片预览功能
2017/09/01 Javascript
JS使用tofixed与round处理数据四舍五入的区别
2017/10/25 Javascript
基于js实现复制内容到操作系统粘贴板过程解析
2019/10/11 Javascript
使用Node.js实现base64和png文件相互转换的方法
2020/03/11 Javascript
用Python实现协同过滤的教程
2015/04/08 Python
Python测试人员需要掌握的知识
2018/02/08 Python
异步任务队列Celery在Django中的使用方法
2018/06/07 Python
Flask之请求钩子的实现
2018/12/23 Python
Golang GBK转UTF-8的例子
2019/08/26 Python
django-利用session机制实现唯一登录的例子
2020/03/16 Python
pandas的resample重采样的使用
2020/04/24 Python
面向新手解析python Beautiful Soup基本用法
2020/07/11 Python
Python selenium实现断言3种方法解析
2020/09/08 Python
欧姆龙医疗欧洲有限公司:Omron Healthcare Europe B.V
2020/06/13 全球购物
学前教育毕业生自荐信
2013/10/29 职场文书
年会活动策划方案
2014/01/23 职场文书
打架检讨书500字
2014/01/29 职场文书
《彩色世界》教学反思
2014/04/12 职场文书
2015年纪委工作总结
2015/05/13 职场文书
2015年行风建设工作总结
2015/05/15 职场文书
python简单验证码识别的实现过程
2021/06/20 Python