# Mock.js {%hackmd BJrTq20hE %} - [mock 寫法一](https://segmentfault.com/a/1190000021925199)、[fake data (DOC)](http://mockjs.com/examples.html) - [Picsum](https://picsum.photos/):假圖片(寬、高),如:https://picsum.photos/200/300 ## 安裝(in vue2):[link (寫法二)](https://blog.csdn.net/Mme061300/article/details/130343270) 1. `npm install mockjs` 2. 在src目录下创建mock目录,定义mock主文件index.js 3. 在main.js引入mock文件 ```jsx= import "@/mock/index"; ``` 1. 設定假資料: ```jsx= import Mock from "mockjs" Mock.mock("/data/list", "get", { // 属性 list 的值是一个数组,随机生成 1 到 10 个元素 "list|1-10": [ { // 随机生成1-10个★ "string|1-10": "★", ... } ] } ``` 1. 使用: ```jsx= import axios from 'axios'; function getData() { axios .get("/data/list") .then((res) => { console.log(res); }) .catch((error) => { console.log(error); }); } getData(); ``` ## 安裝(in Vite): - [vite配置mockjs](https://juejin.cn/post/6955351376146726949):`npm install mockjs`,`vite-plugin-mock --save-dev` - [viteMockServe 配置](https://github.com/anncwb/vite-plugin-mock/blob/main/README.zh_CN.md) ```typescript= //vite.config.ts import type { ConfigEnv } from 'vite' import { viteMockServe } from 'vite-plugin-mock' export default defineConfig((configEnv: ConfigEnv) => { const isBuild = configEnv.command === 'build' return { base: VITE_PUBLIC_PATH, resolve: { alias: { '~': rootPath, '@': srcPath, }, }, plugins: [ vue(), viteMockServe({ mockPath: "mock/api", //mock文件地址 localEnabled: !isBuild, // 开发打包开关 prodEnabled: isBuild, // 生产打包开关 // 这样可以控制关闭mock的时候不让mock打包到最终代码内 injectCode: ` import { setupProdMockServer } from './mockProdServer'; setupProdMockServer(); `, logger: false, //是否在控制台显示请求日志 supportTs: false //打开后,可以读取 ts 文件模块。 请注意,打开后 将无法监视.js 文件 }) ] } }); ``` - src目录下建立mock文件夾>user.ts(產生假資料): ```javascript= //user.ts import { MockMethod } from 'vite-plugin-mock' import Mock from 'mockjs' const projectList = Mock.mock({ "list|20": [{ 'name': '@cname', // 中文名 'account': `@word`, // 英文单词 'phone': /09[0-9]{8}/, // 正则模式 'deptName': Mock.mock('@cword(2,4)'), // 随机2-4字中文单词 'id': '@guid', // guid }] }) export default [ { //模拟get请求 url: '/api/getUser', method: 'get', response: () => { console.log('body>>>>>>>>') return { code: 0, message: 'ok', data: ['aa', projectList] } } }, { //模拟post请求(回傳參數) url: "/api/user/signUp", method: "post", response: (data) => { console.log("body>>>>>>>>"); return { code: 200, message: "user created", data: data.body, }; } }, { …更多api } ] as MockMethod[] ``` 開始使用: ```javascript= <template> <div>请求数据:{{ projectList }}</div> <button @click="getProjectList">获取mock数据</button> </template> <script> // import axios from 'axios'; //如果用composition需要import進來 export default { data() { return { projectList: [], }; }, created() { this.getProjectList(); }, methods: { getProjectList() { this.$http.get("/api/getUser").then((res) => { console.log(res); }); }, }, }; </script> ``` ## 安裝(in Nuxt): &emsp;&emsp;`npm i mockjs -D` ### 設定: - 在plugins目录创建mock.js文件,然後在config引入 ```javascript= // plugins/mock.js import Mock from "mockjs" Mock.mock('user.json', { "list|1-10": [ { "id|+1": 1, email: "@EMAIL", }, ], }) // 傳送資料 Mock.mock('/api/user/signUp', 'post', (options) => { console.log('body>>>>>>'); return { status: 200, message: '请求列表成功!', total: 20, data: options }; }) ``` ```javascript= //nuxt.config.js plugins: [ { src: '~plugins/mock.js', ssr: true } ], ``` ### 發送需求:(PS: 網址需與mock設定的一模一樣) - ```javascript= //取值 axios.get('user.json').then((res) => { console.log('mockData', res) }) //傳值 axios.post('/api/user/signUp', data.value).then((res) => { const data = res.data.data.body console.log(JSON.parse(data)) }) ``` ### mockjs的正則調表達式: /要定義的內容/:用兩個/包起來 \d:一個數字 ## 自定義random函數: ```javascript= Random.extend({ weekday: function(date) { var weekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; return this.pick(weekdays); }, sex: function(date) { var sexes = ['男', '女', '中性', '未知']; return this.pick(sexes); } }); console.log(Random.weekday()); // 结果: Saturday console.log(Mock.mock('@weekday')); // 结果: 112Tuesday console.log(Random.sex()); // 结果: 男 console.log(Mock.mock('@sex')); // 结果: 未知 ``` # Mockoon:mock工具 [教學](https://israynotarray.com/other/20230307/1852899605/?fbclid=IwAR1tuRH2ntkVZsBL2IzJTod78z0rRk_ho1PJtO02Ab37p3L_ZRgj4-uAsVE#Mockoon-%E6%98%AF%E4%BB%80%E9%BA%BC),[假資料文件-helpers](https://mockoon.com/docs/latest/templating/mockoon-helpers/) # Mock Service Work (mswjs) **Service Worker 特點** - https://mswjs.io/docs/getting-started ,支援 `REST` 跟 `GraphQL` 的無實體 mock server - 因為安全考量,只能在 https 和 localhost (本機測試環境)使用 service worker - 會在瀏覽器背景執行,不影響瀏覽器的主執行緒 - Service Worker不能操作DOM ## [使用教學](https://medium.com/coding-hot-pot/%E5%88%A5%E7%AD%89%E4%BA%86-%E7%94%A8mock-service-worker%E4%BE%86%E7%94%A2%E7%94%9Fmock-api%E5%90%A7-f921ab30d5c7) 1. 安裝:`npm install msw --save-dev`