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 相关文章推荐
setTimeout 不断吐食CPU的问题分析
Apr 01 Javascript
javascript KeyDown、KeyPress和KeyUp事件的区别与联系
Dec 03 Javascript
jQuery ui 利用 datepicker插件实现开始日期(minDate)和结束日期(maxDate)
May 22 Javascript
js电话号码验证方法
Sep 28 Javascript
解析jquery easyui tree异步加载子节点问题
Mar 08 Javascript
JS实现禁止高频率连续点击的方法【基于ES6语法】
Apr 25 Javascript
浅谈在Vue.js中如何实现时间转换指令
Jan 06 Javascript
vue双向绑定及观察者模式详解
Mar 19 Javascript
vue鼠标悬停事件实例详解
Apr 01 Javascript
layui 数据表格复选框实现单选功能的例子
Sep 19 Javascript
ES5新增数组的实现方法
May 12 Javascript
vue3种table表格选项个数的控制方法
Apr 14 Vue.js
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
Sony CFR 320 修复改造
2020/03/14 无线电
业余方法DIY电子管FM收音机
2021/03/02 无线电
PHP实现更新中间关联表数据的两种方法
2014/09/01 PHP
php获取json数据所有的节点路径
2015/05/17 PHP
php发送http请求的常用方法分析
2016/11/08 PHP
JS获取父节点方法
2009/08/20 Javascript
关于html+ashx开发中几个问题的解决方法
2011/07/18 Javascript
从URL中提取参数与将对象转换为URL查询参数的实现代码
2012/01/12 Javascript
基于jquery实现弹幕效果
2016/09/29 Javascript
移动端利用H5实现压缩图片上传功能
2017/03/29 Javascript
JS作用域链详解
2017/06/26 Javascript
BootStrap modal实现拖拽功能
2018/12/01 Javascript
总结4个方面优化Vue项目
2019/02/11 Javascript
弱类型语言javascript开发中的一些坑实例小结【变量、函数、数组、对象、作用域等】
2019/08/07 Javascript
使用pkg打包ThinkJS项目的方法步骤
2019/12/30 Javascript
[01:16]2014DOTA2 TI专访C9战队EE:中国五强中会占三席
2014/07/10 DOTA
使用Python来编写HTTP服务器的超级指南
2016/02/18 Python
Python入门_浅谈字符串的分片与索引、字符串的方法
2017/05/16 Python
VScode编写第一个Python程序HelloWorld步骤
2018/04/06 Python
python BlockingScheduler定时任务及其他方式的实现
2019/09/19 Python
Python实现投影法分割图像示例(二)
2020/01/17 Python
python 实现单例模式的5种方法
2020/09/23 Python
Django怎么在admin后台注册数据库表
2020/11/14 Python
安踏官方商城:anta.cn
2019/12/16 全球购物
香港百佳网上超级市场:PARKNSHOP.com
2020/06/10 全球购物
医务人员自我评价
2014/01/26 职场文书
路政管理毕业自荐书范文
2014/02/10 职场文书
终止劳动合同协议书
2014/04/14 职场文书
公司门卫工作职责
2014/06/28 职场文书
防灾减灾日活动总结
2014/08/26 职场文书
公司离职证明标准格式
2014/11/18 职场文书
股权转让协议范本
2014/12/07 职场文书
客户经理岗位职责
2015/01/31 职场文书
防溺水主题班会教案
2015/08/12 职场文书
vue的项目如何打包上线
2022/04/13 Vue.js
pd.drop_duplicates删除重复行的方法实现
2022/06/16 Python