Taro 规范
#
项目组织#
文件组织形式以下文件组织规范为最佳实践的建议
所有项目源代码请放在项目根目录 src
目录下,项目所需最基本的文件包括 入口文件 以及 页面文件
- 入口文件为
app.js
- 页面文件建议放置在
src/pages
目录下
一个可靠的 Taro 项目可以按照如下方式进行组织
#
文件命名Taro 中普通 JS/TS 文件以小写字母命名,多个单词以下划线连接,例如 util.js
、util_helper.js
Taro 组件文件命名遵循 Pascal 命名法,例如 ReservationCard.jsx
#
文件后缀Taro 中普通 JS/TS 文件以 .js
或者 .ts
作为文件后缀
Taro 组件则以 .jsx
或者 .tsx
作为文件后缀,当然这不是强制约束,只是作为一个实践的建议,组件文件依然可以以 .js
或者 .ts
作为文件后缀
#
JavaScript 书写规范在 Taro 中书写 JavaScript 请遵循以下规则
#
基本书写#
使用两个空格进行缩进不要混合使用空格与制表符作为缩进
#
除了缩进,不要使用多个空格#
不要在句末使用分号#
字符串统一使用单引号#
代码块中避免多余留白#
关键字后面加空格#
函数声明时括号与函数名间加空格#
展开运算符与它的表达式间不要留空白#
遇到分号时空格要后留前不留#
代码块首尾留空格#
圆括号间不留空格#
属性前面不要加空格#
一元运算符前面跟一个空格#
注释首尾留空格#
模板字符串中变量前后不加空格#
逗号后面加空格#
不允许有连续多行空行#
单行代码块两边加空格#
不要使用非法的空白符#
始终将逗号置于行末#
点号操作符须与属性需在同一行#
文件末尾留一空行#
函数调用时标识符与括号间不留间隔#
键值对当中冒号与值之间要留空白#
变量定义#
使用 const/let 定义变量当前作用域不需要改变的变量使用
const
,反之则使用let
#
每个 const/let 关键字单独声明一个变量#
不要重复声明变量#
不要使用 undefined 来初始化变量#
对于变量和函数名统一使用驼峰命名法#
不要定义未使用的变量#
避免将变量赋值给自己#
基本类型#
不要省去小数点前面的 0#
字符串拼接操作符 (Infix operators) 之间要留空格#
不要使用多行字符串#
检查 NaN 的正确姿势是使用 isNaN()#
用合法的字符串跟 typeof 进行比较操作#
对象与数组#
对象中定义了存值器,一定要对应的定义取值器#
使用数组字面量而不是构造器#
不要解构空值#
对象字面量中不要定义重复的属性#
不要扩展原生对象#
外部变量不要与对象属性重名#
对象属性换行时注意统一代码风格#
避免使用不必要的计算值作对象属性#
函数#
避免使用 arguments.callee 和 arguments.caller#
不要定义冗余的函数参数#
避免多余的函数上下文绑定#
不要使用 eval()#
不要使用多余的括号包裹函数#
避免对声明过的函数重新赋值#
注意隐式的 eval()#
嵌套的代码块中禁止再定义函数#
禁止使用 Function 构造器#
禁止使用 Object 构造器#
自调用匿名函数 (IIFEs) 使用括号包裹#
不使用 Generator 函数语法使用
Promise
或者async functions
来实现异步编程
#
正则#
正则中不要使用控制符#
正则中避免使用多个空格#
类定义#
类名要以大写字母开头#
避免对类名重新赋值#
子类的构造器中一定要调用 super#
使用 this 前请确保 super() 已调用#
禁止多余的构造器#
类中不要定义冗余的属性#
无参的构造函数调用时要带上括号#
new 创建对象实例后需要赋值给变量#
模块#
同一模块有多个导入时一次性写完#
import, export 和解构操作中,禁止赋值到同名变量#
语句#
避免在 return 语句中出现赋值语句#
禁止使用 with#
不要使用标签语句#
不要随意更改关键字的值#
return,throw,continue 和 break 后不要再跟代码#
逻辑与循环#
始终使用 === 替代 ==例外: obj == null 可以用来检查 null || undefined
#
避免将变量与自己进行比较操作#
if/else 关键字要与花括号保持在同一行#
多行 if 语句的的括号不能省略#
对于三元运算符 ? 和 : 与他们所负责的代码处于同一行#
请书写优雅的条件语句(avoid Yoda conditions)#
避免使用常量作为条件表达式的条件(循环语句除外)#
循环语句中注意更新循环变量#
如果有更好的实现,尽量不要使用三元表达式#
switch 语句中不要定义重复的 case 分支#
switch 一定要使用 break 来将条件分支正常中断#
避免不必要的布尔转换#
避免使用逗号操作符#
错误处理#
不要丢掉异常处理中 err 参数#
catch 中不要对错误重新赋值#
用 throw 抛错时,抛出 Error 对象而不是字符串#
finally 代码块中不要再改变程序执行流程#
使用 Promise 一定要捕捉错误#
组件及 JSX 书写规范#
基本书写#
组件创建Taro 中组件以类的形式进行创建,并且单个文件中只能存在单个组件
#
代码缩进使用两个空格进行缩进,不要混合使用空格与制表符作为缩进
#
单引号JSX 属性均使用单引号
#
对齐方式多个属性,多行书写,每个属性占用一行,标签结束另起一行
#
空格使用终始在自闭合标签前面添加一个空格
#
属性书写属性名称始终使用驼峰命名法
#
JSX 与括号用括号包裹多行 JSX 标签
#
标签当标签没有子元素时,始终使用自闭合标签
如果控件有多行属性,关闭标签要另起一行
#
书写顺序在 Taro 组件中会包含类静态属性、类属性、生命周期等的类成员,其书写顺序最好遵循以下约定(顺序从上至下)
- static 静态方法
- constructor
- componentWillMount
- componentDidMount
- componentWillReceiveProps
- shouldComponentUpdate
- componentWillUpdate
- componentDidUpdate
- componentWillUnmount
- 点击回调或者事件回调 比如
onClickSubmit()
或者onChangeDescription()
- render
#
通用约束与建议#
所有内置组件均需要引入后再使用#
推荐使用对象解构的方式来使用 state、props#
不要以 class/id/style 作为自定义组件的属性名#
不要使用 HTML 标签#
不要在调用 this.setState 时使用 this.state由于 this.setState 异步的缘故,这样的做法会导致一些错误,可以通过给 this.setState 传入函数来避免
#
map 循环时请给元素加上 key 属性#
尽量避免在 componentDidMount 中调用 this.setState因为在
componentDidMount
中调用this.setState
会导致触发更新
#
不要在 componentWillUpdate/componentDidUpdate/render 中调用 this.setState#
不要定义没有用到的 state#
组件最好定义 defaultProps#
render 方法必须有返回值#
值为 true 的属性可以省略书写值#
JSX 属性或者表达式书写时需要注意空格属性书写不带空格,如果属性是一个对象,则对象括号旁边需要带上空格
#
事件绑定均以 on 开头在 Taro 中所有默认事件如
onClick
、onTouchStart
等等,均以on
开头
#
子组件传入函数时属性名需要以 on 开头#
Taro 自身限制规范#
不能使用 Array#map 之外的方法操作 JSX 数组Taro 在小程序端实际上把 JSX 转换成了字符串模板,而一个原生 JSX 表达式实际上是一个 React/Nerv 元素(react-element)的构造器,因此在原生 JSX 中你可以随意地对一组 React 元素进行操作。但在 Taro 中你只能使用
map
方法,Taro 转换成小程序中wx:for
以下代码会被 ESLint 提示警告,同时在 Taro(小程序端)也不会有效:
以下代码不会被警告,也应当在 Taro 任意端中能够运行:
解决方案
先处理好需要遍历的数组,然后再用处理好的数组调用 map
方法。