---
# System prepended metadata

title: 在 Vue 上建置 Mock
tags: [Vue2, Mock, Vue-cli]

---

# 在 Vue 上建置 Mock
###### tags: `Vue-cli`、`Mock`、`Vue2`
### 1. 這邊要模擬假 Url 呼叫，故須要透過 nodejs 來當作假後台，所以前台需要用 node 的 express 方式打接口，下載 body-parser 跟 express
```shell=
npm install express --save
npm install body-parser --save
```

### 2. 創建 mock 資料夾與 mock.js
#### mock.js
```javascript=
const express = require("express")
const bodyParser = require("body-parser")
const server = express()
const routes = require("./index.js")

server.set("port", process.env.PORT || 3000)
server.use((req, res, next) => {
  res.header("Access-Control-Allow-Origin", "*")
  res.header("Access-Control-Allow-Headers", "*")
  res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS")
  next()
})
server.use(
  //用來解析request body
  bodyParser.urlencoded({
    extended: true,
    parameterLimit: 10000,
    limit: 1024 * 1024 * 10
  })
)
server.use(bodyParser.json())
server.use("/", routes)

// http服務
server.listen(3000, () => {
  console.log(`Mock server is running at http://localhost:${server.get("port")}`)
})
```

### 3.建立 API 呼叫方法 index.js
```javascript=
const router = require("express").Router()
/**
 * 呼叫 API 方法
 * @param  {String} method 請求方式
 * @param  {String} path API 路徑
 * @param  {Object} json 回傳的 json 物件
 * @param  {Number} time 模擬回傳的時間
 */
const callApi = ({ method = "get", path, json, time = 800 }) => {
  const func = (req, res) => {
    setTimeout(() => {
      res.json(json.bind(this, req)())
    }, time)
  }
  router[method](path, func)
}

callApi({ path: "{{實際 APIUrl}}", json: require("假資料路徑"), method: "post" })

module.exports = router
```
#### 假資料範例，某資料夾下檔案
```javascript=
const api = () => ({
  errorCode: "",
  message: "",
  data: {
    result: true
  }
})
module.exports = api
```
#### 注意!!!
#### Mock Server 為自己設定的port，所以若要呼叫，則須針對 api 的 url 更改為該port號
#### 可透過下 npm scripts的方式來動態調整
##### package.json
```javascript=
  "scripts": {
    "serve": "vue-cli-service serve --mode local",
    "serve:mock": "cross-env MOCK_MODE=true vue-cli-service serve --mode local",
    "build": "vue-cli-service build --no-clean",
    "lint": "vue-cli-service lint",
    "mock": "node mock/mock.js"
  }
```
##### vue.config.js
```javascript=
const isMock = process.env.MOCK_MODE === "true"
module.exports = {
    ...,
    plugins: [
      // new BundleAnalyzerPlugin(),
      new webpack.ProvidePlugin({
        $: "jquery",
        jquery: "jquery",
        jQuery: "jquery",
        "window.jQuery": "jquery"
      }),
      new webpack.DefinePlugin({
        VUE_APP_IS_MOCK: JSON.stringify(JSON.parse(isMock))
      }),
      new compressionWebpackPlugin({
        algorithm: "gzip",
        test: new RegExp("\\.(" + productionGzipExtensions.join("|") + ")$"),
        threshold: 10 * 1024,
        minRatio: 0.8,
        deleteOriginalAssets: false
      })
    ]

}
```
##### api/index.js
```javascript=
/* global VUE_APP_IS_MOCK */
const request = ({ name = "", url = "", options = {}, otherOption = {}, method = "post" }) => {
  let mockUrl = ""
  if (VUE_APP_IS_MOCK) {
    mockUrl = ~needMockApi.indexOf(name) ? `//${window.location.hostname}:3000` : ""
  }
}
```