支付宝小程序 静态扫描评测规范
1. 禁用未声明的变量
此规则可帮助你定位由变量漏写、参数名漏写和意外的隐式全局变量声明所导致的潜在引用错误(比如,在 for 循环语句中初始化变量忘写 var 关键字)。
2. 在 in instanceof 两种关系操作符 左侧表达式,不要用否定判断,运算符优先级
检查因运算符优先级错误引起的问题,禁止对关系运算符的左操作数使用否定操作符。比如 !(key in object)
错写成 !key in object
来判断 Key 值是否在对象中。类似的代码还有 !obj instanceof Ctor
。
3. 不可跨分包访问资源
分包内不可以引用其他分包的资源,如图片/js 等。
4. 组件绑定了未定义的事件函数
检查 axml 内的视图组件是否绑定了未在 js 中定义的事件处理函数。
5. acss 样式不支持属性选择器
样式文件 acss 中不支持属性选择器,例如: input[type="button"]{...}
、[title=Story]{}
。
6. acss 内本地资源引用不支持相对路径
acss 文件里的本地资源引用请使用绝对路径的方式,不支持相对路径引用。
7. key 不能设置在 block 上
key 不能设置在 block 上。
示例:不支持 <block key={{...}}></block>
。
8. 不应直接调用 APP 生命周期函数
通过 getApp()
获取实例后,请勿私自调用生命周期回调函数。
9. 数据绑定双大括号检查
数据绑定使用 Mustache 语法将遍量用两队大括号({{}})封装,组件属性需要用双引号封装。
10. Boolean 类型关键字需要引号/双大括号封装
boolean 类型关键字,需要用引号,双括号封装,当成对象处理。
11. App() 内不可调用 getApp()
App()
函数中不可以调用 getApp()
,可使用 this
可以获取当前小程序实例。
12. 禁止把保留字用作模块名
禁止把保留字用作模块名。
保留字有:globalThis、global、AlipayJSBridge、fetch、self、window、document、location、XMLHttpRequest。
13. 计时器未释放
检查是否有 setInterval 但是未 clearInterval 的场景。
14. 页面地址有效性
验证 my.navigateTo / my.redirectTo 等方法调用时,url 参数是否在 app.json 中有定义。
15. web-view 请求域名检查
页面中如果使用了 web-view 标签,但未配置 H5 域名。
16. 网络请求域名检查
页面中如果使用了 httpRequest 进行接口请求,但没有添加请求的链接,则请求会被拦截,也将导致小程序被驳回。
17. 白屏检测-页面组件为空
使用代码扫描手段进行白屏检测, 查找内容可能为空的 Page 避免小程序出现白屏, 影响体验。
18. 应使用 isNaN 进行 not-a-number 判断
在 JavaScript 中,NaN
是 Number
类型的一个特殊值。它被用来表示非数值,在 JavaScript 中 NaN
不等于任何值,包括它本身,因此,应使用 Number.isNaN()
或 全局的 isNaN()
函数来检测一个值是否是非数值。
19. JSAPI 调用权限检查
调用未授权的 JSAPI, 例如 my.getLocation
, 可能引起程序异常。调用前,请确认已申请对应的 API 调用权限。
20. 不要在 finally 中使用部分控制流语句
JavaScript 会暂停 try
和 catch
语句块中的控制流语句,直到 finally
执行完毕,因此当 finally
中有 return
、throw
、break
和 continue
时, try
和 catch
语句块中的控制流语句将被覆盖,这可能会导致非预期的结果。
21. 可能无法执行到的逻辑
因为 return
、throw
、continue
和 break
语句无条件地退出代码块,其之后的任何语句都不会被执行。不可达语句通常是个错误。
22. 字符串模块语法有误,需要反引号
在创建包含变量或表达式的模版字符串时,很容易将 ` 错写为 `"` ,例如: `"${variable}"` ,正确的代码为
${variable}``。
23. 检查正则表达式中,是否有连续的空格
正则表达式使用多个空格时,例如 var re = /first name/
,很难直观的理解其中的空格数量,最好只使用指定数量的方式书写正则表达式,例如:var re = /first {2}name/
;可以很清晰的理解为匹配 2 个空格。
24. 某些全局对象,不能被当做方法访问
ECMAScript 提供了几个全局对象,旨在直接调用。这些对象由于是大写的(比如 Math
和 JSON
)看起来像是构造函数,但是如果你尝试像函数一样执行它们,将会抛出错误。
25. 正则表达式语法错误
在正则表达式字面量中无效的模式在代码解析时会引起 SyntaxError
,但是 RegExp
的构造函数中无效的字符串只在代码执行时才会抛出 SyntaxError
,因此禁止在 RegExp
构造函数中出现无效的正则表达式。
26. 可能存在覆盖的方法申明
JavaScript 函数有两种形式:函数声明 function foo() { ... }
或者函数表达式 var foo = function() { ... }
。虽然 JavaScript 解释器可以容忍对函数声明进行覆盖或重新赋值,但通常这是个错误或会导致问题出现。
27. 改写了 try catch 的异常值
在 try
语句中的 catch
子句中,如果意外地(或故意地)给异常参数赋值,是不可能引用那个位置的错误的。由于没有 arguments
对象提供额外的方式访问这个异常,对它进行赋值绝对是毁灭性的,因此,禁止对 catch 子句中的异常重新赋值。
28. 正则中有可能为空的字符条件
在正则表达式中空字符集不能匹配任何字符,因此,正则表达式中不应出现空字符集。
29. 对象中有重复的 key
在对象中,如果出现多个属性有同样的 key,可能会导致获取到非预期的属性值。
30. 方法中有重复参数
如果在一个函数定义中出现多个同名的参数,后面出现的会覆盖前面出现的参数,导致非预期的情况发生。
31. 正则中不能使用部分字符 ASCII range 0-31 control characters
在 ASCII 中,0-31 范围内的控制字符是特殊的、不可见的字符。这些字符很少被用在 JavaScript 字符串中,所以一个正则表达式如果包含这些字符的,很有可能一个错误。
32. 控制流条件可能有逻辑错误,成为一个静态的条件
将一个常量表达式/常量值作为一个条件表达式有可能是代码编写错误,不建议使用静态值作为条件。
33. 错误使用 = 作为条件判断
在条件语句中,很容易将一个比较运算符( ==
)错写成赋值运算符( =
),因此不建议在 if
、for
、while
和 do...while
使用复制运算符。
34. 不应设置 data 的子项为 undefined
请不要把 data 中任何一项的 value 设为 undefined ,否则这一项将不被设置并可能遗留一些潜在问题。
35. 不建议直接修改 this.data
直接修改 this.data
,无法改变页面的状态,还会造成数据不一致的问题。
36. 废弃 API 调用检查
使用即将废弃或已废弃的接口,可能会导致小程序运行异常。一般情况下,废弃的接口不会立即移除,但保险起见,建议不要使用废弃的 API,以避免小程序后续突然运行异常。