详解Vue This$Store总结


Posted in Javascript onDecember 17, 2018

开发 VueThis$Store 一些技巧

上次答应一个读者介绍下开发此插件的一些原理和技巧,在此也一并做下总结了。

基本工具

1 正则表达式,正则表达式大家都不陌生,正则表达式的优点就是速度快,对于一个代码补全的插件,用户肯定希望更快的得到反馈,测试了 1000 行的 vue 文件匹配全部的 mapXXX() 之类的 api 字符串也只是用了 1ms 都不到的时间,但是缺点也非常明显,他是上下文无关的,比如说

mapState({
 a: state => state.test,
});

这样一段代码,我们可以使用 vscode 的 api 当触发了补全后,用 /\bmapState\(([\'\"](.*)[\'\"](?:,\s*)?)?((\[[\s\S]*?\])|(\{[\s\S]*?\}))?\s*\)/g 捕获到上面这段代码,但是朋友你还要考虑的是,函数有三种方法

mapState({
 a: state => state.test,
 b(s) {
 return s.test;
 },
 c: function(s) {
 return s.test;
 },
});

你怎么使用正则表达式捕获到 a, b, c 三个属性并且拿到三个函数的第一个参数呢,不排除有人能做到,但是可能会耗费不少时间吧。

2 Abstract Syntax Tree(以下用简写 ast),我这里是使用时 babel 的 parser babylon ,ast 和正则表达式的优缺点有点互补的意思,parser 缺点是相对慢,但是通过 parser 得到的 ast 对于一代码的描述更加精确,你可以得到函数的参数,等很多信息,这里了就不科普,掘金有很多介绍 ast 的文章,这里强烈推荐这个网站astexplore,你可以在网站上练习,做一些很酷的事情。

开工

有了这两种工具,我们就可以开始写代码啦,既然两种工具的优缺点是互补的,我就想能不能将他们结合起来使用,最终想到的比较理想的方法就是,使用正则表达式捕获 mapXXX 这种工具函数,找到所有匹配的代码段以后使用 parser 获取 ast,在来分析函数的参数,因为 ast 里信息非常丰富,我们可以获取到是哪种的函数,以及函数的第一个参数,这样用户使用 . 触发补全时,即使用了 state 的简写 s,我们仍然可以给出正确的建议。

但是我们要获取 store 中所有的定义,就必须找到 store 的入口文件,怎样找到 store 的入口文件呢?还记得我们平时是怎么注入 store 的么?

import Vue from 'vue';
import App from './App.vue';
import store from './store';

new Vue({
 render: h => h(App),
 store,
}).$mount('#app');

我们只要通过parser的到这段文本的ast,就可以获取到store的相对路径了,获取到store的相对路径了之后就可以获取到vuex中的实例中的配置对象,获取到配置对象就一步一步向下获取到所有,mutations,state,getters,modules,遍历所有module,其实每一个module就是一个vuex实例的配置对象,我们就可以递归以上的代码,获取所有的store代码了,上个流程图。

详解Vue This$Store总结

当然我们在调用的时候要注意一些事项,比如 对象可能从外部引入

import Vue from 'vue';
import Vuex from 'vuex';

import state from './state';
Vue.use(Vuex);

export default new Vuex.Store({
 state,
});

可能就以属性的形式直接定义

export default {
 account: {
 namespaced: true,
 state: {
  number: 31
 },
 getters: {
  testlen: state => state.number.length
 },
 mutations: {
  change(state, { number }) {
  state.number = number;
  }
 }
 }
};

也可能先定义,在以对象属性简写的形式引入。

const state = {name: 'jack'}
export default {
 state: state
}

总结

以上只是将我制作这个插件,用到的工具和思想和大家分享下,也是对这次开发的总结吧,具体的实现请移步这里

反思

开源这个vscode插件以后,取得的用户数量还是没有达到自己的理想水平,自己下来也有反思

  • 前端可以选择的ide有很多,并不是每个人都用vscode
  • 我这个插件能带来的功能有限,可能在一个.vue文件中就用到一两次vuex中的数据,装这个插件能带来的体验提升有限,并不能和vetur这种涵盖了所有常用的功能相比。

之前也有掘金用户想我提建议,可以考虑和vetur合并,但是从目前来看好像并不是有很多人需要这个插件,我还是先尽力维护好这个项目吧。

一些可能对你有帮助的网站

vscode插件官方文档,可以手把手教你做一个vscode插件:vscode官方文档

astexplore:你可以在这里自由练习主流parser的用法:可以看到ast的结构 :astexplore

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用js自动判断浏览器分辨率的代码
Jan 28 Javascript
优化innerHTML操作(提高代码执行效率)
Aug 20 Javascript
js判断一个元素是否为另一个元素的子元素的代码
Mar 21 Javascript
js编码、解码函数介绍及其使用示例
Sep 05 Javascript
详解jQuery插件开发中的extend方法
Nov 19 Javascript
纯javascript模仿微信打飞机小游戏
Aug 20 Javascript
利用AngularJs实现京东首页轮播图效果
Sep 08 Javascript
Angular-Ui-Router+ocLazyLoad动态加载脚本示例
Mar 02 Javascript
iscroll.js滚动加载实例详解
Jul 18 Javascript
js中json对象和字符串的理解及相互转化操作实现方法
Sep 22 Javascript
JavaScript 截取字符串代码实例
Sep 05 Javascript
jQuery模仿ToDoList实现简单的待办事项列表
Dec 30 jQuery
vue + element-ui的分页问题实现
Dec 17 #Javascript
Vue 中的受控与非受控组件的实现
Dec 17 #Javascript
js实现移动端轮播图
Dec 21 #Javascript
微信小程序登录按钮遮罩浮层效果的实现方法
Dec 16 #Javascript
微信小程序 JS动态修改样式的实现方法
Dec 16 #Javascript
Echart折线图手柄触发事件示例详解
Dec 16 #Javascript
vue使用pdfjs显示PDF可复制的实现方法
Dec 14 #Javascript
You might like
PHP 函数执行效率的小比较
2010/10/17 PHP
laravel框架上传图片实现实时预览功能
2019/10/14 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
JavaScript与函数式编程解释
2007/04/27 Javascript
一段批量给页面上的控件赋值js
2010/06/19 Javascript
使用jQuery UI的tooltip函数修饰title属性的气泡悬浮框
2013/06/24 Javascript
自定义百度分享的分享按钮
2015/03/18 Javascript
JavaScript操作XML/HTML比较常用的对象属性集锦
2015/10/30 Javascript
详解JavaScript基于面向对象之创建对象(2)
2015/12/10 Javascript
js中scrollTop()方法和scroll()方法用法示例
2016/10/03 Javascript
js中url对象化管理分析
2017/12/29 Javascript
vue + vuex todolist的实现示例代码
2018/03/09 Javascript
JavaScript 性能提升之路(推荐)
2019/04/10 Javascript
vue跳转同一个组件,参数不同,页面接收值只接收一次的解决方法
2019/11/05 Javascript
[47:26]完美世界DOTA2联赛 LBZS vs Forest 第二场 11.07
2020/11/09 DOTA
使用Python脚本来获取Cisco设备信息的示例
2015/05/04 Python
详解Python中的序列化与反序列化的使用
2015/06/30 Python
Python如何获取文件指定行的内容
2020/05/27 Python
Java byte数组操纵方式代码实例解析
2020/07/22 Python
python将YUV420P文件转PNG图片格式的两种方法
2021/01/22 Python
HTML5 Video标签的属性、方法和事件汇总介绍
2015/04/24 HTML / CSS
高品质和独特的产品世界:Creations and Collections
2018/01/07 全球购物
如何处理简单的PHP错误
2015/10/14 面试题
Yahoo的PHP面试题
2014/05/26 面试题
C#如何判断当前用户是否输入某个域
2015/12/07 面试题
艺术爱好者的自我评价分享
2013/10/08 职场文书
调研汇报材料范文
2014/08/17 职场文书
业务员岗位职责
2015/02/03 职场文书
毕业生个人总结
2015/02/28 职场文书
2015年学校安全工作总结
2015/04/22 职场文书
六一活动主持词
2015/06/30 职场文书
毕业班班主任工作总结2015
2015/07/23 职场文书
二十年同学聚会感言
2015/07/30 职场文书
go语言中json数据的读取和写出操作
2021/04/28 Golang
解决golang在import自己的包报错的问题
2021/04/29 Golang
Python pyecharts绘制条形图详解
2022/04/02 Python