当前位置: 首页 > 编程日记 > 正文

前端项目如何管理

前端项目如何管理

前端项目的管理分为两个维度:项目内的管理与多项目之间的管理。

1. 项目内的管理

在一个项目内,当有多个开发者一起协作开发时,或者功能越来越多、项目越来越庞大时,保证项目井然有序的进行是相当重要的。

一般会从下面几点来考证一个项目是否管理得很好:

  • 可扩展性:能够很方便、清晰的扩展一个页面、组件、模块
  • 组件化:多个页面之间共用的大块代码可以独立成组件,多个页面、组件之间共用的小块代码可以独立成公共模块
  • 可阅读性:阅读性良好(包括目录文件结构、代码结构),能够很快捷的找到某个页面、组件的文件,也能快捷的看出项目有哪些页面、组件
  • 可移植性:能够轻松的对项目架构进行升级,或移植某些页面、组件、模块到其他项目
  • 可重构性:对某个页面、组件、模块进行重构时,能够保证在重构之后功能不会改变、不会产生新 bug
  • 开发友好:开发者在开发某一个功能时,能够有比较好的体验(不好的体验比如:多个文件相隔很远)
  • 协作性:多人协作时,很少产生代码冲突、文件覆盖等问题
  • 可交接性:当有人要离开项目时,交接给其他人是很方便的

1.1 可扩展性

对于前端项目而言,可扩展性是并不难的,因为很多时候前端的代码、文件分块都是按照页面来的,所以天然就是一块一块的。

但这里还是要提一下,因为有些开发者不喜欢分块,把应该分块的东西杂揉在一起,比如:

- src/- main/                    # main 目录- css/                   # css 集合- alpha.css- beta.css- ...- js/                    # js 集合- alpha.js- beta.js- ...    - alpha.html             # alpha 页面- beta.html              # beta 页面- ...

更好的方式:

- src/- main/                    # main 目录- alpha/                 # alpha 页面- index.css            # css 入口文件- index.js             # js 入口文件- index.html           # html 入口文件- ...- beta/                  # beta 页面- index.css- index.js- index.html- ...- ...

使前端项目具有高可扩展性,一般从目录文件结构入手,可以参考:目录结构优化。

1.2 组件化

这里的组件化是项目内的组件化,我们可以把多个页面之间共用的大块代码独立成组件,多个页面、组件之间共用的小块代码独立成公共模块。

这样做的目的是为了提高代码的可重用性,避免重复造轮子。另外,也有利于代码之间的解耦。

比如:

- src/- data/                    # 常量、静态数据目录- data1.js          - data2.js- ...          - components/              # 组件目录- componnet1/          - componnet2/- ...          - utils/                   # 工具函数目录- util1.js          - util2.js- ...     - ...     

可以参考:组件化。

1.3 可阅读性

这里的可阅读性有两个方面:目录文件结构、代码结构。

1.3.1 目录文件结构

目录文件结构可阅读性的好与否除了跟开发者有关系外,跟项目的搭建者也有很大的关系,因为如果搭建者在最初就定义好整个项目的目录结构,对后期的开发者是一个很好的约束。

可阅读性比较差的目录文件结构:

- src/- css/                     # css 集合- main/                  # main 目录- alpha.css- beta.css- ...- js/                      # js 集合- main/                  # main 目录- alpha.js- beta.js- ...- html/                    # html 集合- main/                  # main 目录        - alpha.html           # alpha 页面- beta.html            # beta 页面- ...

可阅读性比较好的目录文件结构:

- src/- main/                    # main 目录- alpha/                 # alpha 页面- index.css            # css 入口文件- index.js             # js 入口文件- index.html           # html 入口文件- ...- beta/                  # beta 页面- index.css- index.js- index.html- ...- ...

关于目录文件结构的高可读性,可以参考:目录结构优化。

1.3.2 代码结构

代码结构的可阅读性大部分取决于开发者的水平,但我们可以使用工具帮助开发者书写规范、格式良好的代码。

主要有下面的工具:

  • .editorconfig: 统一每个开发人员的编辑器配置
  • eslint: 检查 js 语法(包括 jsx 语法),然后最大程度的矫正不符合规范的代码
  • stylelint: 检查 css 语法(包括 less, scss 语法),然后最大程度的矫正不符合规范的代码
  • prettier: 代码格式优化
  • husky + lint-staged: 强制开发人员对代码进行检查、自动矫正与优化

上面的具体用法可以参考:

  • 怎样提升代码质量
  • 搭建自己的前端脚手架

1.4 可移植性

可能的情况下,让项目具有一定的伸缩性,可以在未来轻松的对项目进行架构升级。

让项目能够轻松的移植某些页面、组件、模块到其他项目,需要对整个项目代码尽量的解耦与模块化。另外,也与后面会讲到的“项目之间的统一性”有关。

1.5 可重构性

对页面、组件的重构是常有的事,但怎样保证在重构之后功能不会改变、不会产生新 bug,这就得靠测试用例了。

  • js 模块:jest / mocha / tape / ava
  • React 组件:enzyme + jest,另外可以使用 react-testing-library 代替 react-dom/test-utils
  • Vue 组件:vue-test-utils + jest / mocha / tape / ava

可以参考:

  • react 前端项目技术选型、开发工具、周边生态
  • vue 前端项目技术选型、开发工具、周边生态

1.6 开发友好

这主要是从目录结构优化着手,比如:

像下面这种目录结构,如果要编辑一个页面,需要到处找页面相关的文件,编辑器上就会形成一个很长的目录树,一点不友好:

- src/- css/                     # css 集合- main/                  # main 目录- alpha.css- beta.css- ...        # 中间有 30 个页面- js/                      # js 集合- main/                  # main 目录- alpha.js- beta.js- ...        # 中间有 30 个页面- html/                    # html 集合- main/                  # main 目录        - alpha.html           # alpha 页面- beta.html            # beta 页面- ...        # 中间有 30 个页面

而像下面这种目录结构,所有的文件都在一个目录下,找文件就很方便,而且很清晰:

- src/- main/                    # main 目录- alpha/                 # alpha 页面- index.css            # css 入口文件- index.js             # js 入口文件- index.html           # html 入口文件- ...- beta/                  # beta 页面- index.css- index.js- index.html- ...- ...

1.7 协作性

当项目变大、多人协作时,我们就需要管理好哪些是正在开发的代码、哪些是提交测试的代码、哪些是已经上线的代码、如何避免代码冲突与线上新代码被旧代码覆盖等等。

具体可以参考:web 项目如何进行 git 多人协作开发。

1.8 可交接性

当有人要离开项目时,就需要把他负责的代码交接给别人,但怎么样才能使交接是轻松愉快的?

那就是文档,包括注释文档、接口文档等。想想,如果没有文档,该怎样交接呢?

可以参考:api 接口管理工具。

2. 多项目之间的管理

多个项目之间,如何管理好项目之间联系,比如共用组件、公共模块等,保证快捷高效开发、不重复造轮子,也是很重要的。

一般会从下面几点来考证多个项目之间是否管理得很好:

  • 组件化:多个项目共用的代码应当独立出来,成为一个单独的组件项目
  • 版本化:组件项目与应用项目都应当版本化管理,特别是组件项目的版本应当符合 semver 语义化版本规范
  • 统一性:多个项目之间应当使用相同的技术选型、UI 框架、脚手架、开发工具、构建工具、测试库、目录规范、代码规范等,相同功能应指定使用固定某一个库
  • 文档化:组件项目一定需要相关的文档,应用项目在必要的时候也要形成相应的文档

2.1 组件化

这里的组件化是项目之间的组件化,我们可以把多个项目共用的代码独立出来,成为一个单独的组件项目。

这样做的目的也是为了提高代码的可重用性,避免重复造轮子。另外,也便于版本化管理组件。

- project1/                  # 项目一- package.json- src/ - ...- project2/                  # 项目二- package.json- src/ - ...  - component1/                # 组件一- package.json- src/ - dist/ - ...- component2/                # 组件二- package.json- src/ - dist/ - ...    

project1 中使用 component1component2:

# package.json
{"dependencies": {"component1": "^0.0.1","component2": "^0.0.1"}
}import component1 from 'component1';
import component2 from 'component2';

常用组件有:

  • @yourCompany/utils: 工具类
  • @yourCompany/shortcut.css: 快捷 css 类
  • @yourCompany/data: 常用静态数据
  • ...

组件化一般会与私有 npm 仓库一起使用。

可以参考:

  • 组件化
  • 私有 npm 仓库

2.2 版本化

如果应用项目使用 npm 来管理依赖,就是版本化管理了。

组件项目更不用说了,值得提一下的是组件项目的版本号应当符合 semver 语义化版本规范。

版本格式:主版本号.次版本号.修订号,版本号递增规则如下:

  • 主版本号:当你做了不兼容的 API 修改,
  • 次版本号:当你做了向下兼容的功能性新增,
  • 修订号:当你做了向下兼容的问题修正。

先行版本号及版本编译元数据可以加到“主版本号.次版本号.修订号”的后面,作为延伸。

可以参考:

  • 从 1 到完美,写一个 js 库、node 库、前端组件库
  • 从 0 到 1 再到 100, 搭建、编写、构建一个前端项目

2.3 统一性

多个项目之间应当使用相同的技术选型、UI 框架、脚手架、开发工具、构建工具、测试库、目录规范、代码规范等,相同功能应指定使用固定某一个库。

这样做的目的是减少项目之间的环境差异,有利于项目之间的代码移植,也更有利于组件化、代码重用。

可以参考:

  • react 前端项目技术选型、开发工具、周边生态
  • vue 前端项目技术选型、开发工具、周边生态
  • 搭建自己的前端脚手架
  • 通用、封装、简化 webpack 配置

2.4 文档化

完善的文档,不管是对组件项目还是应用项目,都是很重要的。

组件项目需要用文档告诉开发者组件怎么用、有哪些接口;应用项目需要用文档来做小组交流、项目交接等。

后续

更多博客,查看 https://github.com/senntyou/blogs

作者:深予之 (@senntyou)

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

相关文章:

CMake学习(一)

什么是 CMake 你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不同的规范和标准,所执行…

【Codeforces】1104C Grid game (变异的俄罗斯方块)

http://codeforces.com/problemset/problem/1104/C 4 X 4 的方格 放置 1*2的矩形(用1表示)和2*1的矩形(用0表示) 只要有一行或者一列都填满了,就会自动消除,就可以放心的矩形了,只要不重叠就可…

如何创建.gitignore文件,忽略git不必要提交的文件

1、在需要创建 .gitignore 文件的文件夹, 右键选择Git Bash 进入命令行,进入项目所在目录。 2、输入 touch .gitignore ,生成“.gitignore”文件。 3、在”.gitignore” 文件里输入你要忽略的文件夹及其文件就可以了。(注意格式) …

软件安全访谈:ZipSlip、NodeJS安全性和BBS攻击

正如Nodejs Security WG成员和Snyk开发者布道师Liran Tal所写的那样,自BBS早期以来,这种漏洞利用的矢量攻击已经为人所知。InfoQ采访了Tal,了解了更多有关软件安全性(尤其是Nodejs安全性)的相关信息。今年早些时候&…

客户端与服务器的数据交互

毕设需要接粗到一些关于app和前端后端的东西,学习记录一下。 首先不要管安卓端还是苹果端,现在一般都是响应式的app,放到安卓或者苹果或者pc或者平板都是没有问题的。一般采用的是http接口通讯,或者socket连接。具体你要去查资料…

【Codeforces】908B New Year and Buggy Bot(暴力+全排列)

http://codeforces.com/contest/908/problem/B 0 1 2 3 可以对应 上下左右。(具体哪个对应哪个,试过才知道) str 的 长度 为 100,0 1 2 3 的全排列一共24种,最坏的情况可以看成遍历长为2400的字符串,不会…

swoole实现数据库连接池

2019独角兽企业重金招聘Python工程师标准>>> 原生 PHP CURD 让我们来回顾一下PHP中数据库的使用 <?php # curd.php$id 1;$dbh new PDO(); $stmt $dbh->prepare(SELECT * FROM user WHERE id:id); $stmt ->bindValue(:id, $id); $user $stmt->f…

bats-Bash自动化测试工具

本文分析了bats--Bash自动化测试工具的安装、语法、常用指令及常用函数等内容。上篇文章回顾&#xff1a;学习RAID 01/10/10E的区别bats 是一个符合 TAP 标准 的 Bash 版测试框架&#xff0c;它使用了一种极为简便的方法来验证命令行程序是否正常运行。bats 要求 Bash 的最低版…

ORB + OPENCV

一、介绍 假如有两张人物图片&#xff0c;我们的目标是要确认这两张图片中的人物是否是同一个人。如果人来判断&#xff0c;这太简单了。但是让计算机来完成这个功能就困难重重。一种可行的方法是&#xff1a; 分别找出两张图片中的特征点描述这些特征点的属性&#xff0c;比较…

【Codeforces】967C Stairs and Elevators (二分)。

http://codeforces.com/contest/967/problem/C 从一个地方到另一个地方&#xff0c;可以选择爬楼梯或者坐电梯 &#xff0c;前提是楼梯或者电梯存在。 n 楼层数 m 每一层的房间数 s 楼梯的数量 e 电梯的数量 v 电梯的速度 第2行是s个楼梯的位置 第3行是e个电梯的位置 …

webpack 最简打包结果分析

原文链接&#xff1a;https://ssshooter.com/2019-02... 现在的 webpack 不再是入门噩梦,过去 webpack 最让人心塞的莫过于配置文件&#xff0c;而 webpack4 诞生随之而来的是无配置 webpack。 使用 webpack4&#xff0c;至少只需要安装 webpack 和 webpack cli。所以大家完全可…

orb-slam2(学习笔记)+相机

单目&#xff08;Monocular&#xff09;、双目&#xff08;Stereo&#xff09;、深度相机&#xff08;RGB-D&#xff09; 深度相机能够读取每个像素离相机的距离 &#xff0c;单目相机 只使用一个摄像头进行SLAM的做法叫做单目SLAM&#xff08;Monocular SLAM&#xff09;,结构…

如何在nuget上传自己的包+搭建自己公司的NuGet服务器(新方法)

运维相关&#xff1a;http://www.cnblogs.com/dunitian/p/4822808.html#iis 先注册一个nuget账号https://www.nuget.org/ 下载并安装一下NuGetPackageExplorer&#xff1a;https://github.com/NuGetPackageExplorer/NuGetPackageExplorer 创建一个包&#xff08;vs其实也是可以…

【Codeforces】1080C Masha and two friends (棋盘染色)

http://codeforces.com/problemset/problem/1080/C 给定一个棋盘&#xff0c;&#xff08;1&#xff0c;1&#xff09;的位置是白色&#xff0c;观察可以知道&#xff0c;如果横纵坐标之和是偶数&#xff0c;那么是白色&#xff0c;奇数的话就是黑色。 只要算出染色以后白色方…

Java多线程001——一图读懂线程与进程

本博客 猫叔的博客&#xff0c;转载请申明出处前言 本系列将由浅入深&#xff0c;学习Java并发多线程。 一图读懂线程与进程 1、一个进程可以包含一个或多个线程。&#xff08;其实你经常听到“多线程”&#xff0c;没有听过“多进程”嘛&#xff09;2、进程存在堆和方法区 3、…

TermCriteria模板类

学习写vo过程中遇到的 类功能&#xff1a;模板类&#xff0c;作为迭代算法的终止条件。 构造函数&#xff1a; TermCriteria(int type,int maxCount,double epsilon); 参数说明&#xff1a; type 迭代终止条件类型 typeTermCriteria::MAX_ITER/TermCrite…

SQL优化快速入门

最近遇到一个专门进行SQL技术优化的项目&#xff0c;对很多既有的老存储过程进行调优&#xff08;现在已经不再新增任何存储过程&#xff09;&#xff0c;因此系统的对SQL语句编写进行一次科学的学习变得很有必要。这儿将基于黄德承大神的Oracle SQL语句优化一书&#xff0c;选…

【HDU】4509 湫湫系列故事——减肥记II (区间覆盖 暴力)

http://acm.hdu.edu.cn/showproblem.php?pid4509 给出的时间段是被占用的时间&#xff0c;24h 1440 min&#xff0c;求出这些区间以外的区间长度 把00&#xff1a;00 - 23&#xff1a;59 变成0-1440 1-5都是被占用的区域&#xff0c;暴力很好理解 #include <iostream>…

Java并发编程71道面试题及答案

Java并发编程71道面试题及答案 1、在java中守护线程和本地线程区别&#xff1f; java中的线程分为两种&#xff1a;守护线程&#xff08;Daemon&#xff09;和用户线程&#xff08;User&#xff09;。 任何线程都可以设置为守护线程和用户线程&#xff0c;通过方法Thread.setDa…

USB获取图像实时处理

手写&#xff36;&#xff2f;的准备工作&#xff0c;调用&#xff35;&#xff21;&#xff22;或者本地相机获取视频图像&#xff0c;读取并保存视频。 #include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" #include "openc…

常见数据库 性能

2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/u/582827/blog/778908

【Codeforces】1093C Mishka and the Last Exam

http://codeforces.com/problemset/problem/1093/C 已知b[i]求a[i]和a[n-i1]&#xff0c;n是a数组中元素的个数&#xff0c;a数组的下标从1开始 输出b[1]的时候&#xff0c;直接让a[1] 0&#xff0c;a[n] b[0] 接下来的每一组&#xff0c;先让a[i] b[i]&#xff0c;然后求…

PHP面试常考内容之Memcache和Redis(2)

你好&#xff0c;是我琉忆。继周一&#xff08;2019.2-18&#xff09;发布的“PHP面试常考内容之Memcache和Redis&#xff08;1&#xff09;”后&#xff0c;这是第二篇&#xff0c;感谢你的支持和阅读。本周&#xff08;2019.2-18至2-22&#xff09;的文章内容点为以下几点&am…

毫米波雷达、ADAS中的应用以及毫米波雷达的检测、测距、测速和角度测量

毫米波雷达的检测、测距、测速和角度测量 毫米波(Millimeter-Wave&#xff0c;缩写&#xff1a;MMW)&#xff0c;是指长度在1~10mm的电磁波&#xff0c;对应的频率范围为30~300GHz&#xff0e;根据波的传播理论&#xff0c;频率越高&#xff0c;波长越短&#xff0c;分辨率越高…

【VMC实验室】在QCloud上创建您的SQL Cluster(1)

在国内公有云厂商上搭建一套SQL Cluster的难度相信做Windows的童鞋都会很清楚&#xff0c;并非它的搭建有多少难度&#xff0c;只是很多细节需要注意。腾讯云&#xff0c;QCloud&#xff0c;为什么选择QCloud来做这个实验&#xff0c;除了QCloud是我的东家&#xff08;啊呸&…

【Codeforces】808D Array Division(前后两部分和相等)

http://codeforces.com/contest/808/problem/D 给你一个数组&#xff0c;问&#xff1a;是否可以通过移动一个数字的位置&#xff0c;求只能移动一次&#xff0c;使得这个数组前后部分的和相等&#xff0c;前后部分不一定等长 一个a数组储存数据&#xff0c;另一个b数组b[i]表…

想要确保架构目标达成?适合度函数了解一下

Paula Paul和Rosemary Wang撰写的一篇博文中介绍了适应度函数&#xff08;fitness function&#xff09;的基本概念、入门方法&#xff0c;并给出了如何验证各种架构质量的一些实例。文中提出&#xff0c;适应度函数驱动开发的方法可用于编写测定系统符合架构目标的测试&#x…

标定(二)----------双目相机与IMU联合标定(工具箱使用方法——Kalibr)

16个相机参数&#xff1a; Overview ethz-asl/kalibr is a toolbox that solves the following calibration problems: Multiple camera calibration: intrinsic and extrinsic calibration of a camera-systems with non-globally shared overlapping fields of view Cam…

【Codeforces】659B Qualifying Contest (sort)

http://codeforces.com/problemset/problem/659/B n个人&#xff0c;m个地区&#xff0c;选出每个地区分数最高的两个人 下面有n行&#xff0c;每一行的第一个数表示姓名&#xff0c;第二个数是地区的序号&#xff0c;第三个数是分数 It is guaranteed that all surnames of…

Protractor测试环境搭建

2019独角兽企业重金招聘Python工程师标准>>> 安装node.js.然后&#xff0c;在cmd下&#xff0c;进入E盘下的&#xff0c;我们自己新建的protractor文件夹下&#xff0c; npm install -g protractor 这样就会在本地安装好两个命令行工具&#xff1a;protractor和webd…