标签: vue

Vue 所有请求都应该放在 Vuex 里面吗?

*近在定一些代码开发规范,有一个前端同学坚持要把所有请求按模块都放到 Vuex 里面?请问合理吗?
vuex 请求 vue 请问88 条回复 • 2021-08-26 16:36:25 +08:00
duan602728596 1
duan602728596 1 天前
不合理
murmur 2
murmur 1 天前
放哪里都一样,只要维护方便就行
musi 3
musi 1 天前 ❤️ 2
vuex 不是用来管理状态的么,难不成你们所有的请求都是状态?
请求分模块能理解,全放到 vuex 里就不能理解了
Twinkle 4
Twinkle 1 天前 ❤️ 1
大部分放 vuex 里面感觉没啥问题,还要看你们的页面数据是不是都从 vuex 里拿。单独提出一个 service 或者 api 的文件夹放下面也可以,都是便于维护的方式。
qwe520liao 5
qwe520liao 1 天前
就是把数据源进行封装,有一定的好处,方便测试,就看这样做值还是不值,如果变化非常频繁就比较费事。
SxqSachin 6
SxqSachin 1 天前
我们公司是把所有接口放到 api 文件夹中,再按不同功能模块继续细分文件夹。把所有请求放到 vuex 里是头一回听说
murmur 7
murmur 1 天前
@musi vuex 两层封装简单理解点就是一层修改 state,一层可以是异步操作,修改一堆 state,当然也可以无聊封装直接调 commit
从这个角度来看,远程请求是 promise,会修改一些 state,这个封装是没问题的
iikebug 8
iikebug 1 天前
头一回听说还能这么用的
ccyu220 9
ccyu220 1 天前
我个人认为只有涉及到基础信息或者全局公共的请求才放到 vuex 里面。

比如:session 、login 、logout 以及页面上报、记录信息等。

适时而定,一条路走死那叫*端。
murmur 10
murmur 1 天前
@SxqSachin 这当然可以,但是换个角度想,你 api 里就写一个 axios({url: xxxx, params: xxxx}),和把这玩意直接塞 action 里,差别不大,为了三五行代码封装一个函数,说多余也多余

Vegetable 11
Vegetable 1 天前
统一管理是对的,但是 vuex 显然不是*好的选择。
keepeye 12
keepeye 1 天前 ❤️ 3
vuex 是管理全局状态的,反对将所有状态一股脑塞进去,更不用说将所有接口都塞进去了
learnshare 13
learnshare 1 天前
见过这么做的,能运行
但完全不可以,*对不可以

状态管理是用来存储、修改、共享和分发数据的,不应该包含任何副作用、异步过程和其他多余操作

目前见过的一些状态管理使用状况,基本都是乱用,什么都放到状态管理中
实际上应该谨慎使用状态管理,尽量少用或不用,真需要状态管理的数据和场景并不多
qiaobeier 14
qiaobeier 1 天前
小项目随意,稍大点项目不推荐。
Shook 15
Shook 1 天前
不应该。而且我本身比较讨厌 Vuex,所以 Vue3 以后,我认为 Vuex 都可以不用了。
murmur 16
murmur 1 天前
@learnshare “不应该包含任何副作用、异步过程和其他多余操作”

action 本身就可以返回异步,为啥不能包含异步过程

我举个例子,https://github.com/PanJiaChen/vue-element-admin/blob/master/src/store/modules/user.js

action 里的 login,login({ username: username.trim(), password: password }),把这行直接改成
axios({url: “login.xxx”, params:{xxxx}})没任何问题,一个函数多了 3 行而已,考虑到拆分后 module 也不大,不会对代码整洁度和管理造成多少影响
Kusoku 17
Kusoku 1 天前
请求数据不是跟状态强关联的,放在 vuex 里属实有点欠妥,两个各自独立的东西只是在部分场景有耦合,强行放在一起有什么收益呢?如果涉及到状态管理方案的改造变更或者压根就不需要状态管理呢?
sxox 18
sxox 1 天前
@Kusoku 美其名曰是为了 api 的复用,我实在是理解不了
sxox 19
sxox 1 天前
@duan602728596
@murmur

你们是怎么做的
murmur 20
murmur 1 天前
@sxox 我们的项目小,api 这层封装都没有,action 也不用,就只用 state 和 commit
yamedie 21
yamedie 1 天前
我现在就是这样用的, actions 里面基本全是各种 api 调用, 有些回参需要缓存的, 在 action 里调用 commit 把字典接口的回参缓存到 state, 下次调 action 时发现 getters 里有这个字典的缓存, 就直接将它 return 出来, 很顺滑而且自然. (当然如果是列表之类一次性的请求, 直接将 promise 返出去就可以了
KouShuiYu 22
KouShuiYu 1 天前
一直放到 api 文件夹里面
https://github.com/chenkai0520/vite-template/tree/main/src/api
learnshare 23
learnshare 1 天前
@murmur 并不是能做,我们就要做。

项目简单的话,放一起不觉得乱。
但项目规模大,合作人员多的话,还是要追求模块分层清晰,代码逻辑简单。

我前边说 vue-element-admin:
>类似的项目通常缺乏*佳实践,配套工具和代码风格不太好,导致项目质量不高。
还被骂乱配、乱踩来着,神都吹上了
darknoll 24
darknoll 1 天前
你是不是看了 vue-element-admin, 他放归他放,你自己随便
learnshare 25
learnshare 1 天前
@learnshare 乱配 -> 乱喷
murmur 26
murmur 1 天前
@learnshare 你觉得为了所谓的清晰把 2 行代码封装成 1 个函数属于*佳实践么

现在基本上都是拦截器统一处理异常,也就是说 api 封装是没有 catch 部分的

那这个 2 变 1 的封装有何意义
yamedie 27
yamedie 1 天前
@murmur 我完全同意#16 楼的观点, 这样做能减少各种弯弯绕(比如甚至单独定义一个 MutationTypes.js)带来的心智负担. 肯定有人会说大型项目不能这么做, 我还真没有经手过什么大型项目… Vuex 按模块拆分并开启命名空间, 每个模块负责一个”实体”(例如订单 /联系人 /对话 /合同都是实体), 每个 action 对应一个后端接口, 每个 action 是名字尽量语义化 /自注释, vue 组件里用 mapActions 引入… 至少给我带来的开发体验是很不错的
cs419 28
cs419 1 天前
工业化讲究: 够用就好
结合实际情况再加两条: 领导要求的 避免负面作用

够用: 即保障基本需求
领导要求: 领导觉着加了某个东西风水好,虽然可能没啥用,但领导不高兴肯定影响工作
负面: 某个东西不能提供生产 反而导致老出问题 肯定也不行
sjzjams 29
sjzjams 1 天前
那你所有的状态管理后面需要维护的就很多
learnshare 30
learnshare 1 天前
@murmur 不是几行代码的问题,是为了保证模块专注在一件事上

项目越复杂,参与人员越多,就更需要
>模块分层清晰,代码逻辑简单。
xu2060 31
xu2060 1 天前
我们这就是这样做的把所有的请求都放在 vuex actions 里面 然后数据都存在 state 里面,虽然整齐,但是这么用肯定不对
PerFectTime 32
PerFectTime 1 天前
element-admin 似乎就是把 api 放在状态里面的
thtznet 33
thtznet 1 天前
所以,讨论到*后发现都是设计模式问题,那么干嘛用 VUE ? NG 就很香了对么?
violetlai 34
violetlai 1 天前
感觉不太合适吧 毕竟 vuex 就不是处理请求的东西 偶尔需要用共享数据才用它 请求还是同一拦截处理比较好

其次 vuex 是用的真的很难受
wht0522 35
wht0522 1 天前 via Android
*次见到这种方式属实惊呆了 所有接口都放到 vuex 很不方便 element-admin 只是退出 登录 获取用户信息 这几个接口放在这里边
SSSensational 36
SSSensational 1 天前
为什么不试试 swrv,以及 vue 下的 umi-hooks/useRequset 。这些只是取数的场景不需要用 store 的。
SZP1206 37
SZP1206 1 天前 via Android
不合理
Geo200 38
Geo200 1 天前
这明显是把 MVVM 当 MVC 来用了
Lemeng 39
Lemeng 1 天前
一般都有规范要求,不然怎么方便怎么来呗
cansiny0320 40
cansiny0320 1 天前
我觉得可以,全放在 action 里
liyg04120414 41
liyg04120414 1 天前
不需要维护状态的请求没必要放到 vuex 里
3wdddd 42
3wdddd 1 天前
副作用太大,不太好
gloye 43
gloye 1 天前
我看过一个国外的示例项目倒是这么做的,意思同一个业务模块可以对接多个业务来源,例如同一页面需要 A 部门接口,B 部门接口,那么可以放到一个 module 里统一管理。
voidWhyy 44
voidWhyy 1 天前
我认为只有 login 和 logout 相关的才需要放到 vuex 里
strangeFish 45
strangeFish 1 天前
完全不推荐,api 应该统一管理是对的。
如果你们后端使用 swagger,而且项目是不在意体积的,推荐使用 https://github.com/alibaba/pont,全自动生成请求和类型提示。
另外 vuex 非常不推荐使用。
fox2081 46
fox2081 1 天前
既然要定规范一定不是小项目了,建议请求实例、文档等相关内容放在一个 npm 私有仓库,用脚本实现后端触发自动构建更新版本,api 自动封装,其他项目直接 npm 安装使用,省去人工修改的烦恼。
和 vuex 混在一起这种方法我也见过,但是实在想不出来这样做图啥,vuex 是为了存储一个全局状态,一般也就存储个项目配置和用户相关。
项目随着时间推移,复杂度会逐渐上升,*好在一开始就降低耦合和依赖,尽量模块化,要不然早期一些糟糕的设计逐渐就变成了屎山,后面再想着维护的成本就是指数级别的。
gzf6 47
gzf6 1 天前 via Android
我接手过一个就是全放在里面的,改得想死,直接重构了一个
ChefIsAwesome 48
ChefIsAwesome 1 天前
我见过一堆人就拿这玩意当全局变量使。一个文件成百上千行。就这还觉得自己模块清晰。
anguiao 49
anguiao 1 天前
闻所未闻
toesbieya 50
toesbieya 1 天前
有一说一,我觉得 vuex 除了能配合 vue devtool 以外,真的垃圾,完全没有语法提示,不如自己用 Vue.observable 写
murmur 51
murmur 1 天前 ❤️ 1
@toesbieya 来了来了,拉不出屎赖框架,以前 jquery 年代都做大项目,现在换 vue 做不了了,是框架垃圾还是人太水
chouchoui 52
chouchoui 1 天前
@toesbieya 换 pinia 吧,解决一切烦恼
murmur 53
murmur 1 天前
自由和规矩只能选一个,自己场景搞不清楚赖框架垃圾是什么臭毛病

你这种自己封一个 dispatch(ACTION.SOME_ACTION, ACTION.SOME_ACTION_ARGS(arg1, arg2))…

能不能提示?
yor1g 54
yor1g 1 天前
涉及状态共享的变化放进去也没毛病 既然都上了 vuex 统一放进去也是应该吧
zhangjiancheng 55
zhangjiancheng 23 小时 34 分钟前
vuex 的语法提示不算差了 mapXXX 之类的都带好了 完全没语法提示简直是扯
TomatoYuyuko 56
TomatoYuyuko 23 小时 29 分钟前
放 vuex 既不合理又不方便,我 vue 项目加了 ts,axios 做一层总的过滤器,然后根据业务分别把 api 放到对应的 ts 文件里,需要调接口的时候直接 await api(params),还有参数提示,这不简单多了?
Melting 57
Melting 23 小时 26 分钟前
这样搞耦合性太大了,放在 api 文件夹下也很方便,而且项目切换前端语言的时候,api 下的文件可以直接用。vuex 可以适量的用,全部放进去我觉得没必要
varzy 58
varzy 23 小时 2 分钟前 via iPhone
反对。个人认为 vuex 里面的东西应该越少越好。
suzic 59
suzic 21 小时 45 分钟前 via Android
不合理,应该只放会频繁使用的请求,比如
zhwithsweet 60
zhwithsweet 21 小时 17 分钟前
vuex 替代产品 https://pinia.esm.dev/ 试试这个?
不是所有的请求都放 vuex,无状态的请求,直接写到组件逻辑即可。
zesenwu 61
zesenwu 18 小时 58 分钟前
不合理,vuex 本身就是用来存放全局状态的,应该少用,甚至不用
很多框架的东西,如果原项目已经可以满足,那就不要引入太多其他东西
不要为了用而用
Rocketer 62
Rocketer 17 小时 54 分钟前 via iPhone
@thtznet #33 就我见过的前端口水战而言,归根结底都是见的太少,又懒得学新,每个人都抱着自己会的那点东西拼命说它好。

包括那些所谓的主管。

由于历史包袱以及公司合并等原因,我三大 spa 框架都在用,所以我算是真正体会过三者的区别的。凭心而言,ng 是*优雅的,其 service 的概念*对碾压 redux 和 vuex,以至于我都想试试在 react 和 vue 项目里引入这个概念。只可惜我也懒,懒得修改屎山,所以迄今为止也就是想想。
jinwyp 63
jinwyp 15 小时 13 分钟前
95%的项目,都不需要用到 vuex, 除非你要做个在线 excel word 这种。 看了上面的回帖,vue2 还是很多问题,到现在也没有*佳实践。

我觉得不用 vuex 就是*佳实践。用了以后,根本无法区分哪些数据放到 vuex 里面, 哪些不放,*后就是乱成一锅粥
sjhhjx0122 64
sjhhjx0122 8 小时 54 分钟前
上 ts 就不用 vuex,上了 ts,直接用 ref 自己实现一个简易的 vuex,vuex 这个东西真的好维护嘛,…map 这种一点提示都没有,分了子模块也恶心
TimPeake 65
TimPeake 8 小时 25 分钟前
说实话 我现在*力推荐三大框架的作者去掉状态管理的相关功能, 为啥 ?状态管理已经被滥用到了恶心的地步….接收那种项目心里很排斥
TimPeake 66
TimPeake 8 小时 24 分钟前
天天还有一大帮人在问状态管理器的状态为啥刷新没了这种问题
daguaochengtang 67
daguaochengtang 8 小时 22 分钟前
阿这。。。
asiasky 68
asiasky 7 小时 51 分钟前
不建议这样 vuex 是状态管理 我猜你想放进去只是想可以直接调用 不用反复写或者引用了 但是其实这个用 require.context 去读文件实现
IanHo 69
IanHo 7 小时 50 分钟前
*对不能接受
ColdBird 70
ColdBird 7 小时 42 分钟前
接口层放在 api 文件,数据层根据是否需要共享决定放在 vue 文件里还是 vuex 里,大部分都在 vue,少部分共享数据放 vuex
yamedie 71
yamedie 7 小时 6 分钟前
@TimPeake #66 vuex 有 persistedState 这种持久化插件, 页面刷新了该保留的 state 都还在, 不想保留的键值也可以自己写 reducer 让它不持久化, 我用着挺开心的, 就想问你们这些*力推崇 ref 代替 vuex 的人是怎么解决”刷新页面状态丢失”这个问题的?
strangeFish 72
strangeFish 6 小时 33 分钟前
@yamedie 本质是把状态存在 sessionStorage 或者 localStorage,自己写对应逻辑不难。。。

“`ts
function usePersistState(key: string, initValue = {}) {
const str = localStorage.getItem(key)

const oldState = str && JSON.parse(str)
const someState = ref(oldState || initValue)

watch(() => someState.value, val => {
localStorage.setItem(key, JSON.stringify(val))
}, {
deep: true
})
return someState
}
“`
yamedie 73
yamedie 6 小时 7 分钟前
@strangeFish 这段代码能让散落在各处的 useFunction.js 都实现状态持久化吗?
TimPeake 74
TimPeake 6 小时 3 分钟前
@yamedie “”如何解决刷新页面状态丢失“” 就不应该有这种问题。我知道有持久化插件,但是这种持久化插件显然不够优雅。持久化注定是跟状态管理没一毛钱关系的 ,既然都持久化了 本地存储它不香。如果某个状态需要持久化,只能说明这个状态不适合放在状态里
yamedie 75
yamedie 6 小时 3 分钟前
而且代码里只看到了 watch 到改变->存 localStorage 的过程, “页面刷新后从 storage 中读取并恢复”的伪代码没有看到, 另外怎么复用到所有的 use 里?
yamedie 76
yamedie 5 小时 54 分钟前
@TimPeake 不太明白, 你的意思是往 localstorage 里存几十个键值对更优雅吗? 比如用户所属的部门和组的信息, 是不是一种状态? 我想存在 vuex 中全局共享, 刷新页面也不丢失, 只在希望主动更新时才调接口获取并更新, 否则一律使用缓存中的部门 /组别信息, 这是一种伪需求吗?
TimPeake 77
TimPeake 5 小时 45 分钟前
@yamedie 没记错的话,你说的 persistedState 实现原理也是通过本地存储辅助实现的吧,既然这样,有什么区别呢 ?如果你说 几十个键值对不优雅的话,那只是写法的问题罢了, 封装一些实现或者用 web sql 等也可以啊
yamedie 78
yamedie 5 小时 40 分钟前
@TimPeake 我是在反驳你这句话: “持久化注定是跟状态管理没一毛钱关系的 ,既然都持久化了 本地存储它不香。”
用户姓名 /头像 url/部门名 /组名等等, 这类不常变动的信息是不是属于状态的一种, 你可以选择单独存 localstorage 或者频繁调接口获取, 但好像无力反对别人存 vuex(并持久化)的做法吧, 在我看来 vuex 这个状态机主要就是用来维护这些状态的
TimPeake 79
TimPeake 5 小时 31 分钟前
@yamedie 你是不是忘记了状态管理的诞生初衷是为了解决跨组件数据沟通 你觉得跟“用户姓名 /头像 url/部门名 /组名”这个需求一致吗
yamedie 80
yamedie 5 小时 27 分钟前
@TimPeake 我举例的“用户姓名 /头像 url/部门名 /组名”这类信息本来就是需要跨组件共享的呀
yamedie 81
yamedie 5 小时 19 分钟前
我不知道 @murmur 有没有兴趣驳斥”vuex 状态管理就不应该存在 / 状态管理跟持久化没一毛钱关系 / ref 能完全取代 vuex”这类观点
shakukansp 82
shakukansp 4 小时 23 分钟前
全部存 vuex 里面……是没做过几百个页面每个页面的参数不一样的系统吗
murmur 83
murmur 3 小时 23 分钟前
@yamedie 有,你可以不用啊,vue 本身就是选词填空,你把空填到哪里能完成功能不就行了
SSSensational 84
SSSensational 3 小时 13 分钟前
@yamedie @TimPeake 别吵了。看看 swrv / vue-request
brookepe 85
brookepe 2 小时 56 分钟前
vuex 可能是因为 this 这种用起来方便
qq1340691923 86
qq1340691923 2 小时 45 分钟前
还真是前端娱乐圈
yunye 87
yunye 2 小时 43 分钟前
这也能吵起来吗
xqk111 88
xqk111 51 分钟前
不应该,下一个问题

使用Vue.js开发微信小程序:开源框架mpvue解析

前言
mpvue是一款使用Vue.js开发微信小程序的前端框架。使用此框架,开发者将得到完整的 Vue.js 开发体验,同时为H5和小程序提供了代码复用的能力。如果想将 H5 项目改造为小程序,或开发小程序后希望将其转换为H5,mpvue将是十分契合的一种解决方案。

目前,mpvue已经在美团点评多个实际业务项目中得到了验证,因此我们决定将其开源,希望更多技术同行一起开发,应用到更广泛的场景里去。github项目地址请参见mpvue 。使用文档请参见 http://mpvue.com/。

为了帮助大家更好的理解mpvue的架构,接下来我们来解析框架的设计和实现思路。文中主要内容已经发表在《程序员》杂志2017年第9期小程序专题封面报道,内容略有修改。

小程序开发特点
微信小程序推荐简洁的开发方式,通过多页面聚合完成轻量的产品功能。小程序以离线包方式下载到本地,通过微信客户端载入和启动,开发规范简洁,技术封装彻底,自成开发体系,有Native和H5的影子,但又*不雷同。

小程序本身定位为一个简单的逻辑视图层框架,官方并不推荐用来开发复杂应用,但业务需求却难以做到精简。复杂的应用对开发方式有较高的要求,如组件和模块化、自动构建和集成、代码复用和开发效率等,但小程序开发规范较大的限制了这部分能力。为了解决上述问题,提供更好的开发体验,我们创造了mpvue,通过使用Vue.js来开发微信小程序。

mpvue是什么
mpvue是一套定位于开发小程序的前端开发框架,其核心目标是提高开发效率,增强开发体验。使用该框架,开发者只需初步了解小程序开发规范、熟悉Vue.js基本语法即可上手。框架提供了完整的 Vue.js 开发体验,开发者编写Vue.js代码,mpvue 将其解析转换为小程序并确保其正确运行。此外,框架还通过 vue-cli 工具向开发者提供quick start 示例代码,开发者只需执行一条简单命令,即可获得可运行的项目。

为什么做mpvue
在小程序内测之初,我们计划快速迭代出一款对标 H5 的产品实现,核心诉求是:快速实现、代码复用、低成本和高效率… 随后经历了多个小程序建设,结合业务场景、技术选型和小程序开发方式,我们整理汇总出了开发阶段面临的主要问题:

组件化机制不够完善
代码多端复用能力欠缺
小程序框架和团队技术栈无法有机结合
小程序学习成本不够低
组件机制:小程序逻辑和视图层代码彼此分离,公共组件提取后无法聚合为单文件入口,组件需分别在视图层和逻辑层引入,维护性差;组件无命名空间机制,事件回调必须设置为全局函数,组件设计有命名冲突的风险,数据封装不强。开发者需要友好的代码组织方式,通过 ES 模块一次性导入;组件数据有良好的封装。成熟的组件机制,对工程化开发至关重要。

多端复用:常见的业务场景有两类,通过已有 H5 产品改造为小程序应用或反之。从效率角度出发,开发者希望通过复用代码完成开发,但小程序开发框架却无法做到。我们尝试过通过静态代码分析将 H5 代码转换为小程序,但只做了视图层转换,无法带来更多收益。多端代码复用需要更成熟的解决方案。

引入 Vue.js:小程序开发方式与 H5 近似,因此我们考虑和 H5 做代码复用。沿袭团队技术栈选型,我们将 Vue.js 确定为小程序开发规范。使用 Vue.js 开发小程序,将直接带来如下开发效率提升:

H5 代码可以通过*小修改复用到小程序
使用 Vue.js 组件机制开发小程序,可实现小程序和 H5 组件复用
技术栈统一后小程序学习成本降低,开发者从 H5 转换到小程序不需要更多学习
Vue.js 代码可以让所有前端直接参与开发维护
为什么是 Vue.js?这取决于团队技术栈选型,引入新的选型与统一技术栈和提高开发效率相悖,有违开发工具服务业务的初衷。

mpvue 的演进
mpvue的形成,来源于业务场景和需求,*终方案的确定,经历了三个阶段。

*阶段:我们实现了一个视图层代码转换工具,旨在提高代码首次开发效率。通过将H5视图层代码转换为小程序代码,包括 HTML 标签映射、Vue.js 模板和样式转换,在此目标代码上进行二次开发。我们做到了有限的代码复用,但组件化开发和小程序学习成本并未得到有效改善。

第二阶段:我们着眼于完善代码组件化机制。参照 Vue.js 组件规范设计了代码组织形式,通过代码转换工具将代码解析为小程序。转换工具主要解决组件间数据同步、生命周期关联和命名空间问题。*终我们实现了一个 Vue.js 语法子集,但想要实现更多特性或跟随 Vue.js 版本迭代,工作量变得难以估计,有永无止境之感。

第三阶段:我们的目标是实现对 Vue.js 语法全集的支持,达到使用 Vue.js 开发小程序的目的。并通过引入 Vue.js runtime 实现了对 Vue.js 语法的支持,从而避免了人肉语法适配。至此,我们完成了使用 Vue.js 开发小程序的目的。较好地实现了技术栈统一、组件化开发、多端代码复用、降低学习成本和提高开发效率的目标。

mpvue设计思路
Vue.js 和小程序都是典型的逻辑视图层框架,逻辑层和视图层之间的工作方式为:数据变更驱动视图更新;视图交互触发事件,事件响应函数修改数据再次触发视图更新,如图1所示。

%title插图%num
图1: 小程序实现原理
鉴于 Vue.js 和小程序一致的工作原理,我们思考将小程序的功能托管给 Vue.js,在正确的时机将数据变更同步到小程序,从而达到开发小程序的目的。这样,我们可以将精力聚焦在 Vue.js 上,参照 Vue.js 编写与之对应的小程序代码,小程序负责视图层展示,所有业务逻辑收敛到 Vue.js 中,Vue.js 数据变更后同步到小程序,如图2所示。如此一来,我们就获得了以 Vue.js 的方式开发小程序的能力。

Vue代码
– 将小程序页面编写为 Vue.js 实现
– 以 Vue.js 开发规范实现父子组件关联

小程序代码
– 以小程序开发规范编写视图层模板
– 配置生命周期函数,关联数据更新调用
– 将 Vue.js 数据映射为小程序数据模型

并在此基础上,附加如下机制
– Vue.js 实例与小程序 Page 实例建立关联
– 小程序和 Vue.js 生命周期建立映射关系,能在小程序生命周期中触发 Vue.js 生命周期
– 小程序事件建立代理机制,在事件代理函数中触发与之对应的 Vue.js 组件事件响应

这套机制总结起来非常简单,但实现却相当复杂。在揭秘具体实现之前,读者可能会有这样一些疑问:

要同时维护 Vue.js 和小程序,是否需要写两个版本的代码实现?
小程序负责视图层展现,Vue.js的视图层是否还需要,如果不需要应该如何处理?
生命周期如何打通,数据同步更新如何实现?
上述问题包含了 mpvue 框架的核心内容,下文将仔细为你道来。首先,mpvue 为提高效率而生,本身提供了自动生成小程序代码的能力,小程序代码根据 Vue.js 代码构建得到,并不需要同时开发两套代码。

Vue.js 视图层渲染由 render 方法完成,同时在内存中维护着一份虚拟 DOM,mpvue 无需使用 Vue.js 完成视图层渲染,因此我们改造了 render 方法,禁止视图层渲染。熟悉源代码的读者,都知道 Vue runtime 有多个平台的实现,除了我们常见的 Web 平台,还有 Weex。从现在开始,我们增加了新的平台 mpvue。

生命周期关联:生命周期和数据同步是 mpvue 框架的灵魂,Vue.js 和小程序的数据彼此隔离,各自有不同的更新机制。mpvue 从生命周期和事件回调函数切入,在 Vue.js 触发数据更新时实现数据同步。小程序通过视图层呈现给用户、通过事件响应用户交互,Vue.js 在后台维护着数据变更和逻辑。可以看到,数据更新发端于小程序,处理自 Vue.js,Vue.js 数据变更后再同步到小程序。为实现数据同步,mpvue 修改了 Vue.js runtime 实现,在 Vue.js 的生命周期中增加了更新小程序数据的逻辑。

事件代理机制:用户交互触发的数据更新通过事件代理机制完成。在 Vue.js 代码中,事件响应函数对应到组件的 method, Vue.js 自动维护了上下文环境。然而在小程序中并没有类似的机制,又因为 Vue.js 执行环境中维护着一份实时的虚拟 DOM,这与小程序的视图层完全对应,我们思考,在小程序组件节点上触发事件后,只要找到虚拟 DOM 上对应的节点,触发对应的事件不就完成了么;另一方面,Vue.js 事件响应如果触发了数据更新,其生命周期函数更新将自动触发,在此函数上同步更新小程序数据,数据同步也就实现了。

mpvue如何使用
mpvue框架本身由多个npm模块构成,入口模块已经处理好依赖关系,开发者只需要执行如下代码即可完成本地项目创建。

# 安装 vue-cli
$ npm install –global vue-cli
# 根据模板项目创建本地项目,目前为内网地址
$ vue init ‘bitbucket:xxx.meituan. com:hfe/mpvue-quickstart’ –clone my- project
# 安装依赖和启动自动构建
$ cd my-project
$ npm install
$ npm run dev

执行完上述命令,在当前项目的 dist 子目录将构建出小程序目标代码,使用小程序开发者工具载入 dist 目录即可启动本地调试和预览。示例项目遵循 Vue.js 模板项目规范,通过Vue.js 命令行工具vue-cli创建。代码组织形式与 Vue.js 官方实例保持一致,我们为小程序定制了 Vue.js runtime 和 webpack 加载器,此部分依赖也已经内置到项目中。

针对小程序开发中常见的两类代码复用场景,mpvue 框架为开发者提供了解决思路和技术支持,开发者只需要在此指导下进行项目配置和改造。我们内部实践了一个将 H5 转换为小程序的项目,下图为使用 mpvue 框架的转换效果:

%title插图%num

图2: H5 和小程序转换效果
将小程序转换为H5:直接使用 Vue.js 规范开发小程序,代码本身与H5并无不同,具体代码差异会集中在平台 Api 部分。此外并不需明显改动,改造主要分如下几部分:

将小程序平台的 Vue.js 框架替换为标准 Vue.js
将小程序平台的 vue-loader 加载器替换为标准 vue-loader
适配和改造小程序与 H5 的底层 Api 差异
将H5转换为小程序:已经使用 Vue.js 开发完 H5,我们需要做的事情如下:

将标准 Vue.js 替换为小程序平台的 Vue.js 框架
将标准 vue-loader 加载器替换为小程序平台的 vue-loader
适配和改造小程序与 H5 的底层 Api 差异
根据小程序开发平台提供的能力,我们*大程度的支持了 Vue.js 语法特性,但部分功能现阶段暂时尚未实现。

%title插图%num

表1: mpvue 暂不支持的语法特性
项目转换注意事项:框架的目标是将小程序和 H5 的开发方式通过 Vue.js 建立关联,达到*大程度的代码复用。但由于平台差异的客观存在(主要集中在实现机制、底层Api 能力差异),我们无法做到代码 100% 复用,平台差异部分的改造成本无法避免。对于代码复用的场景,开发者需要重点思考如下问题并做好准备:

尽量使用平台无的语法特性,这部分特性无需转换和适配成本
避免使用不支持的语法特性,譬如 slot, filter 等,降低改造成本
如果使用特定平台 Api ,考虑抽象好适配层接口,通过切换底层实现完成平台转换
mpvue *佳实践
在表2中,我们对微信小程序、mpvue、WePY 这三个开发框架的主要能力和特点做了横向对比,帮助大家了解不同框架的侧重点,结合业务场景和开发习惯,确定技术方案。对于如何更好地使用 mpvue 进行小程序开发,我们总结了一些*佳实践。

使用 vue-cli 命令行工具创建项目,使用Vue 2.x 的语法规范进行开发
避免使用框架不支持的语法特性,部分 Vue.js语法在小程序中无法使用,尽量使用 mpvue 和 Vue.js 共有特性
合理设计数据模型,对数据的更新和操作做到细粒度控制,避免性能问题
合理使用组件化开发小程序,提高代码复用率

%title插图%num
表2: 框架使用特点对比
结语
mpvue 框架已经在业务项目中得到实践和验证,目前正在美团点评内部大范围使用。mpvue 来源于开源社区,饮水思源,我们也希望为开源社区贡献一份力量,为广大小程序开发者提供一套技术方案。mpvue 的初衷是让 Vue.js 的开发者以低成本接入小程序开发,做到代码的低成本迁移和复用,我们未来会继续扩展现有能力、解决开发者的诉求、优化使用体验、完善周边生态建设,帮助到更多的开发者。

*后,mpvue 基于 Vue.js 源码进行二次开发,新增加了小程序平台的实现,我们保留了跟随 Vue.js 版本升级的能力,由衷的感谢 Vue.js 框架和微信小程序给业界带来的便利。

用Vue开发小程序的框架

为什么是 Vue.js?这取决于团队技术栈选型,引入新的选型对统一技术栈和提高开发效率相悖,有违开发工具服务业务的初衷。

mpVue 的演进

mpVue 的形成,来源于业务场景和需求,*终方案的确定,经历了三个阶段。

  • *阶段:我们实现了一个视图层代码转换工具,旨在提高代码首次开发效率。通过将 H5 视图层代码转换为小程序代码,包括 HTML 标签映射、Vue.js 模板和样式转换,在此目标代码上进行二次开发。我们做到了有限的代码复用,但组件化开发和小程序学习成本并未得到有效改善。
  • 第二阶段:我们着眼于完善代码组件化机制。参照 Vue.js 组件规范设计了代码组织形式,通过代码转换工具将代码解析为小程序。转换工具主要解决组件间数据同步、生命周期关联和命名空间问题。*终我们实现了一个 Vue.js 语法子集,但想要实现更多特性或跟随 Vue.js 版本迭代,工作量变得难以估计,有永无止境之感。
  • 第三阶段:我们的目标是实现对 Vue.js 语法全集的支持,达到使用 Vue.js 开发小程序的目的。并通过引入 Vue.js RunTime 实现了对 Vue.js 语法的支持,从而避免了人肉语法适配。至此,我们完成了使用 Vue.js 开发小程序的目的。较好地实现了技术栈统一、组件化开发、多端代码复用、降低学习成本和提高开发效率的目标。

mpVue 设计思路

Vue.js 和小程序都是典型的逻辑视图层框架,逻辑层和视图层之间的工作方式为:数据变更驱动视图更新;视图交互触发事件,事件响应函数修改数据再次触发视图更新,如图 1 所示。

%title插图%num

图 1 小程序实现原理

鉴于 Vue.js 和小程序一致的工作原理,我们思考将小程序的功能托管给 Vue.js,在正确的时机将数据变更同步到小程序,从而达到开发小程序的目的。这样,我们可以将精力聚焦在 Vue.js 上,参照 Vue.js 编写与之对应的小程序代码,小程序负责视图层展示,所有业务和逻辑收敛到 Vue.js 中,Vue.js 数据变更后同步到小程序,如图 2 所示。如此一来,我们就获得了以 Vue.js 的方式开发小程序的能力。为此,我们设计的方案如下:

%title插图%num

图 2 mpVue 实现原理

Vue 代码:

  1. 将小程序页面编写为 Vue.js 实现;
  2. 以 Vue.js 开发规范实现父子组件关联。

小程序代码:

  1. 以小程序开发规范编写视图层模板;
  2. 配置生命周期函数,关联数据更新调用;
  3. 将 Vue.js 数据映射为小程序数据模型。

并在此基础上,附加如下机制:

  1. Vue 实例与小程序 Page 实例建立关联;
  2. 小程序和 Vue 生命周期建立映射关系,能在小程序生命周期中触发 Vue 生命周期;
  3. 小程序事件建立代理机制,在事件代理函数中触发与之对应的 Vue 组件事件响应。

这套机制总结起来非常简单,但实现却相当复杂。在揭秘具体实现之前,读者可能会有这样一些疑问:

  1. 要同时维护 Vue.js 和小程序,是否需要写两个版本的代码实现?
  2. 小程序负责视图层展现,Vue.js 的视图层是否还需要,如果不需要应该如何处理?
  3. 生命周期如何打通,数据同步更新如何实现?

上述问题包含了 mpVue 框架的核心内容,下文将仔细为你道来。首先,mpVue 为提高效率而生,本身提供了自动生成小程序代码的能力,小程序代码根据 Vue.js 代码构建得到,并不需要同时开发两套代码。

Vue.js 视图层渲染由 Render 方法完成,同时在内存中维护着一份虚拟 DOM,mpVue 无需使用 Vue.js 完成视图层渲染,因此我们改造了 Render 方法,禁止视图层渲染。熟悉源代码的读者都知道 Vue RunTime 有多个平台的实现,除了我们常见的 Web 平台,还有 Weex。从现在开始,我们增加了新的平台 mpVue。

再看第三个问题,生命周期和数据同步是 mpVue 框架的灵魂,Vue.js 和小程序的数据彼此隔离,各自有不同的更新机制。mpVue 从生命周期和事件回调函数切入,在 Vue.js 触发数据更新时实现数据同步。小程序通过视图层呈现给用户、通过事件响应用户交互,Vue.js 在后台维护着数据变更和逻辑。可以看到,数据更新发端于小程序,处理自 Vue.js,Vue.js 数据变更后再同步到小程序。为实现数据同步,mpVue 修改了 Vue.js RunTime 实现,在 Vue.js 的生命周期中增加了更新小程序数据的逻辑。

而用户交互触发的数据更新则是通过事件代理机制完成。在 Vue.js 代码中,事件响应函数对应到组件的 method 方法,Vue.js 自动维护了上下文环境。然而在小程序中并没有类似的机制,又因为 Vue.js 执行环境中维护着一份实时的虚拟 DOM,这与小程序的视图层完全对应。我们思考,在小程序组件节点上触发事件后,只要找到虚拟 DOM 上对应的节点,触发对应的事件不就完成了么。Vue.js 事件响应如果触发了数据更新,其生命周期函数更新将自动触发,在此函数上同步更新小程序数据,数据同步就实现了。

mpVue 如何使用

mpVue 框架本身由多个 npm 模块构成,入口模块已经处理好依赖关系,开发者只需要执行如下代码即可完成本地项目创建。

安装 vue-cli

$ npm install –global vue-cli

根据模板项目创建本地项目,目前为内网地址,暂稳开放

$ vue init ‘bitbucket:xxx.meituan.com:hfe/mpvue-quickstart’ –clone my-project

安装依赖和启动自动构建

$ cd my-project

$ npm install

$ npm run dev

执行完上述命令,在当前项目的 dist 子目录将构建出小程序目标代码,使用小程序开发者工具载入 dist 目录即可启动本地调试和预览。

示例项目遵循 Vue.js 模板项目规范,通过 Vue.js 命令行工具 vue-cli 创建。代码组织形式与 Vue.js 官方实例保持一致,我们为小程序定制了 Vue.js RunTime 和 Webpack 加载器,此部分依赖也已经内置到项目中。

针对小程序开发中常见的两类代码复用场景,mpVue 框架为开发者提供了解决思路和技术支持,开发者只需要在此指导下进行项目配置和改造。

将小程序转换为 H5

直接使用 Vue.js 规范开发小程序,代码本身与 H5 并无不同,具体代码差异会集中在平台 API 部分。此外无需明显改动,改造主要分以下几个部分:

  1. 将小程序平台的 Vue.js 框架替换为标准 Vue.js;
  2. 将小程序平台的 Vue-loader 加载器替换为标准 Vue-loader;
  3. 适配和改造小程序与 H5 的底层 API 差异。

将 H5 转换为小程序

已经使用 Vue.js 开发完 H5,则需要完成以下事宜:

  1. 将标准 Vue.js 替换为小程序平台的 Vue.js 框架;
  2. 将标准 Vue-loader 加载器替换为小程序平台的 Vue-loader;
  3. 适配和改造小程序与 H5 的底层 API 差异。

根据小程序开发平台提供的能力,我们*大程度地支持了 Vue.js 语法特性,但部分功能现阶段暂时尚未实现,具体见表 1。

%title插图%num

表 1 mpVue 暂不支持的语法特性

mpVue 框架的目标是将小程序和 H5 的开发方式通过 Vue.js 建立关联,达到*大程度的代码复用。但由于平台差异的客观存在(主要集中在实现机制、底层 API 能力差异),我们无法做到代码 100%复用,平台差异部分的改造成本无法避免。对于代码复用的场景,开发者需要重点思考如下问题并做好准备:

  1. 尽量使用平台无的语法特性,这部分特性无需转换和适配成本;
  2. 避免使用不支持的语法特性,譬如 slot、filter 等,降低改造成本;
  3. 如果使用特定平台 API,考虑抽象好适配层接口,通过切换底层实现完成平台转换。

mpVue *佳实践

在表 2 中,我们对微信小程序、mpVue、WePY 这三个开发框架的主要能力和特点做了横向对比,帮助大家了解不同框架的侧重点,结合业务场景和开发习惯,确定技术方案。对于如何更好地使用 mpVue 进行小程序开发,我们总结了一些*佳实践。

%title插图%num

表 2 框架主要能力及特性对比

  1. 使用 vue-cli 命令行工具创建项目,使用 Vue 2.x 的语法规范进行开发;
  2. 避免使用不框架不支持的语法特性,即有部分 Vue.js 语法在小程序中无法使用,尽量 mpVue 和 Vue.js 共有特性;
  3. 合理设计数据模型,对数据的更新和操作做到细粒度控制,避免性能问题;
  4. 合理使用组件化开发小程序,提高代码复用。

结语

mpVue 框架已经在业务项目中得到实践和验证,目前开发文档也已经就绪,正在做开源前的*后准备,希望能够为小程序和 Vue.js 生态贡献一份力量。mpVue 的初衷是希望让 Vue.js 的开发者以低成本接入小程序开发,其能力和使用体验还有待进一步的检验。我们未来会继续扩展现有功能、解决用户的问题和需求、优化开发体验、完善周边生态建设,以帮助到更多的开发者。

需要说明一下,mpVue 是通过 fork Vue.js 源码进行二次开发,新增加了 mp 平台的 Vue.js 实现,我们保留了跟随 Vue.js 版本升级的能力,希望未来能够实现更好的能力增强,*后感谢 Vue.js 框架和微信小程序对业界带来的便利

项目前端Vue.js环境搭建

*近在考虑搭建个人网站,想了想决定采用前后端分离模式

前端使用Vue,负责接收数据

后端使用Spring Boot,负责提供前端需要的API

就这样开启了我边学习边实践之旅

 

 

Vue环境搭建步骤:

1、安装node.js

a)进入node.js官网(https://nodejs.org/en/download/),选择对应版本下载,并进行安装(安装时,按照提示,一直next)

b)验证node.js是否有安装好:打开命令行窗口,输入node -v,会返回对应的node.js版本号

%title插图%num

c)npm包管理器是集成在node.js中,在安装node.js时已安装了npm,所以不需要特别再安装,在命令行窗口中,输入npm -v,即可得到npm版本号

%title插图%num

d)输入以下命令npm -g install npm,可更新npm至*新版本

%title插图%num

2、安装cnpm

a)输入以下命令npm install -g cnpm –registry=https://registry.npm.taobao.org,使用npm国内镜像(https://npm.taobao.org/)

%title插图%num

3、使用安装vue脚手架vue-cli

a)输入以下命令cnpm install -g vue-cli,安装脚手架

%title插图%num

b)输入以下命令vue -V,查看vue版本号

%title插图%num

 

创建项目:

可自定义将项目创建到某个路径下(Eg:G:\workspace-vue)

a)通过命令进入该路径

%title插图%num

b)输入以下命令新建项目vue init webpack annewebsite,执行后会自动生成vue项目

%title插图%num

%title插图%num

c)在实体目录下进行查看

%title插图%num

 

安装项目依赖:

以上通过脚手架创建的vue项目,还不能直接运行,需要加载上项目需要的依赖包才能运行

a)通过命令进入到项目所在目录(G:\workspace-vue\annewebsite)

%title插图%num

b)输入以下命令cnpm install,安装项目所需的依赖包

%title插图%num

 

运行项目:

项目已经配置完毕,可以开始运行项目,看一看初始效果了

a)通过命令进入到项目所在目录(G:\workspace-vue\annewebsite)

b)输入以下命令npm run dev,来运行项目

%title插图%num

%title插图%num

c)在浏览器中访问项目,查看效果

%title插图%num

 

备注:

以上就是整个项目的环境搭建过程,可以在工具中查看项目目录,后续的开发工作都将在src目录下进行

%title插图%num

 

求问 vscode 格式化 vue 代码的*佳方法是什么?

当我格式化 vue 代码时,方法格式化效果为:a() {}
但是这样在运行时提示格式不正确,本该格式化为 a () {} 请问该如何操作?

提供参考:我在 Jetbrains 上,使用配置了 ESLint 的项目,使用 Fix ESLint Problems 可以格式化代码
Track13 2
Track13 9 小时 9 分钟前 via Android
cli 创建项目的时候你选的 Standard Style?
https://standardjs.com/
zhuweiyou 3
zhuweiyou 9 小时 2 分钟前
prettier 插件
renmu123 4
renmu123 8 小时 56 分钟前 via Android
安装 vetur 插件。或 npm 安装 prettier 后配置文件,设置为保存时自动格式化
AeroXu 5
AeroXu 8 小时 14 分钟前
Vetur 可以读取你的 prettier 配置,然后格式化。另外 prettier 也可以格式化 vue 文件。
noqwerty 6
noqwerty 7 小时 52 分钟前
哈哈哈哈换了个问法真的没人喷你了
devld 7
devld 7 小时 35 分钟前 via Android
vetur 可以配置 js/ts 格式化器。prettier 貌似不能配置方法名后面的空格,默认没空格;如果用 vscode 自带的格式化器,可以配置方法名后面的有没有空格。

报错是因为 eslint 的规则,我用 prettier 时,直接把这个规则禁用掉了。
wozhihuipinyin 8
wozhihuipinyin 6 小时 55 分钟前 via Android
拷一份大佬的配置文件,eslint 再也不会报错了?
jimliang 9
jimliang 4 小时 59 分钟前
eslint auto fix

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速