Authored by biao

Merge branch 'develop' of http://git.yoho.cn/fe/yohobuywap-node into develop

# css代码规范
## 选择器
* 使用class进行样式匹配,而不是id和标签
* 尽量避免使用属性选择器
* 尽可能精确的元素定位
## 规则细节
.ele-header, /*规则1:每个选择器声明总是使用新的一行*/
.ele-body,
.ele-footer { /*规则2:'{' 前需要添加1个空格*/
line-height: 1.2; /*规则3:样式声明以;结束,每个样式声明独占一行*/
font-weight: normal; /*规则4:属性声明的:后添加1个空格*/
margin: 0; /*规则5:属性值为0时不添加单位*/
background-color: #f3d; /*规则6:十六进制小写和缩写*/
}
/*规则7:没组选择器声明之间适用一空行间隔*/
.ele2 {
font-family: "open sans", arial, sans-serif; /*规则8:使用" ",而不是' '*/
padding: 0 1em 2em; /*规则9:适当缩写但不滥用*/
border-top: 1px;
background-color: rgba(0,0,0,.5); /*规则10:颜色值rgba等中不需要增加空格,并且去除浮点数前面不必要的0*/
}
## 声明顺序(不做强制要求,尽量实现)
这是一个选择器内书写CSS属性顺序的大致轮廓,作为最佳实践,我们应该遵循以下顺序:
* Position属性 (position,top,right,z-index...)
* Box Model属性 (display,float,width...)
* Typographic属性 (font,line-height,color,text-align...)
* Visual属性 (background,border,border-radius...)
因为Position属性可以是一个元素脱离正常的文本流并可以覆盖盒模型相关样式,所以Position排第一位。盒模型决定一个元素位置和大小紧跟其后。后面属性属于元素内部或不会对前两者产生影响的,排在后面。
完整属性顺序参考[Recsss](http://twitter.github.com/recess)
## Sass风格
* 控制嵌套层级,禁止超过5层,尽量控制在3层以内
... ...
# JavaScript代码规范
## 行的长度
每行长度不应该超过**120**个字符,如果一行多余120个字符,应该在一个运算符后换行,下一行增加**2**级缩进,即8个空格)
```
doSomething(argument1, argument2, argument3, argument4,
argument5);
```
## 运算符间距
二元运算符前后必须使用一个空格保持表达式的整洁,操作符包括赋值运算符和逻辑运算符
```
var name = 'xuqi'; // GOOD
var name='xuqi'; // BAD
```
## 括号间距
当使用括号时,紧接左括号之后和紧接右括号之前不应该有空格。
```
doSomething(arg); // GODD
doSomething( arg ); // BAD
```
## 变量声明
* 所有变量在使用前应该先定义
* 变量定义应该放在函数开头
* 使用var,const,let表达式定义变量,每行定义一个
* 除了首行,所有行都应该多一层缩进使变量声明对齐
* 初始化的变量放在未初始化的变量之前
* 所有的变量命名必须使用英文单词
* 浮点变量必须指明实部(即便以0.开头)和小数点后一位
```
var name = 'xuqi',
age,
sex,
...;
const $ = require('yoho.jquery');
let i;
```
另外,晦涩的变量名最好给出注释,否则别人很难读懂接下来代码的意思。
## 函数声明
* 函数在使用前应该先定义
* 函数名和开始圆括号之间无空格(包括匿名函数的function关键字与圆括号之间)
* 开始圆括号和结束圆括号之间无空格
* 参数名之间应该在逗号之后保留一个空格
* 开始花括号应该同function关键字保持同一行,结束圆括号和开始花括号之间应该保留一个空格
* 函数体保持一级缩进
```
function doSomething(arg1, arg2) {
doThing1();
doThing2();
}
const method = function() {
doSomething();
};
```
另外,IIFE的标准格式也在这里指出:
```
(function(args) {
//
}(args)); //(args)位于外层括号内
```
## 对象直接量
* 起始左括号应该与表达式保持一行
* 每个属性的键名前保持一个缩进,第一个属性应该在左括号后另一起行
* 每个属性的键名不包含引号,其后跟一个冒号(前无空格,后有空格),然后是值
* 如果属性值为函数,函数体应该在属性名之下另起一行,并且其前后均应保留一个空行
* 一组相关属性的前后插入空行以提高代码的可读性
* 结束的右括号独占一行
```
var person = {
name: 'xuqi',
age: 25,
groupAttr1: xx1,
groupAttr2: xx2,
walk: function() {
//your walk fn
}
};
```
* 当对象字面量作为函数参数时,起始括号应该与函数名同行
```
doSomething({
//do something
});
```
## 命名
### 变量:
* 采用小驼峰命名格式
* 变量命名为名词(区别函数)
* 变量中不使用_
### 函数:
* 采用小驼峰命名格式
* 函数命名为动词(区别变量)
* 函数名中不使用_
### 构造函数:
* 采用大驼峰命名格式
* 命名应该是名词
### 私有成员:
* 一个对象中不希望外部访问的以下划线开头(约定)
## 等号运算符
使用`===`和`!==`,禁止使用`==`和`!=`
## undefined
禁止使用`name === undefined`判断一个变量是否定义。应该使用`typeof(name) === 'undefined'`;
## 常用语句规范
### if语句
```
if (condition) {
doSomething();
} else if (condition1) {
doSomething2();
} else {
soOtherThing();
}
```
### for语句
```
// GOOD
var i;
for (i = 0; i < len; i++) {
doSomething();
}
for (i in collection) {
if (collection.hasOwnProperty(i)) {
doSomething();
}
}
// BAD
for (var i = 0; i < len; i++) {
doSomething();
}
for (i in collection) {
doSomething();
}
```
### while,do语句
```
while (condition) {
doSomething();
}
do {
doSomething();
} while (condition)
```
### switch语句
* 每一个case保持一个缩进
* 每一组语句都应该以break,return等结尾,或者用一行注释表示跳过(falling through)
* 无default的情况也要注释特别说明
```
switch (val) {
case 1:
//nothing
case 2:
doSomething();
break;
default:
doDefault();
}
```
### try语句
```
try {
doSomething();
} catch (err) {
doSomething2();
} finally {
doSomething3();
}
```
## 模块化规范
* 模块开头require加载所有依赖模块
```
var $ = require('yoho.jquery'),
flip = require('../plugin/flip'); //普通文件
require('../plguin/login');
```
* 模块抛出接口应该给予注释说明功能和使用方法
\ No newline at end of file
... ...
// use for app name
const commonConfig = require('./config/common');
/**
* OneAPM agent configuration.
*
* See lib/config.defaults.js in the agent distribution for a more complete
* description of configuration variables and their potential values.
* OneAPM agent configuration
*/
const commonConfig = require('./config/common');
exports.config = {
/**
* Array of application names.
*/
app_name : [commonConfig.appName], // eslint-disable-line
/**
* Your OneAPM license key.
*/
license_key : 'BwEGA1dRDlQ6357HHQ1AD1xJVkbc9fNfWRtQUwhQG41c5QFWGFIDSQoHc0e8AgMaUlcUVw0=',// eslint-disable-line
logging : { // eslint-disable-line
/**
* Level at which to log. 'trace' is most useful to OneAPM when diagnosing
* issues with the agent, 'info' and higher will impose the least overhead on
* production applications.
*/
level : 'info'// eslint-disable-line
app_name: [commonConfig.appName],
license_key: 'BwEGA1dRDlQ6357HHQ1AD1xJVkbc9fNfWRtQUwhQG41c5QFWGFIDSQoHc0e8AgMaUlcUVw0=',
logging: {
level: 'info'
},
transaction_events: {// eslint-disable-line
enabled: true// eslint-disable-line
transaction_events: {
enabled: true
}
};
... ...
... ... @@ -25,7 +25,7 @@ const env = {
const config = require('../package.json');
const ftpConfig = {
host: '218.94.75.50',
host: '218.94.75.58',
user: 'php',
pass: 'yoho9646'
};
... ... @@ -125,7 +125,7 @@ const postcssPlugin = (et) => {
};
// default
gulp.task('default', ['postcss-dev', 'postcss-dev-h5', 'postcss-watch', 'webpack-dev-server']);
gulp.task('default', ['postcss-dev', 'postcss-watch', 'webpack-dev-server']);
// ge
gulp.task('ge', ['postcss', 'webpack']);
... ... @@ -148,19 +148,9 @@ gulp.task('postcss-dev', () => {
.pipe(gulp.dest('css/'));
});
// postcss compile in dev-h5
gulp.task('postcss-dev-h5', () => {
return gulp.src('m-scss/m-index.css')
.pipe(sourcemaps.init())
.pipe(postcss(postcssPlugin(env.dev)))
.pipe(sourcemaps.write('.'))
.pipe(gulp.dest('css/'));
});
// postcss file watch
gulp.task('postcss-watch', () => {
gulp.watch('scss/**/*.css', ['postcss-dev']);
gulp.watch('m-scss/**/*.css', ['postcss-dev-h5']);
});
// copy assets
... ...