跳到主要内容

Taro 代码规范(规范代码参考)

项目组织

文件命名

Taro 中普通 JS/TS 文件以小写字母命名,多个单词以下划线连接,例如 util.js、util_helper.js

Taro 组件文件命名遵循 Pascal 命名法,例如 ReservationCard.jsx

JavaScript 书写规范

在 Taro 中书写 JavaScript 请遵循以下规则

基本书写

使用两个空格进行缩进

不要混合使用空格与制表符作为缩进

function hello (name) {
console.log('hi', name) // ✓ 正确
console.log('hello', name) // ✗ 错误
}

除了缩进,不要使用多个空格

const id =    1234    // ✗ 错误
const id = 1234 // ✓ 正确

不要在句末使用分号

const a = 'a'   // ✓ 正确
const a = 'a'; // ✗ 错误

字符串统一使用单引号

console.log('hello there')
// 如果遇到需要转义的情况,请按如下三种写法书写
const x = 'hello "world"'
const y = 'hello \'world\''
const z = `hello 'world'`

代码块中避免多余留白

if (user) {
// ✗ 错误
const name = getName()

}

if (user) {
const name = getName() // ✓ 正确
}

关键字后面加空格

if (condition) { ... }   // ✓ 正确
if(condition) { ... } // ✗ 错误

函数声明时括号与函数名间加空格

function name (arg) { ... }   // ✓ 正确
function name(arg) { ... } // ✗ 错误

run(function () { ... }) // ✓ 正确
run(function() { ... }) // ✗ 错误

展开运算符与它的表达式间不要留空白

fn(... args)    // ✗ 错误
fn(...args) // ✓ 正确

遇到分号时空格要后留前不留

for (let i = 0 ;i < items.length ;i++) {...}    // ✗ 错误
for (let i = 0; i < items.length; i++) {...} // ✓ 正确

代码块首尾留空格

if (admin){...}     // ✗ 错误
if (admin) {...} // ✓ 正确

圆括号间不留空格

getName( name )     // ✗ 错误
getName(name) // ✓ 正确

属性前面不要加空格

user .name      // ✗ 错误
user.name // ✓ 正确

一元运算符前面跟一个空格

typeof!admin        // ✗ 错误
typeof !admin // ✓ 正确

注释首尾留空格

//comment           // ✗ 错误
// comment // ✓ 正确

/*comment*/ // ✗ 错误
/* comment */ // ✓ 正确

模板字符串中变量前后不加空格

const message = `Hello, ${ name }`    // ✗ 错误
const message = `Hello, ${name}` // ✓ 正确

逗号后面加空格

// ✓ 正确
const list = [1, 2, 3, 4]
function greet (name, options) { ... }
// ✗ 错误
const list = [1,2,3,4]
function greet (name,options) { ... }

不允许有连续多行空行

// ✓ 正确
const value = 'hello world'
console.log(value)
// ✗ 错误
const value = 'hello world'



console.log(value)

单行代码块两边加空格

function foo () {return true}    // ✗ 错误
function foo () { return true } // ✓ 正确
if (condition) { return true } // ✓ 正确

不要使用非法的空白符

function myFunc () /*<NBSP>*/{}   // ✗ 错误

始终将逗号置于行末

const obj = {
foo: 'foo'
,bar: 'bar' // ✗ 错误
}

const obj = {
foo: 'foo',
bar: 'bar' // ✓ 正确
}

点号操作符须与属性需在同一行

console.log('hello')  // ✓ 正确

console.
log('hello') // ✗ 错误

console
.log('hello') // ✓ 正确

文件末尾留一空行

函数调用时标识符与括号间不留间隔

console.log ('hello') // ✗ 错误
console.log('hello') // ✓ 正确

键值对当中冒号与值之间要留空白

const obj = { 'key' : 'value' }    // ✗ 错误
const obj = { 'key' :'value' } // ✗ 错误
const obj = { 'key':'value' } // ✗ 错误
const obj = { 'key': 'value' } // ✓ 正确

变量定义

使用 const/let 定义变量

当前作用域不需要改变的变量使用 const,反之则使用 let

const a = 'a'
a = 'b' // ✗ 错误,请使用 let 定义

let test = 'test'

var noVar = 'hello, world' // ✗ 错误,请使用 const/let 定义变量
每个 const/let 关键字单独声明一个变量
// ✓ 正确
const silent = true
let verbose = true

// ✗ 错误
const silent = true, verbose = true

// ✗ 错误
let silent = true,
verbose = true

不要重复声明变量

let name = 'John'
let name = 'Jane' // ✗ 错误

let name = 'John'
name = 'Jane' // ✓ 正确

不要使用 undefined 来初始化变量

let name = undefined    // ✗ 错误

let name
name = 'value' // ✓ 正确

对于变量和函数名统一使用驼峰命名法

function my_function () { }    // ✗ 错误
function myFunction () { } // ✓ 正确

const my_var = 'hello' // ✗ 错误
const myVar = 'hello' // ✓ 正确

不要定义未使用的变量

function myFunction () {
const result = something() // ✗ 错误
}

避免将变量赋值给自己

name = name   // ✗ 错误

基本类型

不要省去小数点前面的 0

const discount = .5      // ✗ 错误
const discount = 0.5 // ✓ 正确

字符串拼接操作符 (Infix operators) 之间要留空格

// ✓ 正确
const x = 2
const message = 'hello, ' + name + '!'
// ✗ 错误
const x=2
const message = 'hello, '+name+'!'

不要使用多行字符串

const message = 'Hello \
world' // ✗ 错误

检查 NaN 的正确姿势是使用 isNaN()

if (price === NaN) { }      // ✗ 错误
if (isNaN(price)) { } // ✓ 正确

用合法的字符串跟 typeof 进行比较操作

typeof name === undefined       // ✗ 错误
typeof name === 'undefined' // ✓ 正确

对象与数组

对象中定义了存值器,一定要对应的定义取值器

const person = {
set name (value) { // ✗ 错误
this._name = value
}
}

const person = {
set name (value) {
this._name = value
},
get name () { // ✓ 正确
return this._name
}
}

使用数组字面量而不是构造器

const nums = new Array(1, 2, 3)   // ✗ 错误
const nums = [1, 2, 3] // ✓ 正确

不要解构空值

const { a: {} } = foo         // ✗ 错误
const { a: { b } } = foo // ✓ 正确

对象字面量中不要定义重复的属性

const user = {
name: 'Jane Doe',
name: 'John Doe' // ✗ 错误
}

不要扩展原生对象

Object.prototype.age = 21     // ✗ 错误

外部变量不要与对象属性重名

let score = 100
function game () {
score: while (true) { // ✗ 错误
score -= 10
if (score > 0) continue score
break
}
}

对象属性换行时注意统一代码风格

const user = {
name: 'Jane Doe', age: 30,
username: 'jdoe86' // ✗ 错误
}

const user = { name: 'Jane Doe', age: 30, username: 'jdoe86' } // ✓ 正确

const user = {
name: 'Jane Doe',
age: 30,
username: 'jdoe86'
}

避免使用不必要的计算值作对象属性

const user = { ['name']: 'John Doe' }   // ✗ 错误
const user = { name: 'John Doe' } // ✓ 正确

函数

避免使用 arguments.callee 和 arguments.caller

function foo (n) {
if (n <= 0) return

arguments.callee(n - 1) // ✗ 错误
}

function foo (n) {
if (n <= 0) return

foo(n - 1)
}

不要定义冗余的函数参数

function sum (a, b, a) {  // ✗ 错误
// ...
}

function sum (a, b, c) { // ✓ 正确
// ...
}

避免多余的函数上下文绑定

const name = function () {
getName()
}.bind(user) // ✗ 错误

const name = function () {
this.getName()
}.bind(user) // ✓ 正确

不要使用 eval()

eval( "var result = user." + propName ) // ✗ 错误
const result = user[propName] // ✓ 正确

不要使用多余的括号包裹函数

const myFunc = (function () { })   // ✗ 错误
const myFunc = function () { } // ✓ 正确

避免对声明过的函数重新赋值

function myFunc () { }
myFunc = myOtherFunc // ✗ 错误

注意隐式的 eval()

setTimeout("alert('Hello world')")                   // ✗ 错误
setTimeout(function () { alert('Hello world') }) // ✓ 正确

嵌套的代码块中禁止再定义函数

if (authenticated) {
function setAuthUser () {} // ✗ 错误
}

禁止使用 Function 构造器

const sum = new Function('a', 'b', 'return a + b')    // ✗ 错误

禁止使用 Object 构造器

let config = new Object()   // ✗ 错误

自调用匿名函数 (IIFEs) 使用括号包裹

const getName = function () { }()     // ✗ 错误

const getName = (function () { }()) // ✓ 正确
const getName = (function () { })() // ✓ 正确

不使用 Generator 函数语法

使用 Promise 或者 async functions 来实现异步编程

function* helloWorldGenerator() {     // ✗ 错误
yield 'hello';
yield 'world';
return 'ending';
}

正则

正则中不要使用控制符

const pattern = /\x1f/    // ✗ 错误
const pattern = /\x20/ // ✓ 正确

.......................... (截取部分内容)

转自Taro规范