支付宝小程序 静态扫描评测规范

2020-09-16 15:52 更新

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 中,NaNNumber 类型的一个特殊值。它被用来表示非数值,在 JavaScript 中 NaN 不等于任何值,包括它本身,因此,应使用 Number.isNaN() 或 全局的 isNaN() 函数来检测一个值是否是非数值。

19. JSAPI 调用权限检查

调用未授权的 JSAPI, 例如 my.getLocation, 可能引起程序异常。调用前,请确认已申请对应的 API 调用权限。

20. 不要在 finally 中使用部分控制流语句

JavaScript 会暂停 trycatch 语句块中的控制流语句,直到 finally 执行完毕,因此当 finally 中有 returnthrowbreakcontinue 时, trycatch 语句块中的控制流语句将被覆盖,这可能会导致非预期的结果。

21. 可能无法执行到的逻辑

因为 returnthrowcontinuebreak 语句无条件地退出代码块,其之后的任何语句都不会被执行。不可达语句通常是个错误。

22. 字符串模块语法有误,需要反引号

在创建包含变量或表达式的模版字符串时,很容易将 ` 错写为 `"` ,例如: `"${variable}"` ,正确的代码为${variable}``。

23. 检查正则表达式中,是否有连续的空格

正则表达式使用多个空格时,例如 var re = /first name/ ,很难直观的理解其中的空格数量,最好只使用指定数量的方式书写正则表达式,例如:var re = /first {2}name/ ;可以很清晰的理解为匹配 2 个空格。

24. 某些全局对象,不能被当做方法访问

ECMAScript 提供了几个全局对象,旨在直接调用。这些对象由于是大写的(比如 MathJSON)看起来像是构造函数,但是如果你尝试像函数一样执行它们,将会抛出错误。

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. 错误使用 = 作为条件判断

在条件语句中,很容易将一个比较运算符( ==)错写成赋值运算符( =),因此不建议在 ifforwhiledo...while 使用复制运算符。

34. 不应设置 data 的子项为 undefined

请不要把 data 中任何一项的 value 设为 undefined ,否则这一项将不被设置并可能遗留一些潜在问题。

35. 不建议直接修改 this.data

直接修改 this.data,无法改变页面的状态,还会造成数据不一致的问题。

36. 废弃 API 调用检查

使用即将废弃或已废弃的接口,可能会导致小程序运行异常。一般情况下,废弃的接口不会立即移除,但保险起见,建议不要使用废弃的 API,以避免小程序后续突然运行异常。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号