最近有空,准备写个系列教程,把公司目前在用的h5项目从搭建到实践优化的一些心得和经验记录一下,技术栈是vue2.x的,马上3.0正式版就要出了,再不写就要过时啦哈哈。
github传送门:
1、h5主项目
2、项目脚手架
3、子项目模板
我司h5主要做移动端,运行在app和小程序里,也就是hybrid app混合开发模式。
刚来公司时,公司h5才刚开始起步,同事只开发了三个h5需求,这三个需求在业务功能上都是相互独立的,所以也分开放在了三个spa项目里。。。想一想,以后开发类似需求越来越多,难道要写n个项目吗,所以有必要设计一个多项目聚合方案。
我感觉今年随着qiankun2.0的发布,微前端概念突然火了很多,我记得去年也就是19年的时候还没那么火呢,不过这确实是未来前端发展的一个方向。
在前公司的时候,有配合过后端做过微服务迁移的需求,对后端的微服务有一定的了解,后端一般是把接口划分为一些模块,每个模块就是一个微服务粒度,比如user、goods,每个模块都可以单独启动、单独修改发布。
而微前端也是借鉴后端的微服务化,把前端根据功能划分成几个相对独立的子项目,可以单独编译发布。
本项目,可以说是简易的微前端项目,因为只适用于vue技术栈,也可以说基于vue的多项目聚合方案。
技术栈选择呢,由于之前已做需求都是vue写的,也对vue相对更加熟悉,所以就选定vue作为基础框架,也便于项目搭建完成后把之前项目迁移进来,整体架构也是借鉴了前公司的方案。
整体上是基于vue-cli4生成的项目进行改造搭建,根据业务划分为多个不同的子项目,
├── build // webpack相关配置
├── src // 核心源代码
│ ├── projects // 存储所有子项目
│ │ ├── demo // 子项目目录名
│ │ │ ├── components // 子项目公共组件
│ │ │ ├── static // 不打包的js目录
│ │ │ ├── store // vuex存储
│ │ │ ├── utils // 公共js
│ │ │ │ ├── importVant.js // vant按需引入
│ │ │ │ └── routerGuards.js // 路由导航守卫
│ │ │ ├── views // 页面源码
│ │ │ ├── config.js // 子项目配置文件
│ │ │ └── main.js // 子项目入口文件
│ │ └── ...... // 其他子项目
│ ├── resources // 存储全局公共资源
│ │ ├── assets // 全局公共图片等
│ │ ├── components // 全局公共组件
│ │ ├── mixins // 全局mixins混入
│ │ ├── styles // 全局公共样式
│ │ ├── native // 原生客户端交互封装
│ │ │ ├── callNative.js // 调用客户端方法
│ │ │ ├── openNative.js // 跳转客户端页面
│ │ │ ├── regNative.js // 注册js方法给客户端
│ │ ├── utils // 全局公共js
│ │ │ ├── flexible.js // rem适配
│ │ │ ├── globalGuards.js // 全局路由导航守卫公共方法
│ │ │ ├── polyfill.js // 手动添加的polyfill降级方法
│ │ │ └── request // 全局接口请求相关
├── .env // 全局环境配置
├── .env.beta // beta环境配置
├── .env.dev // 本地环境配置
├── .env.prod // 线上环境配置
├── .env.test // test环境配置
这样,不同的业务需求可以通过创建不同的子项目来开发,resources里有公共资源方法可以共用,例如公共样式、公共方法、客户端交互等等。
1、利于风险分散。子项目可以单独发布,即使代码修改有严重bug,发布后也只会影响这次发布的子项目,未发布的也就是之前已通过测试上线的可以照常运行。
2、利于多人开发。在业务需求繁多、开发人员较多的时候,很多需求就需要并行开发,一个需求分配几个开发人员,并行在一个统一项目下进行开发,这样就可以通过子项目的独立开发而互不影响,同时也只能方便使用公共资源和组件,保证并行开发的效率。
由于项目的运行及打包需要指定选择一个子项目,为了提高命令使用效率,就做了个配套的脚手架工具,使用nodejs编写,主要用于创建子项目、子项目启动、打包等命令,可以指定子项目名和服务端环境。
同时也创建了个子项目模板,便于快速生成一个子项目,以及做子项目使用引导。
github地址见文章开头,业务相关代码已做清理。