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 相关文章推荐
7款风格新颖的jQuery/CSS3菜单导航分享
Apr 23 Javascript
KnockoutJS 3.X API 第四章之数据控制流with绑定
Oct 10 Javascript
原生js实现选项卡功能
Mar 08 Javascript
浅析JS中的 map, filter, some, every, forEach, for in, for of 用法总结
Mar 29 Javascript
VUE多层路由嵌套实现代码
May 15 Javascript
详解vue + vuex + directives实现权限按钮的思路
Oct 24 Javascript
Node.js一行代码实现静态文件服务器的方法步骤
May 07 Javascript
ES6中Symbol、Set和Map用法详解
Aug 20 Javascript
Vue+ElementUI 中级联选择器Bug问题的解决
Jul 31 Javascript
详解Vue中的watch和computed
Nov 09 Javascript
JavaScript实现登录窗体
Jun 22 Javascript
JavaScript高级程序设计之基本引用类型
Nov 17 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中英混合字符串截取函数代码
2011/07/17 PHP
关于PHP的curl开启问题探讨
2014/04/08 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
Extjs EditorGridPanel中ComboBox列的显示问题
2011/07/04 Javascript
JS无法捕获滚动条上的mouse up事件的原因猜想
2012/03/21 Javascript
js去除重复字符串两种实现方法
2013/01/09 Javascript
javascript截取字符串小结
2015/04/28 Javascript
JS函数修改html的元素内容,及修改属性内容的方法
2016/10/28 Javascript
Vue2.0 实现歌手列表滚动及右侧快速入口功能
2018/08/08 Javascript
vue中引入第三方字体文件的方法示例
2018/12/17 Javascript
C#程序员入门学习微信小程序的笔记
2019/03/05 Javascript
如何使用CSS3+JQuery实现悬浮墙式菜单
2019/06/18 jQuery
Angular6使用forRoot() 注册单一实例服务问题
2019/08/27 Javascript
vant-ui AddressEdit地址编辑和van-area的用法说明
2020/11/03 Javascript
Node.js 中如何收集和解析命令行参数
2021/01/08 Javascript
[00:27]DOTA2次级职业联赛 - Lilith战队宣传片
2014/12/01 DOTA
python正则匹配抓取豆瓣电影链接和评论代码分享
2013/12/27 Python
Python黑帽编程 3.4 跨越VLAN详解
2016/09/28 Python
用Python实现KNN分类算法
2017/12/22 Python
使用pandas实现csv/excel sheet互相转换的方法
2018/12/10 Python
python模拟登陆,用session维持回话的实例
2018/12/27 Python
Django 模型类(models.py)的定义详解
2019/07/19 Python
使用IPython或Spyder将省略号表示的内容完整输出
2020/04/20 Python
Python selenium爬虫实现定时任务过程解析
2020/06/08 Python
国际知名军事风格休闲装品牌:Alpha Industries(阿尔法工业)
2017/05/24 全球购物
伦敦剧院门票:London Theatre Direct
2018/11/21 全球购物
The Athlete’s Foot新西兰:新西兰最大的运动鞋零售商
2019/12/23 全球购物
员工入职担保书范文
2014/04/01 职场文书
保险公司开门红口号
2014/06/21 职场文书
2014年学雷锋活动总结
2014/06/26 职场文书
学习优秀党务工作者先进事迹材料思想报告
2014/09/17 职场文书
学生会辞职信
2015/03/02 职场文书
刘胡兰观后感
2015/06/16 职场文书
小学教师读书笔记
2015/07/01 职场文书
红歌会主持词
2015/07/02 职场文书
Python中glob库实现文件名的匹配
2021/06/18 Python