Mock.js 主要干了两件事:javascript
走走,这就去看看是咋回事儿html
即
Mock.mock(template)
的工做原理前端
// 属性名 name
// 生成规则 rule
// 属性值 value
"name|rule": value
复制代码
正则拆分,分类处理java
template
的类型,来调用对应的 handler
处理name
, rule
两部分handler
中,依据生成规则 rule
,占位符 placeholder
处理生成对应的 value
以常见的状况为例,看源码中的相关处理方式git
能够在控制台中实验一波:mockjs.com/examples.ht…github
Mock.mock({
"apples": {
"weight": "@range(5)",
"color|5": ["red"]
},
"sum": "@./apples/weight",
"copy": "@sum"
})
复制代码
只传入模版,调用 Handler.gen(template)
->源码直通车数组
此时 template
的类型为 object
,接下来调用 Handler['object']
微信
Handler['object']
的返回值会做为 mock 的结果markdown
字段中包含
template
,表示包含生成规则的 **app如
path
指不包含生成规则的访问路径;templatePath
指包含生成规则的访问路径
依次处理属性,递归调用 Handler.gen(template, name, context)
template
为当前处理到的属性名 name
(包含生成规则)对应的属性值
在处理过程当中维护 context
中记录的字段:
path
/ templatePath
:记录当前访问路径currentContext
/ templateCurrentContext
:处理完的数据root
/ templateRoot
:根对象首次调用会将对应的数据保存到 root
/ templateRoot
中
"weight": "@range(5)" 或 "sum": "@./apples/weight" 或 "copy": "@sum"
空字符串
如指定生成规则,则取对应个数的随机字符;不然,直接取空字符串
"ASCII|1-10": ""
=> 1~10 内取一随机数做为个数
非空字符串
根据生成规则中指定的数字,获得一待处理的完整字符串
依次处理可能的占位符,调用 Handler.placeholder(placeholder, obj, templateContext, options)
获得对应的值,替换原有占位符
"@range(5)@test"
=> ["@range(5)", "@test"]
placeholder
,待处理的占位符,如"@range(5)"
obj
/ templateContext
,对应前文 context
中保存的 currentContext
/ templateCurrentContext
,处理完的数据
options
,传给该处理函数的全部字段,如当前处理的属性值类型 type
,属性值模版 template
,上下文 context
等等 ->源码直通车
拆分占位符,获得对应的名称(下文以 key
代指)及参数
引用模版中属性
"copy": "@sum"
obj[key]
已处理完,则直接使用(示例状况)key
还未处理到,则调用 Handler.gen
,先计算被引用的属性值绝对 / 相对路径
"sum": "@./apples/weight"
在
Handler.gen
首次执行时,将 1 做为路径根 ->源码直通车
依次处理 path
路径数组
占位符拆分,获得路径数组,拼接成绝对路径
[1, "sum"]
[".", "apples", "weight"]
[1, "apples", "weight"]
根据路径,从 options
中的 context
里,依据 root
/ templateRoot
,依次向下取值
Handler.gen
,先计算被引用的属性值路径没找到,返回 undefined
特定占位符
"weight": "@range(5)"
Random 文件夹下,内置了许多随机生成函数
Random 中有对应 key
无对应 key
,占位符原样返回
"color|5": ["red"]
空数组
直接返回 ""
非空数组
Handler.gen
即
Mock.mock( rurl, rtype?, template|function(options))
的工做原理
从 1.0 开始,Mock.js 经过覆盖和模拟原生 XMLHttpRequest 的行为来拦截 Ajax 请求
用 MockXMLHttpRequest
覆盖原生 window.XMLHttpRequest
在 open
中,若是初始化的 url
和 method
,在 _mocked
中找到,则会打上拦截标记(原型属性 match
,置为 true
),不然使用原生 XHR
在 send
中,经过拦截标记判断是否使用原生 XHR,如拦截请求,根据 template|function(options)
,设置响应数据:
字节跳动幸福里前端团队急缺人才(校招/社招大量HC),欢迎加我微信 orca_o 咨询~