移动互联网的爆发以及响应式页面的尴尬症,开发web和mobile项目成为了标配,固然实际状况下,会有更多的项目。php
多项目开发对于前端来讲是个很大的挑战
✦ 重复,重复的前端架构,重复的前端依赖,重复的工具函数等
✦ 局限,不一样后台有不一样的规则,“因地制宜”真难受,刚伺候好rails
又忽然来个php
✦ 最优,后台工程作前端构建,老是显得不够“最优”。前端
因此,咱们须要单独抽离出前端开发项目,按照前端的方式来组织代码,经过构建工具来对前端资源文件作最优处理
那么新问题来了,如何管理这个快速迭代,频繁更新的前端项目呢?
✦ 做为单独的项目管理?
✦ 用git submodule or git subtree管理?git
多个后台项目:qdaily4_web/moible/app
前端项目:qdaily4_feboierplate
web
✦ 在qdaily4_feboierplate
项目中修改前端代码
✦ 构建qdaily4_feboierplate
项目,输出到qdaily4_web/mobile/app
✦ 提交qdaily4_feboierplate
项目的改动
✦ 在qdaily4_web/mobile/app
项目中修改后台代码
✦ 提交qdaily4_web/mobile/app
项目的改动,其中包括qdaily4_feboierplate
项目构建输出的文件shell
这种开发模式解耦了前端项目和后台项目,前端项目严格按照前端的代码结构去组织代码,可以实现模块化,按需加载,就近原则,图片压缩等功能。缺陷在于须要频繁的切换项目提交代码。vim
为了解决频繁切换项目的问题,调研了git submodule和git subtree以后,选择用git subtree来解决这个问题。架构
qdaily4_feboierplate
做为qdaily4_web/mobile/app
的子项目,别名appfe
✦ 在appfe
项目中修改前端代码
✦ 构建appfe
项目,输出到qdaily4_web/mobile/app
✦ 提交qdaily4_web/mobile/app
项目的改动(也会记录appfe项目的改动)
✦ 使用git subtree命令提交appfe
的改动到qdaily4_feboierplate
app
引入git subtree以后,再也不感受是在开发两个项目,不须要频繁的切换项目提交代码,只须要使用git subtree命令就能够实现qdaily4_feboierplate
项目的双向更新,快速开发。缺陷在于存在多个qdaily4_feboierplate
项目的拷贝。前端构建
前端项目qdaily4_feboierplate
是做为子git被包含到多个后台项目中,咱们经过git subtree pull & git subtree push
实现qdaily4_feboierplate
的双向更新,对于不稳定且须要快速迭代的模块代码恰到好处。模块化
利用git subtree来管理前端模块项目和多个后台环境项目,能够有效快捷的实现前端模块项目快速开发,双向更新,配合上前端构建系统,简直爽翻了。
使用appfe
做为git@bitbucket.org:qdaily/qdaily4_feboierplate
仓库的别名
✦ 直接命令行输入:
git remote add appfe git@bitbucket.org:qdaily/qdaily4_feboierplate.git
✦ 也能够经过配置.git/config
文件:
[remote "appfe"] url = git@bitbucket.org:qdaily/qdaily4_feboierplate fetch = +refs/heads/*:refs/remotes/appfe/*
git subtree pull
和 git subtree push
是须要频繁使用的命令,咱们能够经过自定义来让git指令更简单更好记
✦ 直接命令行输入
git subtree pull --prefix=appfe appfe master git subtree push --prefix=appfe appfe master
✦ 也能够配置.git/config
让git subtree的命令更简单!
:表示外部命令而不是git命令,至关于直接在shell中运行!
后的组合命令。$1
:表示shell传进来的第一个参数,好比git stpull demo/xxx
,那么$1
就是demo/xxx
。:
:组合命令尾部的:
很神奇,没有它,最后一个指令不会运行,因此它起到一个占位的做用。
第二版Tip:
✦ 能够看出,若是当前分支没有stash的东西,这个组合命令会出现问题,还未想到解决方案,有了解的人能够留言指出。
// 第二版
// git stpull demo/xxx // git stpush demo/xxx [alias] stpull = !git stash \ && git subtree pull --prefix=appfe appfe $1 \ && git stash pop \ && : stpush = !git stash \ && git subtree push --prefix=appfe appfe $1 \ && git stash pop \ && :
第三版Tip:
✦ 放弃了stash,让用户本身去处理stash相关的事情。
✦ 使用两个参数,表示子项目目录和分值名称,这样能够兼容处理多个子项目,不一样分支的状况。
✦ 使用git subtree split --rejoin
,解决了每次提交都须要重头遍历commits耗时过长的问题。
✦ 每次git subtree push
以前都先git subtree pull
,是为了解决错误时机git subtree split
致使push失败。
✦ 初次运行时,远端没有demo/xxx分支,须要使用git subtree push -P appfe demo/xxx
新建远端分支。
// 第三版 // git stpull appfe demo/xxx // git stpush appfe demo/xxx [alias] stpull = !git subtree pull --prefix=$1 appfe $2 \ && : stpush = !git subtree pull --prefix=$1 appfe $2 \ && git subtree split --rejoin --prefix=$1 $2 \ && git subtree push --prefix=$1 appfe $2 \ && :
自定义git指令对于一些常使用的长命令颇有效,强烈建议使用!
学习过程当中遇到什么问题或者想获取学习资源的话,欢迎加入学习交流群343599877,咱们一块儿学前端!