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 闭包在封装函数时的简单分析
Nov 28 Javascript
非常强大的 jQuery.AsyncBox 弹出对话框插件
Aug 29 Javascript
php利用curl获取远程图片实现方法
Oct 26 Javascript
jQuery EasyUI编辑DataGrid用combobox实现多级联动
Aug 29 Javascript
AngularJs bootstrap搭载前台框架——准备工作
Sep 01 Javascript
详解vue父子模版嵌套案例
Mar 04 Javascript
bootstrap手风琴折叠示例代码分享
May 22 Javascript
react-router JS 控制路由跳转实例
Jun 15 Javascript
详解使用vue实现tab 切换操作
Jul 03 Javascript
BootStrap下的弹出框加载select2框架失败的解决方法
Aug 31 Javascript
vue+echarts实现可拖动节点的折线图(支持拖动方向和上下限的设置)
Apr 12 Javascript
详解如何搭建mpvue框架搭配vant组件库的小程序项目
May 16 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中创建空文件的代码[file_put_contents vs touch]
2012/01/20 PHP
搭建自己的PHP MVC框架详解
2017/08/16 PHP
laravel ORM关联关系中的 with和whereHas用法
2019/10/16 PHP
js实现同一页面多个运动效果的方法
2015/04/10 Javascript
Javascript中的数组常用方法解析
2016/06/17 Javascript
浅谈jQuery操作类数组的工具方法
2016/12/23 Javascript
详解Sea.js中Module.exports和exports的区别
2017/02/12 Javascript
利用imgareaselect辅助后台实现图片上传裁剪
2017/03/02 Javascript
js放到head中失效的原因与解决方法
2017/03/07 Javascript
微信小程序利用co处理异步流程的方法教程
2017/05/20 Javascript
vue中$refs的用法及作用详解
2018/04/24 Javascript
JavaScript类的继承操作实例总结
2018/12/20 Javascript
VUE 实现复制内容到剪贴板的两种方法
2019/04/24 Javascript
vuejs数据超出单行显示更多,点击展开剩余数据实例
2019/05/05 Javascript
小程序如何支持使用 async/await详解
2019/09/12 Javascript
在Chrome DevTools中调试JavaScript的实现
2020/04/07 Javascript
[01:41]DOTA2超级联赛专访YYF 称一辈子难忘TI2
2013/05/28 DOTA
easy_install python包安装管理工具介绍
2013/02/10 Python
python 调用c语言函数的方法
2017/09/29 Python
儿童学习python的一些小技巧
2018/05/27 Python
Python3实现腾讯云OCR识别
2018/11/27 Python
浅谈python str.format与制表符\t关于中文对齐的细节问题
2019/01/14 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
2019/06/04 Python
windows下python虚拟环境virtualenv安装和使用详解
2019/07/16 Python
python BlockingScheduler定时任务及其他方式的实现
2019/09/19 Python
Python 、Pycharm、Anaconda三者的区别与联系、安装过程及注意事项
2019/10/11 Python
详解基于python的图像Gabor变换及特征提取
2020/10/26 Python
Python3 用什么IDE开发工具比较好
2020/11/28 Python
Python的scikit-image模块实例讲解
2020/12/30 Python
英国著名的小众美容品牌网站:Alyaka
2017/08/08 全球购物
德国2018年度最佳在线药房:Bodfeld Apotheke
2019/11/04 全球购物
小学教师的自我评价范例
2013/10/31 职场文书
新店开业策划方案怎么书写?
2019/07/05 职场文书
javascript的setTimeout()使用方法总结
2021/11/20 Javascript
室外天线与收音机天线杆接合方法
2022/04/05 无线电
MySQL创建管理LIST分区
2022/04/13 MySQL