美团面试官(有了解过|美团面试官:有了解过 Vue.use 是怎么实现的吗)
这个 api 是做什么的
看源码之前,先去看看官方文档的说明,这样更容易理解。根据 Vue 官方文档的说明,这个 api 用于安装 Vue.js 插件。如果插件是一个对象,必须提供 install 方法。如果插件是一个函数,它会被作为 install 方法。install 方法调用时,会将 Vue 作为参数传入。
Vue.use(plugin);
// 入参类型 Object | Function
此外文档中还提到:
- 该方法需要在调用 new Vue() 之前被调用;
- 当 install 方法被同一个插件多次调用,插件将只会被安装一次;
Vue.use
的源码不到 20 行,在这个目录下:node_modules\vue\src\core\global-api\use.js源码的内容如下:
import { toArray } from '../util/index'export function initUse (Vue: GlobalAPI) {
Vue.use = function (plugin: Function | Object) {
const installedPlugins = (this._installedPlugins || (this._installedPlugins = []))
if (installedPlugins.indexOf(plugin) > -1) {
return this
}// additional parameters
const args = toArray(arguments, 1)
args.unshift(this)
if (typeof plugin.install === 'function') {
plugin.install.apply(plugin, args)
} else if (typeof plugin === 'function') {
plugin.apply(null, args)
}
installedPlugins.push(plugin)
return this
}
}
从源码可以看出,
Vue.use
接收的 plugin
类型是 Function | Object
,这与文档的描述一致。接着在下面的代码中,
this._installedPlugins
用于记录已安装的插件,然后判断传入的 plugin
是否已安装,如果已安装就不再安装,这也在文档中提到了。顺便提一下,判断插件是否已安装,这边用的是 indexOf
方法,其实是在向下兼容,因为 includes
是 ES2016 语法。const installedPlugins = (this._installedPlugins || (this._installedPlugins = []))
if (installedPlugins.indexOf(plugin) > -1) {
return this
}
【美团面试官(有了解过|美团面试官:有了解过 Vue.use 是怎么实现的吗)】然后下面是这段代码:
const args = toArray(arguments, 1)
其中用到了
toArray
方法,定义在node_modules\vue\src\shared\util.js:218
toArray
函数的作用是将类数组对象转为数组(在这里是 arguments
对象),然后第二个参数代表起始下标,这里传 1 也就是忽略数组的第一个元素(也就是 plugin
),从以上代码我们可以推断出,Vue.use
大概是这么用的:Vue.use(plugin, arg1, arg2...)
接着下面的代码将
Vue
(这里的 this
指向 Vue
)添加到数组的最前面:args.unshift(this)
最后得到的
args
应该会类似于:[Vue, arg1, arg2...]
然后就是安装插件。如果
plugin
本身是对象,里面提供了 install
方法,那就直接调用这个 install
方法,然后传入 args
。因为我们在 args
前面添加了 Vue
,所以 Vue
会作为第一个参数被传入,这与文档中描述的 install
方法能获取到 Vue
一致。如果 plugin
本身是函数,那就直接调用这个函数安装插件。if (typeof plugin.install === 'function') {
plugin.install.apply(plugin, args)
} else if (typeof plugin === 'function') {
plugin.apply(null, args)
}
再就是记录一下已安装的插件,防止重复安装:
installedPlugins.push(plugin)
最后一步返回
Vue
,以便进行链式调用:return this
参考 Vue.use(plugin) - Vue 官方文档
推荐阅读
- ts泛型使用举例
- 康恩赫助力线头公益#义卖星推官#,分享你最喜爱的义卖明星
- 二十五、狗(外戚)咬狗(宦官)与第二次党锢
- 2018国考外交部面试演讲不再难——只需把握好三点
- iOS面试题--基础
- 星际无限|星际无限 | 官方推出Filecoin MinerX奖学金计划,吸引中小型Filecoin矿工
- 新垣结衣官宣结婚,从一组男友视角写真,看网友们的“夺妻之恨”
- 1040表格和W-2表格
- java|java 常用知识点链接
- 病理预测