个人博客首发博客园: http://www.cnblogs.com/zhangrunhao/

参考

感谢作者

问题背景

  • 在调试Chrome的时候, 发现不能找到vm这个对象.
  • window下面也没有看到这个对象.
  • 产生了好奇心.

过程分析

  • 在dev环境下面:

    • 在控制台看的时候放到了 window__VUE_DEVTOOLS_GLOBAL_HOOK__
  • 找到了new Vue的运行栈.
  • 但是没能确定在Vue中具体的运行过程.
  • 应该是在import的时候, webpack就把引入的Vue对象放到了某个地方, 保存起来了.

运行时构建的Vue库/独立构建的Vue库

  • 使用import/require引入的是 运行时构建的Vue库 dist/vue.runtime.common.js
  • 使用<script>引入的是独立构建的Vue库
  • 区别就是是否包含一个template功能, 因为在运行时构建的Vue库中, 我们通过打包工具webpack等解决了这一问题.

选择挂载优先级

  • render渲染函数 > template编译模板 > 挂载到el属性上的指定DOM

render函数

  • 挂载在Vue的顶级函数上面. 渲染的最优先选择
  • render: function(cb / createElement) {} // 所有的的核心都在这个回调函数中
  • 这个回调函数就是createElement函数, 也就是我们用来创建VNode的函数, render返回的就是 回调函数的执行结果
  • return createElement(tag, data, array) // 这个就是我们的返回结果
  • 参数第一个表示, 我们的标签名称, 或者是一个实例组件. data就是我们这个组件的描述信息了. 什么都有.
  • 最后一个参数, 我们用来递归形成的子标签, 或者子组件, 数组表示平行关系
  • 第二个参数, 如果是一个字符串的话, 就是我们想要往里面插入的子组件陈列
  • render: h => h(App) / render(h) {return h('div', this.hi)}

vue不渲染Dom, 实现场景直接通信

  • 新建文件 import Vue from 'vue; export EventBus = new Vue()
  • 通过$on添加监听事件
    • import EventBus from './event-bus.js; EventBus.$on('customerEvent', function() {}).
    • 此处尽量不要使用箭头函数, 里面的指针不易改变
    • 回头自己试试.
  • 其他文件引入, 通过$emit触发
    • import EventBus from './event-bus.js; EventBus.$emit('customerEvent', ...params)

查找vue.runtime.common.js

应该从打包工具开始查找

/dist文件夹下八个文件的区别

  • 按照运行环境区分: 完整构建/运行时构建, 也就是是否可以使用template选项
  • 按照模块化规范: UMD/CommonJS/ESModule
    • AMD: requireJS实现. 主要是异步加载模块. (偏向浏览器)
    • COMMONJS: Node, 同步加载, 模块无需包装. (偏向服务器)
    • UMD: AMD和COMMON的结合, (先判断是否执行export/Node), 再判断是否支持(define/AMD).
  • vue.common.js: 基于common的完整构建. 使用webpack打包时, 需要配置别名.(这就不太理解了)
    • 我又预感, 问题应该就出在webpack的配置中
// webpack-1
{
resolve: {
alias: {
'vue$': 'vue/dist/vue.common.js'
}
}
}
  • vue.esm.js: 基于ESModule的完整构建. 使用webpack打包时, 也是需要配置
  • vue.js: 基于UMD的完整构建
  • vue.runtime.common.js: 基于common的运行时构建. 不支持template, .vue被解析成了render函数
  • vue.runtime.esm.js: 基于ESModule的运行时构建.
  • vue.runtime.js: 基于UMD的运行时构建.

项目直接引用的vue, 引用的是vue.runtime.common.js吗. 为何可以使用ESModle

  • 先贴出vue的package.json
{
// ...
"main": "dist/vue.runtime.common.js",
"module": "dist/vue.runtime.esm.js",
"unpkg": "dist/vue.js",
"jsdelivr": "dist/vue.js",
// ...
}
  • main: 是基于COMMONJS的. module: 是基于ES6的.
  • 因为使用ES6的话, 可以配置uglifyjs-webpack-plugin插件, 可以去除没有用到的函数.
  • 但是因为有些npm包不支持ES6, 比如有些node环境.
  • 这个时候, 会判断当前支持哪种环境, 然后选择不同的包.
  • 引入的时候, 不论包怎么导出都可用import引入. 但是导出的时候, 就会区分出来. 使用export/export default关键字, 还是module.exports/exports导出

结论, 我们的项目, 应该是引用了run.runtime.esm.js

webpack中配置别名

  • baseConf.resolve.alias.vue = 'vue/dist/vue.common.js';
  • 当我们解析vue / vue$ 的时候, 就会解析到指定的目录下面.

寻找项目中顶级Vue对象 (一)的更多相关文章

  1. 在maven项目中 配置代理对象远程调用crm

    1 在maven项目中配置代理对象远程调用crm 1.1 在项目的pom.xml中引入CXF的依赖 <dependency> <groupId>org.apache.cxf&l ...

  2. 在vue项目中遇到关于对象的深浅拷贝问题

    一.问题 项目里新添加了一个多选的功能,其显示的数据都是从后端返回过来的,我们需要在返回来的数据外再额外添加一个是否选中的标记,我的选择是在返回正确的数据时将标记添加进去,然后push到数组中.然后就 ...

  3. SpringBoot项目中获取applicationContext对象

    ApplicationContext 对象是Spring开源框架的上下文对象实例,也就是我们常说的Spring容器,一般情况下我们是不用手动来管理它,而是由Spring框架自己来维护bean之间的关系 ...

  4. 在webpack构建的项目中使用vue

    一.复习在普通网页中使用vue1.使用script引入vue2.在index中创建 id为app的容器3.通过new vue得到vm实例二.在webpack中尝试使用vue://注意 : 在webpa ...

  5. 如何去除vue项目中的 # — vue路由的History模式

    前言 在创建的 router 对象中,如果不配置 mode,就会使用默认的 hash 模式,该模式下会将路径格式化为 #! 开头. 添加 mode: 'history' 之后将使用 HTML5 his ...

  6. 项目中使用vue的API。 和项目的结构

    <template> <!--组件的 结构--> <div id="app"> <h3>{{ msg }}</h3> & ...

  7. 让vue-cli脚手架搭建的项目可以处理vue文件中postcss语法

    图中&属于postcss的语法,这样书写样式可以清楚的看出选择器之前的层级关系,非常好用. 在利用vue-cli脚手架搭建的项目中如果不配置是不支持这种写法的,这样写不会报错,但是样式不生效. ...

  8. 在webpack中配置.vue组件页面的解析

    1. 运行`cnpm i vue -S`将vue安装为运行依赖: 2. 运行`cnpm i vue-loader vue-template-compiler -D`将解析转换vue的包安装为开发依赖: ...

  9. js中,清空对象(删除对象的属性)

    在项目中,有些对象用完后需要重置,下面简单介绍下JS中清除对象的方法.方法如下: 方法一:字面量定义对象 第一步,定义一个空对象并打印出来,代码和效果: 代码: var student = {};co ...

随机推荐

  1. vue 单页面(SPA) history模式调用微信jssdk 跳转后偶尔 "invalid signature"错误解决方案

    项目背景 vue-cli生成的单页面项目,router使用history模式.产品会在公众号内使用,需要添加微信JSSDK,做分享相关配置. 遇到的问题 相关配置与JS接口安全域名都已经ok,发布后, ...

  2. 中国vs美国制造业公司营业额大排名,看看哪些属于美国制造业的优势产业(中美旗鼓相当,而且还有本土制造的优势)

    当然,所谓的美国制造业,大量的东西现在 在中国制造和生产,但这里列举的,主要是卖实体工业产品为主的美国公司这个榜单里主要列出以工业产品销售为主的公司. 所以各大能源巨头虽然本身也是装备制造大户,但没被 ...

  3. PPAPI与Browser间使用AsyncIPC通信

    採用AsyncIpc这个项目(https://github.com/hicdre/AsyncIpc).来完毕PPAPI Plugin进程与Browser进程的通信. foruok原创.如需转载请关注f ...

  4. js replace()实现全部替换

    var r= "1\n2\n3\n"; //将字母\n替换成分号 alert(r.replace("\n",";")); 结果:1;2\n3 ...

  5. js中字符串函数indexOf与search的区别

    IndexOf()方法是用来判断一个字符串是否存在于一个更长的字符串中.从长字符串左端到右端来搜索,如果存在该子字符串就返回它所处的位置(即索引).如果在被搜索的字符串没有找到要查找的字符串返回-1. ...

  6. asp+jQuery解决中文乱码

    1. [代码][ASP/Basic]代码 '在客户端使用javascript的escape()方法对数据进行编码,在服务器端使用对等的VbsUnEscape()对数据进行解码,同样在服务器端使用Vbs ...

  7. [Silverlight 2.0 控制物体绕圆弧运行(C#初探篇)]

    我自己写的第一个 Silverlight 2.0 程序    [Silverlight 2.0 控制物体绕圆弧运行(C#初探篇)]            程序运行时:小地球将绕着圆形轨迹做圆周运动. ...

  8. BZOJ_2726_[SDOI2012]任务安排_斜率优化+二分

    BZOJ_2726_[SDOI2012]任务安排_斜率优化+二分 Description 机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这 ...

  9. Spring配置错误 No adapter for IAdvice of type

    参考:http://www.2cto.com/kf/201305/211728.html 错误十三 在配置拦截器后,运行的时候报错=> Error creating context 'sprin ...

  10. BackTrack5(BT5)各版本下载

    BT5R3(最新版本)http://www.nigesb.com/backtrack-5-r3-released.html  BT5R2KDE版32位: http://ftp.halifax.rwth ...