寻找项目中顶级Vue对象 (一)
个人博客首发博客园: http://www.cnblogs.com/zhangrunhao/
参考
感谢作者
- 从一个奇怪的错误出发理解 Vue 基本概念
- 安装 - Vue.js
- 渲染函数 - Vue.js
- Vue2 dist 目录下各个文件的区别
- 聊聊 package.json 文件中的 module 字段
- ES6模块 和 CommonJS 的区别
问题背景
- 在调试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对象 (一)的更多相关文章
- 在maven项目中 配置代理对象远程调用crm
1 在maven项目中配置代理对象远程调用crm 1.1 在项目的pom.xml中引入CXF的依赖 <dependency> <groupId>org.apache.cxf&l ...
- 在vue项目中遇到关于对象的深浅拷贝问题
一.问题 项目里新添加了一个多选的功能,其显示的数据都是从后端返回过来的,我们需要在返回来的数据外再额外添加一个是否选中的标记,我的选择是在返回正确的数据时将标记添加进去,然后push到数组中.然后就 ...
- SpringBoot项目中获取applicationContext对象
ApplicationContext 对象是Spring开源框架的上下文对象实例,也就是我们常说的Spring容器,一般情况下我们是不用手动来管理它,而是由Spring框架自己来维护bean之间的关系 ...
- 在webpack构建的项目中使用vue
一.复习在普通网页中使用vue1.使用script引入vue2.在index中创建 id为app的容器3.通过new vue得到vm实例二.在webpack中尝试使用vue://注意 : 在webpa ...
- 如何去除vue项目中的 # — vue路由的History模式
前言 在创建的 router 对象中,如果不配置 mode,就会使用默认的 hash 模式,该模式下会将路径格式化为 #! 开头. 添加 mode: 'history' 之后将使用 HTML5 his ...
- 项目中使用vue的API。 和项目的结构
<template> <!--组件的 结构--> <div id="app"> <h3>{{ msg }}</h3> & ...
- 让vue-cli脚手架搭建的项目可以处理vue文件中postcss语法
图中&属于postcss的语法,这样书写样式可以清楚的看出选择器之前的层级关系,非常好用. 在利用vue-cli脚手架搭建的项目中如果不配置是不支持这种写法的,这样写不会报错,但是样式不生效. ...
- 在webpack中配置.vue组件页面的解析
1. 运行`cnpm i vue -S`将vue安装为运行依赖: 2. 运行`cnpm i vue-loader vue-template-compiler -D`将解析转换vue的包安装为开发依赖: ...
- js中,清空对象(删除对象的属性)
在项目中,有些对象用完后需要重置,下面简单介绍下JS中清除对象的方法.方法如下: 方法一:字面量定义对象 第一步,定义一个空对象并打印出来,代码和效果: 代码: var student = {};co ...
随机推荐
- 全局钩子 实例(不使用DLL和使用DLL两种)
大家应该都知道,全局消息钩子要依赖于一个DLL才能够正常工作.于是呢,我也就理所当在地认为全局钩子都要依赖于一个DLL才能正常工作的,我想大部分人肯定和我一样也这么认为的. 但实际上不是这样的.有某些 ...
- Delphi如何实现多国语言
Delphi里的多语言处理方法都一样, 都是通过资源DLL的形式进行加载处理. Delphi在加载form数据的时候会判断当前的系统语言,然后根据语言加载不同的资源dll, 来实现多国语言的功能. 下 ...
- rails elasticsearch searchkick用法
1.安装elasticsearch 之前要先安装java8: 参考https://www.elastic.co/guide/en/elasticsearch/reference/current/zip ...
- 一步一步学Silverlight 2系列(14):数据与通信之WCF
一步一步学Silverlight 2系列(14):数据与通信之WCF 概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框 ...
- 2016-5-23 jsp
1.table的边框:rules这个参数,它有三个值(cols,rows,none),当rules=cols时,表格会隐藏横向的分隔线,也就是我们只能看到表格的列:当rules=rows时,就隐藏了纵 ...
- [Selenium] Android HTML5 中 Application Cache
HTML5 中引入了 Application Cache,这意味着 Web 应用程序可以被缓存到本地,且可在没有网络的情况下也能访问该 Web 应用程序 Application Cache 在以下3个 ...
- 【扬中集训DAY2T2】 机智的AmyZhi
[题目链接] 点击打开链接 [算法] 据说标算是暴力? 从N-200开始搜 不过我用了搜索+一些奇怪的剪枝,也A了.... [代码] 标程 #include<bits/stdc++.h> ...
- javascript之存储数据-cookie,localStorage,sessionStorage
cookie: 存储一些简单的数据,以文本形式放到本地,大小4kb 存储:document.cookie='name=value' 取值:document.cookie(字符串) 期限:expires ...
- MYSQL数据库学习----查询
查询语句是MYSQL数据库中用到的最多的语句. 查询语句分为几种 单表查询 集合函数查询 连接查询 子查询 合并查询 正则表达式查询 一:单表查询 SELECT 属性 FROM 表名 [WHERE 查 ...
- Spring中的扩展点
Spring作为一个常用的IOC框架,在设计上预留了很多的扩展点,很多第三方开源框架,包括Spring自身也是基于这些扩展点实现的,这很好的体现了对修改关闭.对扩展开放的原则.总的来说Spring的扩 ...