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自动设置IFrame高度的小例子
Jun 08 Javascript
Javascript对象属性方法汇总
Nov 21 Javascript
javascript操作html控件实例(javascript添加html)
Dec 02 Javascript
一个判断抢购时间是否到达的简单的js函数
Jun 23 Javascript
javascript中字符串拼接详解
Sep 26 Javascript
将页面table内容与样式另存成excel文件的方法
Aug 05 Javascript
微信小程序request出现400的问题解决办法
May 23 Javascript
echarts同一页面中四个图表切换的js数据交互方法示例
Jul 03 Javascript
JS把字符串格式的时间转换成几秒前、几分钟前、几小时前、几天前等格式
Jul 10 Javascript
基于Vue全局组件与局部组件的区别说明
Aug 11 Javascript
js实现滑动进度条效果
Aug 21 Javascript
代码块高亮可复制显示js插件highlight.js+clipboard.js整合
Feb 15 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/04 新手入门
Jquery动态更改一张位图的src与Attr的使用
2013/07/31 Javascript
JavaScript实现找出数组中最长的连续数字序列
2014/09/03 Javascript
jQuery中outerHeight()方法用法实例
2015/01/19 Javascript
jQuery手机浏览器中拖拽动作的艰难性分析
2015/02/04 Javascript
js实现简洁的滑动门菜单(选项卡)效果代码
2015/09/04 Javascript
Bootstrap导航简单实现代码
2017/03/06 Javascript
js如何获取网页所有图片
2017/05/12 Javascript
详解Koa中更方便简单发送响应的方式
2018/07/20 Javascript
点击按钮弹出模态框的一系列操作代码实例
2019/03/29 Javascript
详解elementui之el-image-viewer(图片查看器)
2019/08/30 Javascript
JS中数组实现代码(倒序遍历数组,数组连接字符串)
2019/12/29 Javascript
Vue的v-model的几种修饰符.lazy,.number和.trim的用法说明
2020/08/05 Javascript
vue组件暴露和.js文件暴露接口操作
2020/08/11 Javascript
[54:30]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python检测lvs real server状态
2014/01/22 Python
利用Python实现图书超期提醒
2016/08/02 Python
Python操作csv文件实例详解
2017/07/31 Python
Python图像滤波处理操作示例【基于ImageFilter类】
2019/01/03 Python
值得收藏的10道python 面试题
2019/04/15 Python
python-tkinter之按钮的使用,开关方法
2019/06/11 Python
Django Session和Cookie分别实现记住用户登录状态操作
2020/07/02 Python
Python调用Redis的示例代码
2020/11/24 Python
Web页面中八种创建多列等高(等高列布局)的实现技术
2012/12/24 HTML / CSS
英国皇家造币厂:The Royal Mint
2018/10/05 全球购物
学生自我鉴定范文
2013/10/04 职场文书
门面房租房协议书
2014/08/20 职场文书
个人贷款授权委托书样本
2014/10/07 职场文书
共产党员批评与自我批评
2014/10/15 职场文书
党支部四风整改方案
2014/10/25 职场文书
可可西里观后感
2015/06/08 职场文书
比赛口号霸气押韵
2015/12/24 职场文书
MySQL 8.0 Online DDL快速加列的相关总结
2021/06/02 MySQL
vue实现列表拖拽排序的示例代码
2022/04/08 Vue.js
nginx搭建NFS网络文件系统
2022/04/14 Servers
Java 数组的使用
2022/05/11 Java/Android