Web 前端架构设计
最后更新于 2018-07-01 01:29:00
让 Web 前端开发可持续化、可扩展,关注四个核心代码、流程、测试、文档。
代码
HTML
模块化标记
构建模块化标记原则:标签表达结构,类名控制外观。这样做的好处就是,对相同类型结构的模块可以复用标签模版,同时又可以通过改变类名来灵活的控制模块的外观。例如:
```html
<section class="theme-container-card">
<nav class="theme-nav-block-items"></nav>
<header class="theme-title-xxx">
<h2></h2>
</header>
<main class="theme-content-xxx">
<p></p>
<div></div>
</main>
<footer class="theme-endnote-fluid"></footer>
</section>
```
在这里,类名其实对应的是不同的主题样式。
构建一个完整的页面,应该将其分解为一些更细小的可复用的单元,也就是组件模块。
编码规范
文档类型
HTML5 的文档类型申明:<!DOCTYPE html>
HTML 验证
规范化的 HTML 是显现技术要求与局限的显著质量基线,它促进了 HTML 被更好地运用。
推荐:
```html
<!DOCTYPE html>
<meta charset="utf-8">
<title>Test</title>
<article>This is only a test.</article>
```
不推荐:
```html
<title>Test</title>
<article>This is only a test.</article>
```
省略可选标签
HTML5 规范中规定了 HTML 等标签是可以省略的。但从可读性来说,在开发的源文件中不要这样做,因为省略标签可能会导致一些问题。
资源加载
CSS 资源(<link>
)在 <head>
标签中引入,避免 DOM 加载完后重复渲染 ;JS 资源(<script>
)在文档尾部 </body>
闭合标签前引入,避免过早的加载 JS 阻塞 DOM 渲染。例如:
```html
<head>
...
<link rel="stylesheet" href="base.css">
</head>
<body>
...
<script src="common.js"></script>
</body>
```
慎用 <script>
标签的 async
和 defer
属性。
语义化
使用 HTML 5 新标签,构建语义化标签模块,有利于理解和提高效率。
推荐:
```html
<section>
<nav></nav>
<header></header>
<main></main>
<footer></footer>
</section>
```
不推荐:
```html
<div class="section">
<div class="nav"></div>
<div class="header"></div>
<div class="main"></div>
<div class="footer"></div>
</div>
```
多媒体回溯
对页面上的媒体而言,像图片、视频、canvas 动画等,要确保其有可替代的接入接口。图片文件我们可采用有意义的备选文本(alt),视频和音频文件我们可以为其加上说明文字或字幕。
推荐:
```html
<img src="imgs/banner.png" alt="Prairie and Horse">
```
不推荐:
```html
<img src="imgs/banner.png">
或
<img src="imgs/banner.png" alt="Banner image one">
```
这些替代文字应该描述媒体资源的内容,而不是这些媒体资源的作用、类型等。
关注点分离
严格地保证结构(HTML)、表现(CSS)、**行为(JS)**三者分离,并尽量使三者之间没有太多的交互和联系。遵循:
- 不要引入太多零散的样式表,合并成大文件。
- 不要使用内联样式(
<style> … </style>
)、和行内样式。 - 不要引入太多零散的脚本文件,合并成大文件。
- 不要使用内联脚本(
<script> … </script>
)。 - 不要使用表象元素(例如
<b>
、<u>
、<font>
等)。 - 不要使用表象类名(例如 center、red、left)。
这样做的好处是,代码干净整洁,利于维护。
内容至上
不要让非内容信息污染了你的 HTML。遵循:
- 不要引入一些特定的 HTML 结构来解决一些视觉设计问题。
- 不要将
<img>
元素当做专门用来做视觉设计的元素。
这些是什么意思呢?HTML 结构应该表达的是文档内容,而非设计要素。例如,列表
元素 <li>
前面的原点、空心圆等修饰性的东西不应该用额外的标签去实现,可以借助伪元素实现。同样地,<img>
引入的图片应该是内容相关的,而非修饰性东西。
Tab Index 在可用性上的运用
依据元素的重要性来重新排列其 tab 切换顺序。你可以设置 tabindex="-1"
在任何元素上来禁用其 tab 切换。
当你在一个默认不可聚焦的元素上增加了功能,你应该总是为其加上 tabindex
属性使其变为可聚焦状态,而且这也会激活其 CSS 的伪类 :focus
。选择合适的 tabindex 值,或是直接使用 tabindex="0"
将元素们组织成同一 tab 顺序水平,并强制干预其自然阅读顺序。
ID 和锚点
通常一个比较好的做法是将页面内所有的标题元素(h2
、h3
)都加上 ID。这样做,页面 URL 的 hash 中带上对应的 ID 名称,即形成描点,方便跳转至对应元素所处位置。
格式化
块级元素应独占一行,内联元素放在同一行,子元素缩进使用制表符。
推荐:
```html
<nav>
<ul>
<li><span>Item</span> one</li>
</ul>
</nav>
```
不推荐:
```html
<nav><ul><li><span>Item</span> one</li></ul></nav>
```
引号
HTML 标签属性值应该用双引号,而不是单引号。
推荐:
```html
<div class="container"></div>
```
不推荐:
```html
<div class='container'></div>
```
注释
在 HTML 页面进行必要的注释是应该的,尤其是 SPA 单页面应用,标明不同的模块位置,便于维护和扩展。
```html
<body>
<header>
<h1>Single Page Web Application</h1>
</header>
<!-- container 容器 -->
<main id="content">
<!-- Module-1 -->
<section>
...
</section>
<!-- Module-2 -->
<section>
...
</section>
</main>
<footer>
<p>CopyRight 2018</p>
</footer>
</body>
```