vue-cli

###vue-cli使用心得

vue-cli开发 build代码的注意事项

这里,我会记录自己在使用vue-cli开发项目遇到问题和解决方案。
============
2017-03-13 log
使用官方套件build代码,chrome或者Firefox可以直接访问,IE呢?连IE11都歇菜了,很想跟IE说一句,去屎吧!
1、使用了vuex,IE运行会报prosmise需要polyfill

解决:添加babel-polyfill,要在入口文件import,而且必须在使用vuex的上面

2、数据获取使用fetch,IE运行会报Request未定义

解决:添加fetch-polyfill,要在入口文件import

============

vue-cli-mock-config

使用vue-cli,怎么配置mock的数据服务

使用vue-cli脚手架生成的开发环境,在涉及到数据获取是比较棘手,我平时使用fetch,你去GET数据是ok的,但POST就歇菜了,你会发现你的静态JSON数据文件会404

因为POST的方式是必须由node提供服务响应才能获取到,那么怎么来实现呢?

vue-cli会帮你安装express的服务器框架,有了它我们就能很快去配置一个我们自己的mock服务器了

配置步骤如下:

1.找到你已经生成好的build/dev-server.js
2.在里面添加express的路由即可
两个步骤就完成!

实例(我采用外置方式):

(build/dev-server.js)

 var dataServer = require('./data_server')
 dataServer(app)

(build/data_server.js)

 module.exports = function (app) {
     app.post('/test', function (req, res) {
          res.send('{"status":"is work"}')
     })
 }

(客户端调用代码,ajax同样适用)
 

  let req = new Request("/test", {
        method: 'POST',
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded'
       },
       body:"a=1&b=2" /*提交的数据 type String*/
  })

  fetch(req).then((response) => response.json()).then(
          (data) => sfn(data)
  ).catch(
          (e) => errfn(e)
  )

使用上述方式一个简易的服务器已经搭建好了,可是在服务端却无法获取fecth转过来的数据,要么undefined

这时我们就需要使用body-parser了,这时一个express的中间件,用来处理客户端传来的数据,一般会出现空对象的现象,这个要处理好提交的Content-Type 文档

所以data_server的配置就应该变成这样:

(build/data_server.js)

  var bodyParser = require('body-parser')
  module.exports = function (app) {    
  
    app.use(bodyParser()); //配置express
    app.use(bodyParser.json()); 
    app.use(bodyParser.urlencoded({
       extended: true
    }));
    app.use(bodyParser.json({
       type: 'application/*+json'
    }))

    app.post('/test', function (req, res) {
	    //这时我们就能在客户端看到 刚才传过来的数据
	    res.send(req.body)
    })
  }

服务端数据接收正常,那么要把本地的json数据传给客户端才算真正完成。这时我们就要借助node的fs文件模块

(build/data_server.js)

   var bodyParser = require('body-parser')
   var fs = require('fs');
   
   module.exports = function (app) {    
  
    app.use(bodyParser()); //配置express
    app.use(bodyParser.json()); 
    app.use(bodyParser.urlencoded({
       extended: true
    }));
    app.use(bodyParser.json({
       type: 'application/*+json'
    }))

     app.post('/test', function (req, res) {
       var str = JSON.stringify(req.body);
       if (str.indexOf('first') > -1) {/*这里我是根据字符串作区分*/
           var file = "E:\\test.json";  /*文件地址  \ 符号要转译*/
           var result = JSON.parse(fs.readFileSync(file));  /*采用同步的方式读取数据*/
           res.send(result)
       }
       else res.send('{"status":"is empty"}')  //默认数据
     })
   }

一个在vue-cli下的mock服务器就做好了

有一个遗留问题,vue的路由是hash方式,我们在配置express路由是不用去理会两个路由的冲突,而react-router默认就history的方式,这会和express路由冲突,必须要做特殊处理,这方面我还没有测试过,待使用后会来补充。