写了个 VS Code 中实时预览 Vue/React 组件的插件 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
jawei
V2EX    分享创造

写了个 VS Code 中实时预览 Vue/React 组件的插件

  •  5
     
  • jawei 2022-03-16 10:21:16 +08:00 4378 次点击
  • 这是一个创建于 1310 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近年纪大了喜欢胡思乱想,前段时间突然想到能不能在 VS Code 中实现组件的所见即所得,于是折腾了两个月终于做出了能实现这个效果的插件,如图:

    支持实时预览 Webpack/Vite 开发时下的 React/Vue 组件( Angular 应该也能,但是我还没用过,所以没做支持)。

    使用方式

    按参考文档安装并使用插件:https://github.com/jaweii/AutoPreview

    然后你就可以写组件时实时预览当前组件:

    还可以把可复用组件 /物料的用例整理在一个预览专用的文件里:

    在 OUTPUT 面板切到 AutoPreview 来打印调试:

    断点功能:emmm...? 我也想有...

    把预览面板拖到底部来预览比较宽的组件:

    实现方式

    一开始我是只想实现 Webpack+React 的组件预览的,尝试了从 Webpack 配置着手来实现,但是发现这条路走不通,依赖关系太错综复杂了,搁置几天后想到了我以前 Vue-Layout 项目中组件重新挂载的思路,几番尝试后找到实现的关键,即通过 Webpack 和 Vite 都提供的 import api 来异步加载当前窗口文件路径的组件,然后重新挂载到预览窗口,即可实现预览。

    所以其本质上和你给项目新增个路由来显示当前页面中的组件一样,只是插件自动帮你做了。

    而因为使用了 Webpack 和 Vite 都提供的 import api ,使用这两种构建工具开发时,所有的前端框架理论上都可以实现在 VS Code 中渲染项目组件实现预览。

    延伸

    现在我也只是写了几个 Demo 来测试插件效果,对实际开发过程中是有增效还是鸡肋我也不确定,只是感兴趣就做了。

    在做的过程中也有一些思考:

    如果给可预览的组件分级,那么有

    • 基础组件
    • 物料(基础组件、元素、业务逻辑之间的组合,比如登录框)
    • 页面

    这三种级别。

    基础组件

    通常实际项目中,基础组件是来自内部或第三方组件库,高复用,低耦合,其提供的文档已经能够预览组件效果,针对这类组件的 IDE 内预览似乎意义并不是很大;

    物料

    物料则是根据产品需求对基础组件、元素、业务逻辑进行组合的产物,这类物料有的是项目内可复用的,有的是项目内没有复用但是跨项目存在复用,有的是业务定制完全不可复用的。

    实际项目的协同中,物料也是最容易被重复写的,且随着项目越来越大其会散落在各个内页,没有一个展示页来让不同开发者知道哪些物料是已经有了的,就会造成重复造物料。对于这个问题,阿里飞冰、京东 JD WORK 这样的开发链工具是一种解决方案,其提供的物料制作、发布、使用一条龙服务可以很大程度上避免重复造物料,是个重武器。

    我想到了个轻武器的方案,即针对物料的 IDE 内预览,若合理约定、使用,或许也会是改善重复造物料问题的一个方案。比如约定开发者对可复用的物料导出预览,这样插件可以列出所有可预览的组件供其他开发者浏览,其他开发者开发新物料前,先在预览列表看看有没有可复用的,如果有直接参考复用或 CV 定制,没有再自己写。

    页面

    页面级则是复用性极低,不过 IDE 内预览 H5 页面倒也是种不错的体验,不用在浏览器和编辑器间切换,有点微信开发者工具的感觉。


    还有一点看法,如果组件的预览能够优化开发体验,我想并不是因为它能预览,而是因为其强制组件作者写预览函数,预览组件,天然需要为组件 props 传递 mock 数据,而 mock 的数据能供自己和其他开发者参考和 CV ,这是其提高代码可维护性,降低协同成本的很重要的原因。

    且如果预览函数能罗列出组件的多个用例,对于其他开发者来说是多么心旷神怡的事:


    25 条回复    2022-03-18 21:02:05 +08:00
    ShareManT
        1
    ShareManT  
       2022-03-16 10:53:26 +08:00
    有这种想法挺好的,支持一个,确实预览会比较方便。

    不过还有个 storybook 虽然不是 编辑器的插件 但是更成熟完善。
    MrTLJH
        2
    MrTLJH  
       2022-03-16 11:14:27 +08:00
    牛逼啊,但我不用 Vue/React/Angular 这些,年纪大了受不了写个前端还要编译打包之类的,老年人最多用用 JQ ,更多的是原生 JS 。哎~跟不上技术的节奏了
    murmur
        3
    murmur  
       2022-03-16 11:15:34 +08:00
    为什么要用这个呢,现实开发的属性很可能是外面传进来的,用户如果要预览直接开一个 hmr 就可以了
    yu7er
        4
    yu7er  
       2022-03-16 11:15:57 +08:00
    那个显示包版本的是啥插件呀
    RealJacob
        5
    RealJacob  
       2022-03-16 11:38:11 +08:00
    看文档需要改项目代码,感觉侵入性有点强啊。即使只是在入口处判断一下
    ccyu220
        6
    ccyu220  
       2022-03-16 11:59:20 +08:00
    如果不想开整个项目页面,Vue 和 React 也有单文件服务,你这个稍微复杂了些。
    jawei
        7
    jawei  
    OP
       2022-03-16 12:22:22 +08:00
    依赖错综复杂,最常用的场景,登录框组件文件里调用全局注册的 toast 弹框提示登录失败,单文件里没注册服务是跑不起来的
    jawei
        8
    jawei  
    OP
       2022-03-16 12:22:35 +08:00
    @ccyu220 依赖错综复杂,最常用的场景,登录框组件文件里调用全局注册的 toast 弹框提示登录失败,单文件里没注册服务是跑不起来的
    jawei
        9
    jawei  
    OP
       2022-03-16 12:25:28 +08:00
    @RealJacob 我也觉得有侵入性,目前也没有好的办法解决,我再想想怎么解决
    jawei
        11
    jawei  
    OP
       2022-03-16 12:27:52 +08:00
    @murmur emmm ,看着会比较酷 哈哈哈哈
    jawei
        12
    jawei  
    OP
       2022-03-16 12:28:17 +08:00
    @MrTLJH 哎 不服老不行啊
    jawei
        13
    jawei  
    OP
       2022-03-16 12:30:43 +08:00
    @ShareManT 谢谢
    Storybook 就是我说的基础组件的文档,针对这里面的组件 IDE 内预览确实没什么意义,(装下逼还是可以的吧哈哈哈哈)
    equt
        14
    equt  
       2022-03-16 12:53:17 +08:00 via iPhone
    ycr6708536
        15
    ycr6708536  
       2022-03-16 13:25:36 +08:00
    实际业务开发中,预览 page 级别是可行的,组件不太可行,举个例子:props 参数、eventbus 的数据都用不到。
    还有一个问题如何支持各种编译配置( typescript 、babel 、scss )等。
    综上学习不错,实际使用场景比较受限。
    jawei
        16
    jawei  
    OP
       2022-03-16 14:19:02 +08:00
    @equt 看起来这个还没有发布,似乎和我这个思路不一样,只支持 Vite
    jawei
        17
    jawei  
    OP
       2022-03-16 14:22:31 +08:00
    @ycr6708536 这个实现方式,不会有“如何支持各种编译配置( typescript 、babel 、scss )”的问题
    jin5354
        18
    jin5354  
       2022-03-16 18:32:18 +08:00
    支持分享。。但是当我在写 UI 时,我必然是对着浏览器开发啊。。那么我有什么场景需要在编辑器上看效果呢。。还会占用 IDE 的空间。。
    jawei
        19
    jawei  
    OP
       2022-03-16 19:30:19 +08:00
    @jin5354 我的看法是看法是,一切都是组件,你写评论框组件的时候是没有必要看到 Header 、Article 之类的内容的,甚至是分散注意力的,写好后最后才在浏览器看看组件被组合使用的效果。

    空间也没怎么占用太多吧
    hxse
        20
    hxse  
       2022-03-16 19:43:06 +08:00
    要是可以传自定义的测试数据, 可能会更实用一些, 用来测试组件不错
    jawei
        21
    jawei  
    OP
       2022-03-16 19:58:56 +08:00
    @hxse 传自定义的测试数据是什么意思?
    hxse
        22
    hxse  
       2022-03-16 21:43:26 +08:00
    @jawei 就是 props 啦, 可以自己定义一下
    jawei
        23
    jawei  
    OP
       2022-03-16 23:42:12 +08:00
    @hxse 可以传呀
    taowen
        24
    taowen  
       2022-03-17 08:15:24 +08:00
    @jawei 解开依赖的办法就是让渲染的部分不去引用乱七八糟的东西,从而让 preview 可以随机生成数据,只跑渲染。那怎么描述不依赖乱起八糟的纯渲染呢?可以参考 solidjs 的 https://www.solidjs.com/docs/latest/api#%3Cswitch%3E%2F%3Cmatch%3E 做法。就是把 JSX/TSX 降级,用标签来表达 for 和 switch ,从而使得 JSX/TSX 里不会引用除数据之外的依赖。或者用 vue 模板,就只做 vue 模板的可视化就好了。
    taowen
        25
    taowen  
       2022-03-18 21:02:05 +08:00
    和 @jawei 聊完了一下,想了个办法 https://zhuanlan.zhihu.com/p/483407886 不启动整个应用,单独预览某一个 vue 组件
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     946 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 19:45 PVG 03:45 LAX 12:45 JFK 15:45
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86