├── README.md
├── Standard
├── API规范.md
├── commint规范.md
├── js规范.md
├── 前端开发规范.md
├── 功能需求规范文档.md
├── 数据库设计规范.md
├── 文件规范.md
└── 注释规范.md
├── Tutorial
└── readme.md
├── blog
├── new_helpers.md
└── readme.md
├── config
└── .jshintrc
├── 开发须知.md
├── 笔戈软件开发流程.md
└── 软件开发参与人员.md
/README.md:
--------------------------------------------------------------------------------
1 | 笔戈开发相关文档
2 | ========
3 |
4 |
5 | ## 开发规范
6 |
7 | * [API规范](Standard/API规范.md)
8 | * [JS规范](Standard/js规范.md)
9 | * [前端开发规范](Standard/前端开发规范.md)
10 | * [文件规范](Standard/文件规范.md)
11 | * [注释规范](Standard/注释规范.md)
12 | * [开发须知](开发须知.md)
13 | * [CSS&LESS开发规范](http://cxhtml.gitbooks.io/css-less-/content/)
14 |
15 | ## 培训汇总
16 | * [readme](readme.md)
17 |
18 | ## 软件文档
19 |
20 |
21 | ## 其他
22 | * [笔戈软件开发流程](笔戈软件开发流程.md)
23 | * [软件开发参与人员](软件开发参与人员.md)
24 |
25 |
26 | -------
27 | 规范目前还不完善,需要持续改进
28 |
--------------------------------------------------------------------------------
/Standard/API规范.md:
--------------------------------------------------------------------------------
1 | API规范用途
2 |
3 |
4 |
5 | ###API规范用途
6 | web应用开放的时候,常常同一个功能模块多个人开发。最常见的情况是前后端的工程师的合作,想象一个这样才场景
7 | 现在需要实现一个登录的功能,
8 | * 登录的时候,表单提交的url 是怎么样的,
9 | * 需要传递什么参数,
10 | * 密码错误时,用户被禁止登录时返回的状态码是怎么样的
11 | * 密码错误尝试次数太多
12 | 这些情况,如果不事先约定好一些状态码或者请求的url,前后端的交互就变变得很混乱,开放之前的API接口定义就变得
13 | 尤为重要。
14 |
15 | ###优点
16 | * 清晰的请求和数据交换格式
17 | * 编写API文档的同时,软件流程逻辑也会同时梳理
18 | * 及早地发现问题
19 |
20 | ### 路由API接口
21 |
22 | ####url
23 | 被请求的url地址
24 |
25 | ####url 功能描述
26 | 这个URL的功能
27 |
28 | ####请求方式
29 | get、post、put、delete
30 |
31 | ####是否需要登录
32 | 有些url 只有再登录后才能被访问, 默认为不需要登录,
33 |
34 | ####请求参数
35 | * name
36 | * 是否必须
37 | * 类型
38 | * 说明、默认值、可选值
39 |
40 | **Example**
41 |
42 | | name | 是否必须| 类型 | 说明,默认值,可选值等等|
43 | | ------------ | ------------- | ------------ |------------ |
44 | | Content Cell | Content Cell | Content Cell | Content Cell |
45 |
46 | ####返回结果
47 |
48 | json、或者文本、跳转等等说明
49 |
50 | ####返回字段说明
51 |
52 | **Example**
53 |
54 | | name | 是否必须| 类型 | 说明,默认值,可选值等等|
55 | | ------------ | ------------- | ------------ |------------ |
56 | | Content Cell | Content Cell | Content Cell | Content Cell |
57 |
58 |
59 |
60 |
61 |
62 |
63 | 参考文档:[open.weibo.com](http://open.weibo.com/wiki/2/statuses/public_timeline)
64 |
--------------------------------------------------------------------------------
/Standard/commint规范.md:
--------------------------------------------------------------------------------
1 | #写出好的 commit message
2 |
3 | ##为什幺要关注提交信息
4 |
5 | * 加快 Reviewing Code 的过程
6 | * 帮助我们写好 release note
7 | * 5年后帮你快速想起来某个分支,tag 或者 commit 增加了什么功能,改变了哪些代码
8 | * 让其他的开发者在运行 git blame 的时候想跪谢
9 | * 总之一个好的提交信息,会帮助你提高项目的整体质量
10 |
11 | ##基本要求
12 | * 第一行应该少于50个字。 随后是一个空行 第一行题目也可以写成:Fix issue #8976
13 | * 使用 fix(修复bug), add(添加功能), change(调整代码等) 而不是 fixed, added, changed
14 | * 永远别忘了第2行是空行
15 | * 用 Line break 来分割提交信息,让它在某些软件里面更容易读
16 | * 请将每次提交限定于完成一次逻辑功能。并且可能的话,适当地分解为多次小更新,以便每次小型提交都更易于理解。
17 |
18 | ## 例子
19 |
20 | ```
21 | Fix issue #9527
22 |
23 | 小改直接就用一句话说清楚。
24 | 大改的,自己建一个 Issue 说清楚情况、方案、变化。。。。
25 | 其实最重要一点,commit log 是给人类看的,说清楚就好,不必太过拘谨,更不能写成只给机器看的东西。
26 |
27 | ```
28 | 或者
29 |
30 | ```
31 | Add feature #9527
32 | ```
33 |
--------------------------------------------------------------------------------
/Standard/js规范.md:
--------------------------------------------------------------------------------
1 | > 无论人数多少,代码都应该同出一门。
2 |
3 | #JavaScript
4 |
5 | ## 编码风格 JSHint
6 | 1. 在编辑器中,开启 JSHint
7 | 2. 在项目根目录建立 [.jshintrc 文件](../config/.jshintrc)
8 |
9 | ### 相关阅读
10 | [jshint](http://jshint.com/)
11 |
12 |
13 | ##Indentation,分号,单行长度
14 | * 一律使用2个空格
15 | * continuation-indentation 同样适用2个空格,跟上一行对齐
16 | >>>>>>> origin/master
17 | * Statement 之后一律以分号结束, 不可以省略
18 | * 单行长度,理论上不要超过80列,不过如果编辑器开启 soft wrap 的话可以不考虑单行长度
19 | * 接上一条,如果需要换行,存在操作符的情况,一定在操作符后换行,然后换的行缩进2个空格
20 | 这里要注意,如果是多次换行的话就没有必要继续缩进了,比如说右边第二段这种就是最佳格式。
21 |
22 | **Example**
23 | ```
24 | if (typeof qqfind === "undefined" ||
25 | typeof qqfind.cdnrejected === "undefined" ||
26 | qqfind.cdnrejected !== true) {
27 | url = "http://pub.idqqimg.com/qqfind/js/location4.js";
28 | } else {
29 | url = "http://find.qq.com/js/location4.js";
30 | }
31 | ```
32 |
33 | ##空行
34 | * 变量声明后(当变量声明在代码块的最后一行时,则无需空行)
35 | * 代码块后,逻辑块之间加空行增加可读性(在函数调用、数组、对象中则无需空行)
36 | * 单行或多行注释前加
37 | * 文件最后保留一个空行
38 |
39 | ##换行
40 | 换行的地方,行末必须有','或者运算符;
41 |
42 | 以下几种情况不需要换行:
43 |
44 | * 下列关键字后:else, catch, finally
45 | * 代码块'{'前
46 | 以下几种情况需要换行:
47 |
48 | * 代码块'{'后和'}'前
49 | * 变量赋值后
50 |
51 |
52 | ##变量命名
53 | * 标准变量采用驼峰标识 如: `ceseCamel`
54 | * 使用的ID的地方一定全大写,如:`userID`
55 | * 使用的URL的地方一定全大写, 比如说 reportURL
56 | * 涉及Android的,一律大写第一个字母
57 | * 涉及iOS的,一律小写第一个,大写后两个字母
58 | * 常量采用大写字母,下划线连接的方式,如:`NAMES_LIKE_THIS`
59 | * 构造函数,大写第一个字母
60 | * 类名驼峰,并且首字母要大写 CamelName
61 | * jquery对象必须以'$'开头命名
62 |
63 | ```
64 | var thisIsMyName;
65 |
66 | var goodID;
67 |
68 | var AndroidVersion;
69 |
70 | var iOSVersion;
71 |
72 | var MAX_COUNT = 10;
73 |
74 | function Person(name) {
75 | this.name = name
76 | }
77 | ```
78 | ##引号
79 | 最外层统一使用单引号。
80 |
81 | ```
82 | // not good
83 | var x = "test";
84 |
85 | // good
86 | var y = 'foo',
87 | z = '
';
88 | ```
89 |
90 | ##undefined使用场景
91 | * 永远不要直接使用undefined进行变量判断
92 | * 使用字符串 "undefined" 对变量进行判断
93 |
94 |
95 | ```
96 | // Bad
97 | var person;
98 | console.log(person === undefined); //true
99 |
100 | // Good
101 | console.log(typeof person); // "undefined"
102 | ```
103 |
104 | ##对象声明
105 |
106 | ```
107 | // Bad
108 | var team = new Team();
109 | team.title = "AlloyTeam";
110 | team.count = 25;
111 |
112 | // Good semi colon 采用 符号后面接空格 的形式
113 | var team = {
114 | title: 'AlloyTeam',
115 | count: 25
116 | };
117 | ```
118 |
119 | ## 数组声明
120 |
121 | ```
122 | Array Literals
123 | // Bad
124 | var colors = new Array("red", "green", "blue");
125 | var numbers = new Array(1, 2, 3, 4);
126 |
127 |
128 | // Good
129 | var colors = [ "red", "green", "blue" ];
130 | var numbers = [ 1, 2, 3, 4 ];
131 | ```
132 |
133 | ##括号对齐
134 | * 标准示例 括号前后有空格, 花括号起始 不另换行,结尾新起一行
135 | * 花括号必须要, 即使内容只有一行, 决不允许右边第二种情况
136 | * 涉及 if for while do...while try...catch...finally 的地方都必须使用花括号
137 |
138 | ##if else else前后留有空格
139 | ```
140 | if (condition) {
141 | doSomething();
142 | } else {
143 | doSomethingElse();
144 | }
145 | ```
146 |
147 | ##switch
148 | * 采用右边的格式, switch和括号之间有空格, case需要缩进, break之后跟下一个case中间留一个blank line
149 | * 花括号必须要, 即使内容只有一行
150 | ```
151 | switch (condition) {
152 | case "first":
153 | // code
154 | break;
155 |
156 | case "third":
157 | // code
158 | break;
159 |
160 | default:
161 | // code
162 | }
163 | ```
164 |
165 | ##for
166 | * 普通for循环, 分号后留有一个空格, 判断条件等内的操作符两边不留空格, 前置条件如果有多个,逗号后留一个空格
167 | * for-in 一定要有 hasOwnProperty 的判断, 否则 JSLint 或者 JSHint 都会有一个 warn
168 |
169 | ```
170 | var values = [ 1, 2, 3, 4, 5, 6, 7 ],
171 | i, len;
172 |
173 | for (i=0, len=values.length; i` | 段落
20 | ` ...` | 标题
21 | `
202 | ......
203 |
204 |
205 | ```
206 |
207 | ### 2.4 IE 兼容模式
208 | 优先使用 IE 最新版本和 Chrome
209 | ```html
210 |
211 | ```
212 |
213 | ### 2.5 SEO 优化
214 |
215 | #### 2.5.1 title
216 | 页面必须包含 title 标签声明标题
217 |
218 | ```html
219 |
220 |
221 |
222 | Bigertech
223 | ......
224 |
225 | ```
226 |
227 | #### 2.5.2 keyword
228 | ```html
229 |
230 | ```
231 |
232 | #### 2.5.3 description
233 | ```html
234 |
235 | ```
236 |
237 | #### 2.5.4 author
238 | ```html
239 |
240 | ```
241 |
242 | ### 2.6 viewport
243 | ```html
244 |
245 | ```
246 |
247 | ### 2.7 iOS 图标
248 | - apple-touch-icon 图片自动处理成圆角和高光等效果
249 | - apple-touch-icon-precomposed 禁止系统自动添加效果,直接显示设计原图
250 |
251 | iPhone 和 iTouch,默认 57x57 像素,必须有
252 | ```html
253 |
254 | ```
255 |
256 | iPad,72x72 像素,可以没有,但推荐有
257 | ```html
258 |
259 | ```
260 |
261 | Retina iPhone 和 Retina iTouch,114x114 像素,可以没有,但推荐有
262 | ```html
263 |
264 | ```
265 |
266 | Retina iPad,144x144 像素,可以没有,但推荐有
267 | ```html
268 |
269 | ```
270 |
271 | ### 2.8 favicon
272 | 在未指定 favicon 时,大多数浏览器会请求 Web Server 根目录下的 favicon.ico 。为了保证favicon可访问,避免404,必须遵循以下两种方法之一:
273 |
274 | - 在 Web Server 根目录放置 favicon.ico 文件
275 | - 使用 link 指定 favicon
276 |
277 | ```html
278 |
279 | ```
280 |
281 | ### 2.9 引入 CSS 和 JavaScript 文件
282 | 根据 HTML5 规范,在引入 CSS 和 JavaScript 文件时一般不需要指定 type 属性,因为 text/css 和 text/javascript 分别是它们的默认值
283 |
284 | ```html
285 |
286 |
287 |
288 |
289 |
292 |
293 |
294 |
295 | ```
296 |
297 | ### 2.10 HEAD 模板
298 | ```html
299 |
300 |
301 |
302 |
303 |
304 | Bigertech
305 |
306 |
307 |
308 |
309 |
310 |
311 |
312 |
313 |
314 |
315 |
316 |
317 |
318 |
319 |
320 | ```
321 |
322 | ## 3 BODY
323 |
324 | ### img
325 |
326 | ### form
327 |
328 | ### button
329 |
330 | ### 模块命名
331 | - 每个模块必须有一个模块名
332 | - 每个模块的基本组成部分应该一致
333 | - 模块的子节点类名需带上模块名(防止模块间嵌套时产生不必要的覆盖)
334 | - 孙辈节点无需再带模块名
335 |
336 | ```html
337 |
348 | ```
349 |
350 | ## 模板中的 HTML
351 |
352 |
353 | # CSS
354 |
355 | # Javascript
356 |
357 |
358 |
359 |
360 |
361 |
362 | ## 引用
363 | [mdo/code-guide](https://github.com/mdo/code-guide/)
364 | [Baidu 前端规范](https://github.com/ecomfe/spec)
365 | [Qunar 前端规范](https://github.com/doyoe/html-css-guide)
366 | [常用的 HTML 头部标签](https://github.com/yisibl/blog/issues/1)
367 | [20 Snippets You should be using from Html5 Boilerplate](http://www.1stwebdesigner.com/design/snippets-html5-boilerplate/)
--------------------------------------------------------------------------------
/Standard/功能需求规范文档.md:
--------------------------------------------------------------------------------
1 | # 功能需求文档
2 | 1. 撰写人:
3 | 2. 撰写时间
4 |
5 | ### 需求描述
6 |
7 | ### 前置条件
8 | 说明条件和情况。即具体细节
9 |
10 | ### 流程
11 | 1. 有时候不只是只上传数据
12 | 2. 设计到复杂流程时,在这里描述清楚。或者使用流程图
13 |
14 | ### 数据格式
15 |
16 | * name
17 | * 是否必须
18 | * 类型
19 | * 说明
20 |
21 | **Example**
22 |
23 | | name | 是否必须| 类型 | 说明,默认值,可选值等等|
24 | | ------------ | ------------- | ------------ |------------ |
25 | | flymeId | true | Flyme Id | string |
26 | | userName | true | 用户名 | string |
27 | | sex | false | 性别 | boolean |
28 | | height | false | 身高 | double |
29 | | weight | false | 体重 | double |
30 | | age | false | 年龄 | int |
31 | | target | false | 运动目标 | string|
32 | | photo | false | 头像 | string|
33 |
34 | ### 其他
35 |
36 |
37 |
--------------------------------------------------------------------------------
/Standard/数据库设计规范.md:
--------------------------------------------------------------------------------
1 | ##数据库规划流程
2 | 数据库规划→需求分析→数据库设计→应用程序设计→实现→测试→运行于维护
3 |
4 | ##数据库设计流程
5 | 1. 概念结构设计
6 | 2. 逻辑结构设计
7 | 3. 物理结构设计
8 | 4. 应用程序设计
9 | 5. 系统实现
10 |
11 | ##设计过程中规范
12 | ###三范式
13 | + 第一范式(1NF):若关系模式R的每一个分量是不可分的数据项,则关系模式属于第一范式。即每个属性都是不可拆分的。
14 | + 第二范式 (2NF) :R属于1NF,且每一个非主属性完全依赖于键(没有部分依赖),则R属于2NF。
15 | + 第三范式 (3NF) :R属于2NF,且每个非主属性即不部分依赖于码,也不传递依赖于码。
16 |
17 | ###命名规范
18 | #####1. 数据库涉及字符规范
19 | + 采用26个英文字母(区分大小写)和0-9这十个自然数,加上下划线_组成,共63个字符。不能出现其他字符(注释除外)。
20 |
21 | #####2. 数据库对象命名规范
22 | + 数据库对象包括表、视图(查询)、存储过程(参数查询)、函数、约束。对象名字由前缀和实际名字组成,长度不超过30。
23 | + 前缀:使用小写字母
24 | + 实际名字:实际名字尽量描述实体的内容,由单词或单词组合,每个单词的首字母大写,其他字母小写,不以数字和_开头。如
25 |
26 | 类型 | 名称
27 | :------- | :---------:
28 | 表 | User_Info
29 | 视图 | User_List
30 | 存储过程 | User_Delete
31 |
32 |
33 | #####3. 库的表命名规范
34 |
35 | 我们约定,表名由前缀和实际名字组成。
36 |
37 | 前缀:使用小写字母tb,代表表。实际名字中,一个系统尽量采取同一单词,多个后面加_来连接区分。
38 |
39 | 因此,合法的表名全称类似如下。
40 |
41 | ```TbMember
42 | tbMember_Info
43 | tbForum_Board
44 | tbBlog_Comment1
45 | ```
46 |
47 | 表
48 |
49 | 表名如Order/UserAccout
50 |
51 | 符合以下规范:
52 |
53 | + 统一采用单数形式,反对Orders
54 | + 首字母大写,多个单词的话,单词首字母大写,反对order/Useraccout/ORDER
55 | + 避免中文拼音,反对AgentBaoCi
56 | + 避免下划线连接,反对User_Accout(下划线适用Oracle数据库)
57 | + 避免名称过长,反对WebsiteInfomationModifyRecord
58 | + 多对多关系表,以Mapping结尾,如UserRoleMapping
59 | + 避免保留字
60 |
61 | #####4. 字段命名规范
62 |
63 | 我们约定,字段由表的简称,实际名字组组成。如果此字段关联另外的字段,那么加下划线_连接关联表字段的字段名。
64 |
65 | 因此,合法的字段名类似如下。
66 |
67 | ```
68 | UserID_MeID
69 | UserName
70 | UserRegDate
71 | ```
72 | 字段
73 |
74 | 名如userID/userName/userType
75 |
76 | 符合以下规范:
77 |
78 | + 首个字母小写,多个单词的话,单词首字母大写,反对UserID/Userid
79 | + 必须有一主键,主键不直接用ID,而是表名+ID,如userID/orderID
80 | + 常用的字段name,不直接用name,而是表名+Name,如userName/orderName
81 | + 常用的字段desc,不直接用desc,而是表名+Desc,如userDesc/orderDesc
82 | + 大写字母前必须包含至少两个小写的字母,反对uID/oID
83 | + 避免中文拼音
84 | + 避免下划线连接
85 | + 避免名称过长
86 | + 避免保留字
87 |
--------------------------------------------------------------------------------
/Standard/文件规范.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 坚持一致性的原则。
5 | 一个团队的代码风格如果统一了,首先可以培养良好的协同和编码习惯,其次可以减少无谓的思考,再次可以提升代码质量和可维护性。
6 | 统一的代码风格,团队内部阅读或编辑代码,将会变得非常轻松,因为组员都用一致思维环境。
7 |
8 |
9 | ##命名规则
10 | ###项目命名
11 | 项目名全部采用小写方式, 以中划线分隔。 比如: my-project-name
12 |
13 | ### 目录名
14 | 目录名参照上一条规则
15 |
16 |
17 |
18 |
19 | ###JavaScript文件命名
20 | 所有js文件名,默认全小写。
21 | 如果由多个单词组成时,采用驼峰方式,比如说:userService
22 | 对象类型则 首字母大写,账号模型文件 AccountModel.js
23 |
24 | ###CSS,SCSS文件命名
25 | 多个单词组成时,采用中划线连接方式,比如说:retina-sprites.scss
26 |
27 | ###HTML文件命名
28 | 多个单词组成时,采用中划线连接方式,比如说: error-report.html
29 |
30 | ##编码
31 | UTF8
32 |
33 | ##缩进
34 |
35 | 使用tab来进行缩进,可以在IDE里进行设置
36 | js 使用4个 空格,html、css、less 用两个空格
37 | ##待办事项
38 |
39 | 用 TODO 标示待办事项和正在开发的条目
40 |
41 |
--------------------------------------------------------------------------------
/Standard/注释规范.md:
--------------------------------------------------------------------------------
1 | > 黄金定律——不管有多少人共同参与同一项目,一定要确保每一行代码都像是同一个人编写的。
2 |
3 |
4 |
5 | # 注释规范
6 |
7 |
8 | 编码规范中有一条很重要——见名知意,有时候直白的函数名还不能表达完整的意思,这个时候注释就出场了,代码是由人编写并维护的。请确保你的代码能够自描述、注释良好并且易于他人理解。好的代码注释能够传达上下文关系和代码目的。
9 |
10 | 在写代码前就应该添加注释,这时在你的脑子里的是清晰完整的思路。
11 | 如果在代码最后再添加注释,它将花费你双倍的时间。
12 |
13 |
14 |
15 |
16 | ### 注释的写法
17 | * html
18 |
19 | ```
20 |
21 | ```
22 | * css
23 |
24 | ```
25 | /* declarations */
26 | ```
27 | * javascript、less
28 |
29 | ```
30 | // 注释内容
31 | /* 注释内容 */
32 | ```
33 |
34 | ## 通用
35 | ### 注释尽量使用英文来描述
36 |
37 | ###单行注释
38 | * 双斜线后,必须跟注释内容保留一个空格
39 | * 可独占一行, 前边不许有空行, 缩进与下一行代码保持一致
40 | * 可位于一个代码行的末尾,注意这里的格式
41 |
42 | ```
43 | // Good
44 | if (condition) {
45 |
46 | // if you made it here, then all security checks passed
47 | allowed();
48 | }
49 |
50 | var zhangsan = 'zhangsan'; // 双斜线距离分号四个空格,双斜线后始终保留一个空格
51 | ```
52 |
53 | ### 多行注释格式
54 | * 最少三行, 格式如下
55 | * 前边留空一行
56 |
57 | ###何时使用
58 | * 难于理解的代码段
59 | * 可能存在错误的代码段
60 | * 浏览器特殊的HACK代码
61 | * 想吐槽的产品逻辑, 合作同事
62 | * 业务逻辑强相关的代码
63 |
64 |
65 | ```
66 | /*
67 | * 注释内容与星标前保留一个空格
68 | */
69 | ```
70 | ### 文件注释
71 |
72 | ```
73 | /*
74 | *Copyright etc
75 | *@author: who are you
76 | *@date: when you write it
77 | *@description: the function of this file.
78 | */
79 | ```
80 | **Example**
81 |
82 | ```
83 | /**
84 | * Copyright (c) 2014 Meizu bigertech, All rights reserved.
85 | * http://www.bigertech.com/
86 | * @author ${USER}
87 | * @date ${DATE}
88 | * @description $END
89 | *
90 | */
91 | ```
92 | ### 多人合作注释
93 | 同一个文件的代码可能被多个人修改,这个时候需要标识出谁改动了哪些部分。
94 |
95 | **格式**: `// add begin by ` 作者名 ,一个分号`;`,再加上原因 ` Reason`
96 |
97 | 代码添加的最后加上:`//add end`
98 |
99 | **Example**
100 |
101 | ```
102 | // add begin by liuxing ; Init post's id
103 | var postId = 1;
104 | //end add
105 | ```
106 | ```
107 | // add begin by liuxing
108 | /**
109 | * 多行注释来说明原因
110 | */
111 | var postId = 1;
112 | //end add
113 | ```
114 |
115 |
116 | ## javascript 注释
117 |
118 |
119 | ### 文档注释
120 | * 各类标签 @param @method 等 参考 http://usejsdoc.org/
121 | * 格式如下
122 |
123 | ###用在哪里
124 | * 所有的方法
125 | * 所有的构造函数
126 | * 所有的全局变量
127 |
128 | ```
129 | /**
130 | * here boy, look here , here is girl
131 | * @method lookGril
132 | * @param {Object} balabalabala
133 | * @return {Object} balabalabala
134 | */
135 | ```
136 |
137 | * 常用tag
138 | @author、@callback、@copyright、@default、@deprecated、@throws 、@todo
139 | @param、@returns
140 |
141 | ### 方法与函数的注释
142 |
143 | 提供参数的说明. 使用完整的句子, 并用第三人称来书写方法说明.
144 |
145 | ```
146 | /**
147 | * Converts text to some completely different text.
148 | * @param {string} arg1 An argument that makes this more interesting.
149 | * @return {string} Some return value.
150 | */
151 | project.MyClass.prototype.someMethod = function(arg1) {
152 | // ...
153 | };
154 | ```
155 | ### 属性注释
156 |
157 | 也需要对属性进行注释.
158 |
159 | ```
160 | /**
161 | * Maximum number of things per pane.
162 | * @type {number}
163 | */
164 | project.MyClass.prototype.someProperty = 4;
165 |
166 | ```
167 | ### 枚举
168 |
169 | ```
170 | /**
171 | * Enum for tri-state values.
172 | * @enum {number}
173 | */
174 | project.TriState = {
175 | TRUE: 1,
176 | FALSE: -1,
177 | MAYBE: 0
178 | };
179 | ```
180 | 注意一下, 枚举也具有有效类型, 所以可以当成参数类型来用.
181 |
182 | ```
183 | /**
184 | * Sets project state.
185 | * @param {project.TriState} state New project state.
186 | */
187 | project.setState = function(state) {
188 | // ...
189 | };
190 | ```
191 |
192 | ### Typedefs
193 |
194 | 有时类型会很复杂. 比如下面的函数, 接收 Element 参数:
195 |
196 | ```
197 | /**
198 | * @param {string} tagName
199 | * @param {(string|Element|Text|Array.|Array.)} contents
200 | * @return {Element}
201 | */
202 | goog.createElement = function(tagName, contents) {
203 | ...
204 | };
205 | ```
206 | ## HTML注释
207 |
208 | @todo 小帽
209 |
210 | ## CSS 注释
211 | @todo 惜玉
212 |
--------------------------------------------------------------------------------
/Tutorial/readme.md:
--------------------------------------------------------------------------------
1 | 1. 本文件加下面的内容为bg的培训课件,欢迎交流指导
--------------------------------------------------------------------------------
/blog/new_helpers.md:
--------------------------------------------------------------------------------
1 | #笔戈博客新增 helpers
2 |
3 | ## next_post
4 | 异步获取下一篇博客,
5 |
6 | * `postId` 当前文章的ID
7 | * `limit` 需要输出的文章的数量 默认1
8 |
9 |
10 | **Example** : 获取 id = 49 的文章的,下两篇文章
11 |
12 | ```
13 | {{next_post postId="49" limit=2}}
14 | ```
15 | **Result:**
16 |
17 | ```
18 | {posts:[Post,Post2....]}
19 | ```
20 | ## pre_post
21 | 异步获取上一篇博客,
22 |
23 | * `postId` 当前文章的ID
24 | * `limit` 需要输出的文章的数量 默认1
25 | example: 获取 id = 49 的文章的,下两篇文章
26 |
27 | ```
28 | {{pre_post postId="49" limit=2}}
29 | ```
30 |
31 |
32 | ## excerpt
33 | 截取正文内容
34 |
35 | 可选参数
36 |
37 | * `words` 单词数
38 | * `characters` 字符数, 如果是中文,请使用这个
39 |
40 | ** example **
41 |
42 | ```
43 | {{excerpt words="40"}}
44 | ```
--------------------------------------------------------------------------------
/blog/readme.md:
--------------------------------------------------------------------------------
1 | 1. 本文件加下面的内容为bg 主站的开发文档
--------------------------------------------------------------------------------
/config/.jshintrc:
--------------------------------------------------------------------------------
1 | {
2 | // JSHint Default Configuration File (as on JSHint website)
3 | // See http://jshint.com/docs/ for more details
4 |
5 | "maxerr": 50, // {int} Maximum error before stopping
6 |
7 | // Enforcing
8 | "bitwise": true, // true: Prohibit bitwise operators (&, |, ^, etc.)
9 | "camelcase": false, // true: Identifiers must be in camelCase
10 | "curly": true, // true: Require {} for every new block or scope
11 | "eqeqeq": true, // true: Require triple equals (===) for comparison
12 | "forin": true, // true: Require filtering for..in loops with obj.hasOwnProperty()
13 | "freeze": true, // true: prohibits overwriting prototypes of native objects such as Array, Date etc.
14 | "immed": false, // true: Require immediate invocations to be wrapped in parens e.g. `(function () { } ());`
15 | "indent": 2, // {int} Number of spaces to use for indentation
16 | "latedef": true, // true: Require variables/functions to be defined before being used
17 | "newcap": false, // true: Require capitalization of all constructor functions e.g. `new F()`
18 | "noarg": true, // true: Prohibit use of `arguments.caller` and `arguments.callee`
19 | "noempty": true, // true: Prohibit use of empty blocks
20 | "nonbsp": true, // true: Prohibit "non-breaking whitespace" characters.
21 | "nonew": false, // true: Prohibit use of constructors for side-effects (without assignment)
22 | "plusplus": false, // true: Prohibit use of `++` & `--`
23 | "quotmark": false, // Quotation mark consistency:
24 | // false : do nothing (default)
25 | // true : ensure whatever is used is consistent
26 | // "single" : require single quotes
27 | // "double" : require double quotes
28 | "undef": false, // true: Require all non-global variables to be declared (prevents global leaks)
29 | "unused": true, // Unused variables:
30 | // true : all variables, last function parameter
31 | // "vars" : all variables only
32 | // "strict" : all variables, all function parameters
33 | "strict": false, // true: Requires all functions run in ES5 Strict Mode
34 | "maxparams": 5, // {int} Max number of formal params allowed per function
35 | "maxdepth": 5, // {int} Max depth of nested blocks (within functions)
36 | "maxstatements": false, // {int} Max number statements per function
37 | "maxcomplexity": false, // {int} Max cyclomatic complexity per function
38 | "maxlen": false, // {int} Max number of characters per line
39 |
40 | // Relaxing
41 | "asi": false, // true: Tolerate Automatic Semicolon Insertion (no semicolons)
42 | "boss": false, // true: Tolerate assignments where comparisons would be expected
43 | "debug": false, // true: Allow debugger statements e.g. browser breakpoints.
44 | "eqnull": false, // true: Tolerate use of `== null`
45 | "es5": false, // true: Allow ES5 syntax (ex: getters and setters)
46 | "esnext": false, // true: Allow ES.next (ES6) syntax (ex: `const`)
47 | "moz": false, // true: Allow Mozilla specific syntax (extends and overrides esnext features)
48 | // (ex: `for each`, multiple try/catch, function expression…)
49 | "evil": false, // true: Tolerate use of `eval` and `new Function()`
50 | "expr": false, // true: Tolerate `ExpressionStatement` as Programs
51 | "funcscope": false, // true: Tolerate defining variables inside control statements
52 | "globalstrict": true, // true: Allow global "use strict" (also enables 'strict')
53 | "iterator": false, // true: Tolerate using the `__iterator__` property
54 | "lastsemic": false, // true: Tolerate omitting a semicolon for the last statement of a 1-line block
55 | "laxbreak": false, // true: Tolerate possibly unsafe line breakings
56 | "laxcomma": false, // true: Tolerate comma-first style coding
57 | "loopfunc": false, // true: Tolerate functions being defined in loops
58 | "multistr": false, // true: Tolerate multi-line strings
59 | "noyield": false, // true: Tolerate generator functions with no yield statement in them.
60 | "notypeof": false, // true: Tolerate invalid typeof operator values
61 | "proto": false, // true: Tolerate using the `__proto__` property
62 | "scripturl": false, // true: Tolerate script-targeted URLs
63 | "shadow": false, // true: Allows re-define variables later in code e.g. `var x=1; x=2;`
64 | "sub": false, // true: Tolerate using `[]` notation when it can still be expressed in dot notation
65 | "supernew": false, // true: Tolerate `new function () { ... };` and `new Object;`
66 | "validthis": false, // true: Tolerate using this in a non-constructor function
67 |
68 | // Environments
69 | "browser": true, // Web Browser (window, document, etc)
70 | "browserify": false, // Browserify (node.js code in the browser)
71 | "couch": false, // CouchDB
72 | "devel": true, // Development/debugging (alert, confirm, etc)
73 | "dojo": false, // Dojo Toolkit
74 | "jasmine": false, // Jasmine
75 | "jquery": false, // jQuery
76 | "mocha": true, // Mocha
77 | "mootools": false, // MooTools
78 | "node": true, // Node.js
79 | "nonstandard": false, // Widely adopted globals (escape, unescape, etc)
80 | "phantom": false, // PhantomJS
81 | "prototypejs": false, // Prototype and Scriptaculous
82 | "qunit": false, // QUnit
83 | "rhino": false, // Rhino
84 | "shelljs": false, // ShellJS
85 | "typed": false, // Globals for typed array constructions
86 | "worker": false, // Web Workers
87 | "wsh": false, // Windows Scripting Host
88 | "yui": false, // Yahoo User Interface
89 |
90 | // Custom Globals additional predefined global variables
91 | "globals": {
92 | "_": true,
93 | "sails": true
94 | }
95 | }
--------------------------------------------------------------------------------
/开发须知.md:
--------------------------------------------------------------------------------
1 | # 开发须知
2 |
3 | ## 开发环境
4 | 1. 环境类型
5 | * 本地环境(dev)
6 | * 测试环境 (test)
7 | * 灰度环境,平滑升级,预发布 (pro)
8 | * 产品环境 (pro)
9 |
10 | 2. 本地环境主要为前端环境和nodejs 环境,需要[安装的软件](https://www.teambition.com/project/53b12d523fce2d4b0e233a55/posts/post/53b20f8708f20c3e0edc3fa7)
11 | 3. 开发和测试几乎同时进行,而不是等到项目发布再测试。项目每开发了一点功能,测试服务器就可以同步代码,进行测试,能及早地发现问题。
12 |
13 |
14 | ## 项目和域名
15 | 1. 笔戈 (bigertech.com)所有业务
16 | * wan
17 | * www
18 | * passport
19 | * jobs
20 | * xia
21 |
22 | 2. lifekit 云端
23 | * lifekit-server.meizu.com
24 | * data.lifekit-server.meizu.com
25 |
26 | ## 代码
27 | 1. 一般会使用两个分支,develop 和 stable。develop 用于开发和测试,stable 分支用于发布,环境配置使用线上的配置。
28 | 2. js、css、img等文件称之为静态资源,需要放置到CDN。使用又拍云的服务。
29 | 3. 代码仓库
30 | * wan-client (笔戈玩)
31 | * wan-admin(笔戈玩后台)
32 | * db-script(数据库修改脚本)
33 | * wan_res (玩的静态资源)
34 | * passport_res(用户中心静态资源)
35 | * passport(用户中心)
36 |
37 |
38 | #### 开发仓库 wan-client
39 | 1. discover 功能分支,用于平时开发
40 | 2. develop 功能分支开发完毕,提交到本分支,进行测试。
41 | 3. stable 发布分支,发布测试。 tag 记号,写入版本号。 提交产品环境下面的代码
42 |
43 | #### 产品仓库 wan-client-pro
44 | 1. master 比对到这里。tag 记号(小版本)。没问题发布到线上 ,同步到stable。
45 | 2. stable 只是记录版本。 + tag(稳定版)。一定可以使用稳定版本。
46 |
47 | #### 对开发人员说明:
48 | 1. 从develop创建分支用于功能开发,
49 | 2. 开发完毕,提交到 develop,交给测试
50 | 3. 测试无误,提交到stable
51 |
52 |
53 | ### 对测试人员说明:
54 |
55 | 1. 开发提交代码到stable以后,
56 | 2. 测试对比代码到 pro仓库,
57 | 3. 灰度测试
58 | 4. 打上tag
59 | 5. 测试无误提交到线上。
60 | 6. 线上的代码稳定后,提交到 stable 分支,打上tag
61 |
62 | ####
63 |
64 |
65 | ##技巧和配置
66 | * 缩进,2个字符,不使用 tab
67 | * jshint 开启
68 | * [template 配置](https://github.com/shanelau/live-template)
69 | * F3 代码书签
70 | * Reformat code
71 | * 代码质量检查 (inspection code),自省
72 |
73 |
74 |
75 | ## 发布
76 | 
77 |
78 | ## 规范
79 | [开发规范](https://github.com/bigertech)
80 |
81 | ## 团队协作
82 | 1. teambition ,培训、团队建设、其他非开发交流平台。
83 | 2. redmine 需求、bug、任务平台。工作量和效率的考核重要指标
84 |
--------------------------------------------------------------------------------
/笔戈软件开发流程.md:
--------------------------------------------------------------------------------
1 | # 笔戈软件开发流程
2 | ## 规范制定目的
3 | * 探索更加合理化的软件开发流程
4 | * 明确参与人员的职责和任务
5 | * 有效地推进软件开发的规范化、流程化
6 |
7 | >对于稍微大一点的互联网产品都要有精心部署和安排才行,否则项目进行的将会一塌糊涂。
8 |
9 |
10 |
11 | ## 1、需求分析
12 | ### 概念
13 | 指对要解决的问题进行详细的分析,弄清楚问题的要求,包括需要输入什么数据,要得到什么结果,最后应输出什么
14 | ### 要点
15 | 1. 为实现产品目标,进行产品调研,竞品分析
16 | 2. 功能需求、性能需求、 可靠性和可用性需求、出错处理需求、将来可能提出的要求
17 | 3. **开会讨论,输出需求文档 **
18 |
19 | ## 2、软件评审
20 | ### 概念
21 | 软件评审并不是在软件开发完毕后进行评审,而是在软件开发的各个阶段都要进行评审。因为在软件开发的各个阶段都可能产生错误,如果这些错误不及时发现并纠正,会不断地扩大,最后可能导致我们开发结果不可控。
22 | ### 评审内容
23 |
24 | * A 计划的评审
25 | 主要是关注的核心在于估计是否准确;人员安排是否合理;以上两个方面如果合理,项目的进度就不会出很大的问题。
26 |
27 | * B 需求的评审
28 | 主要关注需求来源、需求的准确性、需求的完整性,避免产生二义性;最好让测试人员和客户参加,以便让各角色达成共识。
29 |
30 | * C 总体设计的评审
31 | 在总体设计评审中,最好将已经评审通过的需求文档从配置管理库中提出,对照总体设计是否和需求一致;另外,技术领域专家参加评审还要关注于设计的合理性、可实现性以及完整性。
32 |
33 | * D 代码评审
34 | 由项目组内进行代码审核,主要关注代码的格式、整体逻辑、变量的命名、程序注释等表面的属性;至于运行质量应当放在单元测试中解决。
35 |
36 | * E 管理性的评审
37 | 管理性的评审一般放在里程碑、项目结束后进行。准备的资料包括前期工作的总结,是否按照计划执行、出现的问题的数目、解决了多少、未解决的问题、是否对后期有影响等
38 |
39 | ### 评审目标
40 | * 发现任何形式表现的软件功能、逻辑或实现方面的错误;
41 | * 通过评审验证软件的需求;
42 | * 保证软件按预先定义的标准表示;
43 |
44 | ### 评审过程
45 | * 召开评审会议:一般应有公司评审委员会组织,会前每个参加者做好准备。
46 | * 会议结束后必需有结果性东西:接受该产品,不需做修改;由于错误严重,拒绝接受;暂时接受该产品。
47 | * 评审报告与记录;所提出的问题都要进行记录,在评审会结束前产生一个评审问题表,另外必须完成评审简要报告。
48 |
49 | ### 时间控制
50 | 为了提高效率,每次评审会议只评审一个工作产品,并且时间最长不能超过2个小时。所以要求,在评审准备时候各位评委事先作好准备。
51 |
52 | ## 3、详细设计
53 | ###输出
54 | 1. 软件原型图
55 | 2. 设计图
56 | 3. 交互图
57 | 4. 软件的基本结构和流程等
58 | 5. 软件的使用教程
59 |
60 | ## 4、编码
61 | 1. 开发规范定义
62 | 2. 环境和约定等等
63 |
64 |
65 | ## 5、测试
66 | 1. 测试流程规范
67 | 2. 每日测试
68 | 3. 测试报告
69 |
70 | ## 6、维护和迭代
71 | 1. 按此流程来处理
72 |
73 |
74 | ## 7、实际操作
75 | 1. 需求、设计、开发结束阶段都需要进行评审
76 | 2. 每周一下午开软件团队的会议,( < 2h )
77 | * 评审
78 | * 总结上一周做的工作
79 | * 本周的计划
80 | * 提出自己的问题和想法
81 |
82 | 3. 各阶段输出相关的文档
83 | 4. 使用 teambition 来管理开发流程
84 |
85 | ### Teambition
86 |
87 | 任务主要通过产品、文档、设计、开发、测试负责人委派,个人建立任务为辅。
88 | 通过负责人进行任务委派,以便观察任务进展,做出适当调整。
89 |
90 | Teambition 任务分组
91 | > 产品
92 | 文档
93 | 设计
94 | 开发
95 | 测试
96 |
97 | 任务分组以**工作内容**任务划分,而不是原本的项目划分。
98 | >长期项目(笔戈博客),建立项目版块,长期使用和维护。
99 | 短期项目(笔戈招聘或合作项目),建立项目版块,项目完成后,进行归档。
100 |
101 | ### 360 云盘
102 | 产品原型,产品文档
103 | 设计稿,设计素材
104 |
105 | 360云盘 文件划分与 Teambition 类似,以项目划分主文件夹,工作内容划分子文件夹。比如:
106 | >笔戈博客
107 | |——产品
108 | |——开发
109 | |——设计
110 | 产品、设计、开发相应负责人需进行文件命名规范与整理
111 |
112 | ### Github Page
113 | 代码拥有相应的开发文档
114 | 脱离代码的文档,通过 Github Page 发布(如:code style)
115 |
116 |
117 | ### 版本号
118 | 产品、设计、开发文档需注明相应版本号。
119 | 版本号命名:主版本号.子版本号.修正版本号
120 |
121 | 1.项目初版时,版本号为 1.0.0
122 | 2.当项目在进行了局部修改或 bug 修正时,主版本号和子版本号都不变,修正版本号加 1(例子:1.0.1);
123 | 3.当项目在原有的基础上增加了部分功能时,主版本号不变,子版本号加 1,修正版本号复位为 0(例子:1.1.0);
124 | 4.当项目在进行了重大修改或局部修正累积较多,而导致项目整体发生全局变化时,主版本号加 1,子版本号、修正版本号复位为 0(例子:2.0.0);
125 |
126 |
127 |
--------------------------------------------------------------------------------
/软件开发参与人员.md:
--------------------------------------------------------------------------------
1 |
2 | ## 参与人员
3 |
4 | * PD(产品策划)
5 | * PM(产品经理)
6 | * ID(交互设计师)
7 | * VD(视觉设计师)
8 | * WD(前端开发工程师)
9 | * DEV(后端开发工程师)
10 | * SDET (软件开发测试工程师)
11 |
12 | ## 开发流程和职责
13 |
14 | ### MRD 市场需求文档
15 | MRD 即(Market Requirements Document市场需求文档
16 | MRD需明确传达产品需求的目的和目标,指出什么样的新产品、方案和服务为什么可以在市场上或者内部取得成功,以及希望取得怎样的成功。MRD说明“是什么”和“为什么”,但不要写“如何”(即不要包含流程图和原型图)。当产品需求为高优先级(即项目立项)时,需求方必须提供MRD文档。产品需求的优先级、权重和是否立项由项目实施委员会确定,日常需求由委员会负责人确定,非常规需求开会确定。
17 |
18 | ### PD 产品策划
19 | PD接到显性需求后,应仔细透彻地分析需求方的真正意图。有时候需求方的想法不一定正确,也有些是突然的想法并不可行,PD需进行判断;当这种情况出现时,PD有权提出自己的解决方法,包括否定需求。因判断失误造成需求冲突、重复开发等情况,责任由PD承担。当发生争执,由PM(Product Manager产品经理)协调解决。PD完成需求评审后,需告知需求方完成PRD的时间、产品开发的预估难度及完成工期。
20 | ### PRD 产品需求文档
21 | 接下来就应该是开发人员做PRD(Product Requirement Document产品需求文档),PRD侧重对产品产品功能和性能的说明,相对于MRD中的同样内容,要更加详细,并进行量化。PRD一般包含流程图、原型图等,使用用例等手段,以准确说明。也就是说从做PRD文档时就是已经进入准备开发阶段,这时MRD文档应该很明确了。
22 | ### 讨论评估
23 | 接下来大家开会讨论PRD方案,参与讨论的应该有需求方、相关领域的顾问(即有丰富经验者)、PD或UI,并做好记录。接下来PD出设计结果方案,需求方签字确认。程序员接到PRD方案后,需评估完成开发的大致时间,以及任务分解安排。
24 | ### ID
25 | ID(Interaction Designer交互设计师)根据PRD定稿做出交互设计方案,真实再现用户交互过程(工作室一般用强大的axure),并与PD、UI进行内部评审。视情况,PM参与,做完后要与需求方反复交流直到需求方满意。
26 | ### VD
27 | 接下来VD(视觉设计师)根据axure做出的原型,进行设计页面风格、布局、关键界面等。和用户交流对页面设计是否满意。
28 | ### 前端开发
29 | WD(前端开发工程师)根据设计页面切图,编写HTML,CSS,JS源代码。
30 | ### 后端开发
31 | 下面就进入了后台开发阶段,在编码之前,程序员应视其系统需要,进行概要设计、数据库设计,并进行内部讨论和评审。程序员对文档或原型有疑问或不理解,需与PD和ID进行沟通,了解其真实涵义,不得以任何理由私自更改已确定的PRD文档方案。**确有功能需做调整,程序员需与PD、需求方共同协商完成。改动应出具文档,由需求方、技术经理、PM同意**。每个人写的代码都不可能完全正确,这样就需要边开发边测试。
32 | ### 测试
33 | α(alpha最初)测试。在开发小组内部进行,测试的方法也较多,黑盒、白盒、 压力、应力等。此阶段
34 |
35 |
--------------------------------------------------------------------------------
` )
49 | - 尽量减少标签数量
50 |
51 | ```html
52 |
Bigertech StyleGuide
53 |
54 |
55 |
56 |
57 |
58 | - Style
59 | - Guide
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 | ```
70 |
71 | ### 1.3 class 与 id
72 | - class 以功能或内容命名,不以表现形式命名
73 | - class 与 id 单词字母小写,多个单词组成时,采用中划线`-`分隔
74 | - 使用唯一的 id 作为 Javascript hook, 同时避免创建无样式信息的 class
75 |
76 | ```html
77 |
78 |
79 |
80 |
81 |
82 | ```
83 |
84 | ### 1.4 属性顺序
85 | HTML 属性应该按照特定的顺序出现以保证易读性。
86 |
87 | - id
88 | - class
89 | - name
90 | - data-xxx
91 | - src, for, type, href
92 | - title, alt
93 | - aria-xxx, role
94 |
95 | ```html
96 |
97 |
98 |
99 |
100 |
101 | ```
102 |
103 | ### 1.5 引号
104 | 属性的定义,统一使用双引号
105 |
106 | ```html
107 |
108 | bigertech
109 |
110 |
111 | bigertech
112 | ```
113 |
114 | ### 1.6 缩进
115 | - 使用 Tab ( 4 个空格 ) 进行缩进
116 | - 块级嵌套元素应当缩进一次 ( 4 个空格 )
117 |
118 | ```html
119 |
120 | - first
121 | - second
122 |
123 | ```
124 |
125 | ### 1.7 嵌套
126 | - 语义嵌套
127 | 不允许类似在 ul 下出现除了 li 外的其它子元素等等
128 | 待定
129 |
130 | - 严格嵌套
131 | 不允许 inline 元素包含 block 元素
132 | 待定
133 |
134 | ### 1.8 注释
135 | - 模块注释
136 |
137 | ```html
138 |
139 |
140 | ...
141 |
142 |
143 |
144 |
145 | ...
146 |
147 | ```
148 |
149 | - 区块注释
150 |
151 | ```html
152 |
157 | ```
158 |
159 | ### 1.9 代码验证
160 | - 使用 [W3C HTML Validator](http://validator.w3.org/) 来验证你的HTML代码有效性
161 | - 使用 [W3C CSS Validator](http://jigsaw.w3.org/css-validator/) 来验证你的CSS代码有效性
162 |
163 | >代码验证不是最终目的,真的目的在于让开发者在经过多次的这种验证过程后,能够深刻理解到怎样的语法或写法是非标准和不推荐的,即使在某些场景下被迫要使用非标准写法,也可以做到心中有数
164 |
165 | ### 1.10 文档目录结构
166 | - 待定
167 |
168 | ## 2 HEAD
169 |
170 | ### 2.1 文档类型
171 | 为每个 HTML 页面的第一行添加标准模式(standard mode)的声明,
172 | 这样能够确保在每个浏览器中拥有一致的表现
173 |
174 | ```html
175 |
176 | ```
177 |
178 | ### 2.2 语言属性
179 | ```html
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 | ```
189 | 为什么 lang="zh-cmn-Hans" 而不是我们通常写的 lang="zh-CN" 呢? 请参考 [网页头部的声明应该是用 lang="zh" 还是 lang="zh-cn"?](http://www.zhihu.com/question/20797118?utm_source=weibo&utm_medium=weibo_share&utm_content=share_question&utm_campaign=share_sidebar)
190 |
191 | ### 2.3 字符编码
192 | - 以无 BOM 的 UTF-8 编码作为文件格式
193 | - 指定字符编码的 meta 必须是 head 的第一个直接子元素. 参考 [HTML5 Charset能用吗?](http://www.qianduan.net/html5-charset-can-it.html)
194 |
195 | ```html
196 |
197 |
198 |
199 | ......
200 |
201 |