支付宝小程序 静态扫描评测规范
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,以避免小程序后续突然运行异常。