前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
  • JavaScript Part 1

    • Ajax总结篇
    • Canvas 绘制八大行星
    • DOM编程之API学习总结篇
    • JavaScript事件机制
    • JavaScript代码片段100个
    • JavaScript作用域分析总结
    • JavaScript原型链回顾
    • JavaScript及jQuery中的各种宽高属性图解
    • JavaScript工程项目的一系列最佳实践
    • JavaScript常用API合集
    • JavaScript数组、字符串、对象常用方法
    • JavaScript数组方法总结篇
    • JavaScript深浅拷贝
    • JavaScript运动框架之速度时间版本
    • JavaScript运行机制Event Loop
    • JavaScript防抖节流原理
    • Javascript中的复制粘贴功能
    • Javascript数组详解
    • OOP之原型与原型链
    • Object.defineProperty详解
    • V8源码浅析JS数组常见方法
    • await 在 forEach 中不生效解决方案
    • iframe+表单跨域提交POST请求
    • javascript笔记总结篇
    • 业务中处理数据结构常用的JS方法
    • 作用域
    • 你真的掌握变量和类型了吗
    • 前后端分离之数据Mock
      • 一、学前预热
        • 1.1 Web应用前后端分离
        • 1.2 利用Node+express提供模拟数据
        • 1.3 利用mockjs提供模拟数据
        • 1.4 使用postman工具测试接口
        • 1.5 ajax请求mock数据接口
      • 二、数据mock思路
        • 2.1 mock思路说明
        • 2.2 代码描述
      • 三、Mock.js使用详解
        • 3.1 Mock.js实现的功能
        • 3.2 Mock安装
          • 3.2.1 Node下使用
          • 3.2.2 RequireJS (AMD)
        • 3.3 使用语法
          • 3.3.1 数据模板定义规范
          • 3.3.2 生成规则和示例
          • 3.3.3 数据占位符定义规范
        • 3.4 Mock.mock()
          • 3.4.1 Mock.mock( template )
          • 3.4.2 Mock.mock( rurl, template )
          • 3.4.3 Mock.mock( rurl, function( options ) )
          • 3.4.4 Mock.setup()
          • 3.4.5 Mock.Random
      • 四、简单构建一套mock-server
        • 4.1 json-server 搭配 mock.js
        • 4.2 端口代理
        • 4.3 文件改动自动刷新
    • 原型与原型链
    • 原生JS补给(上)
    • 如何写出一个惊艳面试官的深拷贝
    • 带你填一些JS容易出错的坑
    • 彻底弄懂 JavaScript 执行机制
    • 执行上下文 执行栈
    • 正则回顾总结
    • 正则基础知识
    • 正则完整篇
    • 正则表达式
    • 浅析Promise原理
    • 浅谈JavaScript中的异步处理
    • 深拷贝 vs 浅拷贝
    • 聊一聊typeof instanceof 实现原理.
    • 聊一聊闭包
    • 高阶函数map reduce filter
  • JavaScript Part 2

  • CSS

  • HTML

  • Jquery

  • ES6

  • 小程序

  • Vue

  • React

  • 深入React

  • React Native

  • NodeJS

  • Angular

  • TypeScript

  • Webpack

  • 浏览器

  • 移动端

  • 前端工程化

  • Electron

  • HTTP

  • Nginx

  • Linux

  • 数据结构与算法

  • LeetCode算法题

  • 综合

完整面试题地址:
作者:程序员poetry
扫码关注作者公众号:「前端进阶之旅」 每天分享技术干货
前端进阶之旅公众号二维码

前后端分离之数据Mock|博客系列

# 一、学前预热

为了做到前后端并行开发,数据mock就成为环境搭建的重要一环

# 1.1 Web应用前后端分离

  • 后台向前台提供API接口,只负责数据的提供和计算,而完全不处理展现
  • 前台通过Http(Ajax)请求获取数据, 在浏览器端动态构建界面显示数据

# 1.2 利用Node+express提供模拟数据

  • 优点:可以在浏览器端访问
  • 缺点:如果是打包发布就无法访问模拟数据, 只能是测试时使用

修改build/dev-server.js

//加载json数据
var apiData = require('../src/mock/data.json')
var home = apiData.home;

//得到路由器
var apiRouter = express.Router()

//注册路由
apiRouter.get('/home', function (req, res) {
    res.json({
      code: 0,   //0代表正确数据
      data: seller
    })
})
//启用路由
app.use('/api', apiRouter)

//访问http://localhost:8080/api/home
@前端进阶之旅: 代码已经复制到剪贴板

# 1.3 利用mockjs提供模拟数据

Mockjs: 用来拦截ajax请求, 生成随机数据返回

  • 优点:不可以在浏览器端访问
  • 缺点:打包发布运行模拟接口也是可以用的
import Mock from 'mockjs'  
import apiData from './data.json'

Mock.mock('/api2/seller', {code:0, data:apiData.seller})
Mock.mock('/api2/goods', {code:0, data:apiData.goods})
Mock.mock('/api2/ratings', {code:0, data:apiData.ratings})
@前端进阶之旅: 代码已经复制到剪贴板

# 1.4 使用postman工具测试接口

  • postman是用来测试API接口的chrome插件
  • postman也是一个活接口文档

# 1.5 ajax请求mock数据接口

  • vue-resource是用于ajax请求的vue插件
  • axios是浏览器/服务器端通用的ajax请求库
//使用示例

import VueResource from 'vue-resource' 
Vue.use(VueResource)

//组件对象多了$http属性, 使用它发送ajax请求
this.$http.get('/api2/seller').then((response) => {
  console.log(response.body)
}, (response) => {
  console.log('失败了')
})

import axios from 'axios'  
axios.get('/api2/seller').then((response) => {
  console.log(response.body)
}, (response) => {
  console.log('失败了')
})
@前端进阶之旅: 代码已经复制到剪贴板

# 二、数据mock思路

  • 在client端处数据mock
  • 在server端mock
  • 第一种方式拦截了请求的发出,直接返回mock的数据,而第二种方式请求则真实地发出,只是在server端进行route拦截
  • 前后端分离的方式,就是在传统开发模式中加了一个node层,这样数据mock完全可以在node server端完成,基本思路如下

# 2.1 mock思路说明

  • 只有线下开发模式,才会需要进行数据mock
  • 根据请求的url,拼接形成一个file path
  • 为了避免node缓存,删除require.cache(path)
  • 读取require(path) ,如果该文件不存在或读取失败,则跳转到失败路由。这样简单的数据mock就实现了

# 2.2 代码描述

// 伪代码
if (process.env.NODE_ENV === 'development') {
  router.set('/api/*', mockapi)
}
 
function mockapi(req, res, opts) {
    var basePath = url.parse(req.url).pathname;
         
    try {
        var findPath = require.resolve(prefixPath + basePath + '.js');
        delete require.cache[findPath]
        var result = require(findPath);
    } catch (err) {
        return next(err);
    }
    if (typeof result === 'function') {
        return result(req, res, opts);
    }
    if (typeof result.status === 'undefined' || typeof result.body === 'undefined') {
        next(new Error('status 或 body 不存在'))
        return;
    }
    res.writeHead(result.status, {
        'Content-Type': 'application/json;charset=UTF-8'
    });
     
    res.write(JSON.stringify(result.body))
    res.end();
    cb()
}
@前端进阶之旅: 代码已经复制到剪贴板

# 三、Mock.js使用详解

# 3.1 Mock.js实现的功能

  • 让前端攻城师独立于后端进行开发
  • 通过随机数据,模拟各种场景
  • 不需要修改既有代码,就可以拦截 Ajax 请求,返回模拟的响应数据
  • 支持生成随机的文本、数字、布尔值、日期、邮箱、链接、图片、颜色等。

# 3.2 Mock安装

# 3.2.1 Node下使用

# 安装
npm install mockjs
@前端进阶之旅: 代码已经复制到剪贴板
// 使用 Mock
var Mock = require('mockjs')
var data = Mock.mock({
    // 属性 list 的值是一个数组,其中含有 1 到 10 个元素
    'list|1-10': [{
        // 属性 id 是一个自增数,起始值为 1,每次增 1
        'id|+1': 1
    }]
})
// 输出结果
console.log(JSON.stringify(data, null, 4))
@前端进阶之旅: 代码已经复制到剪贴板

# 3.2.2 RequireJS (AMD)

// 配置 Mock 路径
require.config({
    paths: {
        mock: 'http://mockjs.com/dist/mock'
    }
})
// 加载 Mock
require(['mock'], function(Mock){
    // 使用 Mock
    var data = Mock.mock({
        'list|1-10': [{
            'id|+1': 1
        }]
    })
    // 输出结果
    document.body.innerHTML +=
        '<pre>' +
        JSON.stringify(data, null, 4) +
        '</pre>'
})
@前端进阶之旅: 代码已经复制到剪贴板

# 3.3 使用语法

  • Mock.js 的语法规范包括两部分
    • 数据模板定义规范
    • 数据占位符定义规范

# 3.3.1 数据模板定义规范

  • 数据模板中的每个属性由 3 部分构成:属性名、生成规则、属性值
// 属性名   name
// 生成规则 rule
// 属性值   value
'name|rule': value
@前端进阶之旅: 代码已经复制到剪贴板
  • 属性名 和 生成规则 之间用竖线 | 分隔

  • 生成规则 是可选的

  • 生成规则 有 7 种格式

    • 'name|min-max': value
    • 'name|count': value
    • 'name|min-max.dmin-dmax': value
    • 'name|min-max.dcount': value
    • 'name|count.dmin-dmax': value
    • 'name|count.dcount': value
    • 'name|+step': value
  • 生成规则 的 含义 需要依赖 属性值的类型 才能确定

  • 属性值 中可以含有 @占位符

  • 属性值 还指定了最终值的初始值和类型

# 3.3.2 生成规则和示例

  • 属性值是字符串 String

    • 'name|min-max': string
      • 通过重复 string 生成一个字符串,重复次数大于等于 min,小于等于 max
    • 'name|count': string
      • 通过重复 string 生成一个字符串,重复次数等于 count。
  • 属性值是数字 Number

    • 'name|+1': number
      • 属性值自动加 1,初始值为 number
    • 'name|min-max': number
      • 生成一个大于等于 min、小于等于 max 的整数,属性值 number 只是用来确定类型
    • 'name|min-max.dmin-dmax': number
      • 生成一个浮点数,整数部分大于等于 min、小于等于 max,小数部分保留 dmin 到 dmax 位
Mock.mock({
    'number1|1-100.1-10': 1,
    'number2|123.1-10': 1,
    'number3|123.3': 1,
    'number4|123.10': 1.123
})
// =>
{
    "number1": 12.92,
    "number2": 123.51,
    "number3": 123.777,
    "number4": 123.1231091814
}
@前端进阶之旅: 代码已经复制到剪贴板
  • 属性值是布尔型 Boolean

    • 'name|1': boolean
      • 随机生成一个布尔值,值为 true 的概率是 1/2,值为 false 的概率同样是 1/2
    • 'name|min-max': value
      • 随机生成一个布尔值,值为 value 的概率是 min / (min + max),值为 !value 的概率是 max / (min + max)\
  • 属性值是对象 Object

    • 'name|count': object
      • 从属性值 object 中随机选取 count 个属性
    • 'name|min-max': object
      • 从属性值 object 中随机选取 min 到 max 个属性
  • 属性值是数组 Array

    • 'name|1': array
      • 从属性值 array 中随机选取 1 个元素,作为最终值
    • 'name|+1': array
      • 从属性值 array 中顺序选取 1 个元素,作为最终值
    • 'name|min-max': array
      • 通过重复属性值 array 生成一个新数组,重复次数大于等于 min,小于等于 max
    • 'name|count': array
      • 通过重复属性值 array 生成一个新数组,重复次数为 count
  • 属性值是函数 Function

    • 'name': function
      • 执行函数 function,取其返回值作为最终的属性值,函数的上下文为属性 'name' 所在的对象
  • 属性值是正则表达式 RegExp

    • 'name': regexp
      • 根据正则表达式 regexp 反向生成可以匹配它的字符串。用于生成自定义格式的字符串

← 你真的掌握变量和类型了吗原型与原型链 →

fe
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
  • JavaScript Part 1

    • Ajax总结篇
    • Canvas 绘制八大行星
    • DOM编程之API学习总结篇
    • JavaScript事件机制
    • JavaScript代码片段100个
    • JavaScript作用域分析总结
    • JavaScript原型链回顾
    • JavaScript及jQuery中的各种宽高属性图解
    • JavaScript工程项目的一系列最佳实践
    • JavaScript常用API合集
    • JavaScript数组、字符串、对象常用方法
    • JavaScript数组方法总结篇
    • JavaScript深浅拷贝
    • JavaScript运动框架之速度时间版本
    • JavaScript运行机制Event Loop
    • JavaScript防抖节流原理
    • Javascript中的复制粘贴功能
    • Javascript数组详解
    • OOP之原型与原型链
    • Object.defineProperty详解
    • V8源码浅析JS数组常见方法
    • await 在 forEach 中不生效解决方案
    • iframe+表单跨域提交POST请求
    • javascript笔记总结篇
    • 业务中处理数据结构常用的JS方法
    • 作用域
    • 你真的掌握变量和类型了吗
    • 前后端分离之数据Mock
      • 一、学前预热
        • 1.1 Web应用前后端分离
        • 1.2 利用Node+express提供模拟数据
        • 1.3 利用mockjs提供模拟数据
        • 1.4 使用postman工具测试接口
        • 1.5 ajax请求mock数据接口
      • 二、数据mock思路
        • 2.1 mock思路说明
        • 2.2 代码描述
      • 三、Mock.js使用详解
        • 3.1 Mock.js实现的功能
        • 3.2 Mock安装
          • 3.2.1 Node下使用
          • 3.2.2 RequireJS (AMD)
        • 3.3 使用语法
          • 3.3.1 数据模板定义规范
          • 3.3.2 生成规则和示例
          • 3.3.3 数据占位符定义规范
        • 3.4 Mock.mock()
          • 3.4.1 Mock.mock( template )
          • 3.4.2 Mock.mock( rurl, template )
          • 3.4.3 Mock.mock( rurl, function( options ) )
          • 3.4.4 Mock.setup()
          • 3.4.5 Mock.Random
      • 四、简单构建一套mock-server
        • 4.1 json-server 搭配 mock.js
        • 4.2 端口代理
        • 4.3 文件改动自动刷新
    • 原型与原型链
    • 原生JS补给(上)
    • 如何写出一个惊艳面试官的深拷贝
    • 带你填一些JS容易出错的坑
    • 彻底弄懂 JavaScript 执行机制
    • 执行上下文 执行栈
    • 正则回顾总结
    • 正则基础知识
    • 正则完整篇
    • 正则表达式
    • 浅析Promise原理
    • 浅谈JavaScript中的异步处理
    • 深拷贝 vs 浅拷贝
    • 聊一聊typeof instanceof 实现原理.
    • 聊一聊闭包
    • 高阶函数map reduce filter
  • JavaScript Part 2

  • CSS

  • HTML

  • Jquery

  • ES6

  • 小程序

  • Vue

  • React

  • 深入React

  • React Native

  • NodeJS

  • Angular

  • TypeScript

  • Webpack

  • 浏览器

  • 移动端

  • 前端工程化

  • Electron

  • HTTP

  • Nginx

  • Linux

  • 数据结构与算法

  • LeetCode算法题

  • 综合