We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
微店前端工程化起步于一个内部产品 vbuilder,对外我们有一个开源版本 bio-cli。
去年我们也写过一篇文章介绍该产品: bio: 一站式前端开发工具。
这么长时间过去了,我们在前端工程化方面有了哪些变化、遇到了哪些问题、用怎样的方案解决这些问题等等,值得为大家再分享。
这里也就是介绍下背景,为什么我们会开发 vbuilder。
总体思路就是:将重复性工作集成化。
当时,团队面临几个问题:
packge.json
总结为下图:
基于以上问题,我们开始了 vbuilder 的研发。
最终产品以命令行的形式发布。
此时的 vbuilder 为 V0.0 状态。
vbuilder V1.0 提供了以下能力:
mock / update / help
vue / react / angular / weex
vbuilder 的不断推进下,我们欣喜地看到,团队发生了一些变化:
weex / vms / 后台管理 / serverside project
V1.0 出现后,推进的很顺利,在推进过程中秉持如下原则:
V1.0 基本解决了以下角色的痛点:
封闭性
高度定制化的工程配置需求实现难度增大
脚手架配置的主题被隐藏,虽然仍然开放给开发者一些配置性文件,对于高度定制化的配置需求而言依然杯水车薪。
此时,就必须新开一个脚手架,重新接入 vbuilder 体系。
在 “开放性” 来说,打了折扣。
插件开发的冲突
由于 vbuilder 是基于命令行开发,插件开发者扩展自定义命令式,依然是自定义命令行,团队规模不断扩大的状态下,很容易出现不同插件使用同一个命令,被同时安装的状态下,重复执行该命令。
V2.0 至少要解决 V1.0 存在的问题,同时需要有更明确的发展方向。
不过,V2.0 依然基于命令行。
V1.0 的思路是 “闭合”,虽然有一定的开放性,但仍然不够。
V2.0 新增 “开放” 的能力,脚手架配置可以被隐藏,也可以随时在需要的时候暴露在工程配置中,进行定制化开发。
当然,会遇到脚手架难以统一管理的问题,这一点仍然有办法可以解决。
因为被暴露的工程配置是 vbuilder 提供的,vbuilder 得以方便地统计哪些项目使用了自定义的脚手架,将通用型工具包下发给该工程。
问题 1:插件间的冲突
举个例子,有两个插件中,都有一个命令 run。如果用户安装了这两个插件,在执行 run 命令的时候,两个插件的逻辑均会触发。
run
在某些情况下,这不是用户希望看到的场景,可能 TA 希望的只是运行插件 A 的命令 run。
问题 2:插件命令集与内置命令的冲突
例如,内置命令集中有命令 init,而某个插件也有 init。
init
那么在用户执行 init 命令时,依然会执行两遍逻辑。
怎样解决?
我们组合使用了以下方案:
vbuilder 检测是否有重复命令,如有,提示用户是都运行、还是选择运行某一个插件中的命令
为命令圈定生效条件
vbuilder 的命令行基于 commander。我们基于 commander 扩展了一些方法。
commander
假如我们希望,插件中的命令 show 只在工程目录中 xx.show 文件存在的情况下生效,那么代码如下:
show
xx.show
commander .command('show [param]') .effect(cwd => fs.existsSync(path.join(cwd, 'xx.show'))) ---- 这是我们扩展的命令 .description('我的自定义命令') .action((param, options) => { console.log('my show'); });
为内置命令集声明其为“内置命令”,插件命令可以阻止内置命令执行
假如插件中有个命令 init,而 vbuilder 内置命令中也有 init,我们希望插件中的 init 命令生效,内置命令不生效,该怎么做呢?
我们扩展了 commander 的 2 个方法:declareDefault 声明内置命令、preventDefault 阻止内置命令执行。
declareDefault
preventDefault
定义内置命令时,代码如下:
commander .command('init [param]') .declareDefault() --- 声明内置命令 .description('内置的 init 命令') .action((param, options) => { console.log('init inside'); });
开发插件命令时,代码如下:
commander .command('init [param]') .preventDefault() --- 阻止内置命令执行 .description('内置的 init 命令') .action((param, options) => { console.log('init inside'); });
Commander 的源码只有 1000 行左右,逻辑还是很清晰的,扩展起来非常方便,这里不再列举实现。
Commander
在命令行这个场景下,我们把 vbuilder 定义为公司内部开发的一个“水电煤”性质的基础设施。
通过 vbuilder,我们新增了以下场景:
得益于插件化,通过充分调动开发者积极性,我们可以将其能力无限延展。
我们目前还没有进入 3.0 的开发,但有一些方向是我们可以尝试的:
这是目前我们在微店前端工程化领域的一些实践和思考,希望对大家有帮助。
The text was updated successfully, but these errors were encountered:
No branches or pull requests
微店前端工程化起步于一个内部产品 vbuilder,对外我们有一个开源版本 bio-cli。
去年我们也写过一篇文章介绍该产品: bio: 一站式前端开发工具。
这么长时间过去了,我们在前端工程化方面有了哪些变化、遇到了哪些问题、用怎样的方案解决这些问题等等,值得为大家再分享。
V0.0
这里也就是介绍下背景,为什么我们会开发 vbuilder。
总体思路就是:将重复性工作集成化。
当时,团队面临几个问题:
packge.json
中的依赖既有脚手架的依赖,也有业务依赖,难以区分总结为下图:
基于以上问题,我们开始了 vbuilder 的研发。
最终产品以命令行的形式发布。
此时的 vbuilder 为 V0.0 状态。
V1.0
vbuilder V1.0 提供了以下能力:
mock / update / help
等vue / react / angular / weex
等),开放接入不同技术栈vbuilder 的不断推进下,我们欣喜地看到,团队发生了一些变化:
weex / vms / 后台管理 / serverside project
等总结为下图:
V1.0 出现后,推进的很顺利,在推进过程中秉持如下原则:
V1.0 基本解决了以下角色的痛点:
V1.0 的问题
封闭性
脚手架配置的主题被隐藏,虽然仍然开放给开发者一些配置性文件,对于高度定制化的配置需求而言依然杯水车薪。
此时,就必须新开一个脚手架,重新接入 vbuilder 体系。
在 “开放性” 来说,打了折扣。
插件开发的冲突
由于 vbuilder 是基于命令行开发,插件开发者扩展自定义命令式,依然是自定义命令行,团队规模不断扩大的状态下,很容易出现不同插件使用同一个命令,被同时安装的状态下,重复执行该命令。
V2.0
V2.0 至少要解决 V1.0 存在的问题,同时需要有更明确的发展方向。
不过,V2.0 依然基于命令行。
V2.0 如何解决封闭性问题
V1.0 的思路是 “闭合”,虽然有一定的开放性,但仍然不够。
V2.0 新增 “开放” 的能力,脚手架配置可以被隐藏,也可以随时在需要的时候暴露在工程配置中,进行定制化开发。
当然,会遇到脚手架难以统一管理的问题,这一点仍然有办法可以解决。
因为被暴露的工程配置是 vbuilder 提供的,vbuilder 得以方便地统计哪些项目使用了自定义的脚手架,将通用型工具包下发给该工程。
V2.0 如何解决插件开发的冲突
问题 1:插件间的冲突
举个例子,有两个插件中,都有一个命令
run
。如果用户安装了这两个插件,在执行run
命令的时候,两个插件的逻辑均会触发。在某些情况下,这不是用户希望看到的场景,可能 TA 希望的只是运行插件 A 的命令
run
。问题 2:插件命令集与内置命令的冲突
例如,内置命令集中有命令
init
,而某个插件也有init
。那么在用户执行
init
命令时,依然会执行两遍逻辑。怎样解决?
我们组合使用了以下方案:
vbuilder 检测是否有重复命令,如有,提示用户是都运行、还是选择运行某一个插件中的命令
为命令圈定生效条件
vbuilder 的命令行基于
commander
。我们基于commander
扩展了一些方法。假如我们希望,插件中的命令
show
只在工程目录中xx.show
文件存在的情况下生效,那么代码如下:为内置命令集声明其为“内置命令”,插件命令可以阻止内置命令执行
假如插件中有个命令
init
,而 vbuilder 内置命令中也有init
,我们希望插件中的init
命令生效,内置命令不生效,该怎么做呢?我们扩展了
commander
的 2 个方法:declareDefault
声明内置命令、preventDefault
阻止内置命令执行。定义内置命令时,代码如下:
开发插件命令时,代码如下:
Commander
的源码只有 1000 行左右,逻辑还是很清晰的,扩展起来非常方便,这里不再列举实现。V2.0 的新功能
在命令行这个场景下,我们把 vbuilder 定义为公司内部开发的一个“水电煤”性质的基础设施。
通过 vbuilder,我们新增了以下场景:
得益于插件化,通过充分调动开发者积极性,我们可以将其能力无限延展。
V3.0
我们目前还没有进入 3.0 的开发,但有一些方向是我们可以尝试的:
这是目前我们在微店前端工程化领域的一些实践和思考,希望对大家有帮助。
The text was updated successfully, but these errors were encountered: