前端结构 の 里程碑(v3)

最近三个月我们一直在不断调整前端结构,目的在于提升 前端开发的一致性和复用性,先后提出了 前端结构 の 调整建议(v1),前端结构 の 调整新建议(v2)。

最近两周,基于 Jimmy 的实践经验,与目前团队不断的交流融合,在 6月24日,我们有了新共识,到达了一个新的里程碑。

原则
  • 可理解性是首要的,通过明确的约定以保持良好的一致性;
  • 创建和业务相关的 典型案例,便于团队模仿、学习和理解;
  • 鼓励尝试,容忍犯错,凝聚团队共识,渐进改造现有代码;
三个顶级目录
  • imodules 模块;
  • ipages 页面;
  • iscripts 脚本;
目录结构示例
├── imodules/
│  ├── base/
│  ├── embed/
│  ├── hour24/
│  ├── repair/
│  └── xbase/
├── ipages/
│  ├── home/
│  └── repair/
└── iscripts/
  ├── immy/
  ├── vendor/
  └── xlibs/
imodules(模块)

模块划分目的在于将复杂问题进行分解,提升独立性,降低耦合度,促进复用,并行开发,以提升开发效率。

imodules
├── base
│  └── _baseUModules
├── embed
│  ├── EmbedBottom
│  └── EmbedTop
├── hour24
│  └── Hour24Matte
├── repair
│  ├── RepairMatte
│  └── RepairScreenSelect
└── xbase
  └── _Matte
  • 模块分类目录约定
    1. 小写字母开头,驼峰风格,不使用中划线和下划线进行区隔,慎用数字;
    2. 仅为源码分类使用,不在 dist 发布目录上体现;
    3. 支持多级分类目录;

  • 模块实体目录约定
    同时作为模块 id(元素 id),大写字母开头,驼峰风格,不使用中划线和下划线进行区隔,慎用数字;
    特殊:下划线开头是允许的,表示内部基类;

  • 模块 id 和 元素 id 约定的说明
    规则:大写字母开头,驼峰风格,不使用中划线和下划线进行区隔,慎用数字;
    考虑:中划线使得正则复杂化;驼峰了就自然拒绝下划线;除非数字有意义,否则慎用数字;

  • base 非常特殊,和 xbase | _parts | partial 分离;

  • 叶子节点示例
    imodules/repair/RepairModal/

imodules/repair/RepairModal/
├── main.css
├── main.html
├── main.js
└── screen.tpl
ipages(页面)
ipages
├── home/
│  ├── I404/
│  └── Index/
└── repair/
  └── RepairIndex/
  • 页面分类目录约定;
    ipages/home/,ipages/repair/;
    命名约定同模块分类目录的命名约定;
  • 页面实体目录约定;
    BODY id,命名约定同模块实体目录的命名约定;
  • 叶子节点示例
    ipages/repair/RepairIndex/
ipages/repair/RepairIndex/
├── images/
│  └── supplier-avatar.png
├── main.css
├── main.js
└── repair@index.html
  • repair@index.html,表示发布后 repair/index.html,指定了发布路由;没有 @ 则表示发布在根目录下,有几个 @,则有几层目录;有一定的灵活变换性;
iscripts(脚本)
iscripts/
├── immy/
│  ├── libs/
│  ├── baseWidgets.js
│  ├── data.js
│  ├── project.js
│  └── utils.js
├── vendor/
│  └── mustache.js
└── xlibs/
  ├── common-structure-expanded/
  ├── global-structure-expanded/
  └── tip.js
  • mustache.js 放到 vendor 下;
  • xlibs 是业务库,其内容存在相当的不确定性和变动可能;跨业务模块公用,跨站点公用。这里有一个转变,就是放到这里的,默认都是全局公用的;
  • tip.js 放到 xlibs 下;
immy(基础框架)
  • 基础框架和应用模块适度分离,以便进一步重构框架和模块;
  • 新框架命名
    使用 immy,简洁、易记忆,和 Jimmy 有深刻渊源;
  • immy 框架 可作为产品,以适度分离的方式迭代发展;
immy
├── libs/
│   ├── potato.js
│   └── require.js
├── baseWidgets.js
├── data.js
├── project.js
└── utils.js

immy 应当有继续演进的机会,虽然 require.js 可以放到 vendor 下,但考虑到若没有 require.js,这个框架就跑不起来。require.js 属于 immy 这个框架的最小集合。

idom、ievent、imodule
  • 设置 自定义属性 idom,将 dom 操作从 class 分离;
  • 设置 自定义属性 ievent,明确区分 event 和 action;
  • 设置 自定义属性 imodule,明确引用依赖的模块 js;
  • 基于 els elements 去绑定;
模块 の 类、函数、变量
  • 类名:大写字母开头,驼峰风格;
  • 变量:小写字母开头,驼峰风格;
  • 函数:小写字母开头,驼峰风格;
  • 私有:下划线开头表示内部使用;
HTML 元素 の id 和 class
  • 元素 id:命名约定同模块实体目录的命名约定;
  • css class:全小写,中划线分隔;

URL、目录、文件 の 一般命名约定

  1. URL 设计要尽量简单、直观和有意义;
  2. 除了模块实体目录和页面实体目录作为 id 使用要加以特殊约定外,目录文件名统一使用英文小写(除 README.md 外),慎重使用数字后缀;如果要多个单词区隔,请使用 中划线“-”进行区隔
  3. CSS 类名也是中划线区隔,全小写;
  4. 网页链接通常使用绝对路径;
缘起

两个不同的角色要共享后台注册登录认证服务,但在页面弹出层有所不同,如何合理复用?

imodules/user/

imodules/user/
├── CustomerLoginForm
├── _LoginForm
└── SupplierLoginForm
约定
后记
  • 我们的前两版结构调整,应该说主要是文件夹的合理组织,工程耦合不是通过文件夹拆分组合(不论多么自洽和复杂)就能简单解耦的;
  • 第三版结构调整,应该说在工程解耦上走出了坚实的一步;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容

  • 1、引言 数据库设计过程中表、字段等的命名规范也算是设计规范的一部分,不过设计规范更多的是为了确保数据库设计的合理...
    SnowflakeCloud阅读 40,974评论 0 48
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 一、入口文件 入口文件内容:一般格式如下: 二、主配置文件 保存位置:你的应用/protected/config/...
    layjoy阅读 1,202评论 4 14
  • 常用html、CSS、javascript前端命名规范无论是从技术角度还是开发视角,对于web前端开发规范文档都有...
    krock01阅读 262评论 0 1
  • 小时候我是孩子王,满世界捣蛋,欺负女孩子能追着跑两里地,掏张家的鸟窝,摘李家的枣,能想到的荒唐事我都干过,那时候没...
    江枫阅读 2,783评论 25 54