【进化指南】从vue-cli2到vue-cli3

CLI 2和CLI 3第一个区别是npm包的包名,CLI 3并没有沿用CLI 2的vue-cli,而是另起为@vue/cli。创建项目方面也发生了变化,CLI 2 可以选择根据模板初始化项目,而CLI 3并未重新开发模板,如果开发者想要像CLI 2一样使用模板初始化项目,可全局安装一个桥接工具@vue/cli-init。


安装 vue-cli3

如果已经安装过vue-cli2,按以下指令卸载:

 npm uninstall vue-cli -g

安装vue-cli3:

npm install -g @vue/cli

Vue CLI 3 和旧版使用了相同的 vue 命令,所以 Vue CLI 2 (vue-cli) 被覆盖了。如果你仍然需要使用旧版本的 vue init 功能,你可以全局安装一个桥接工具:

npm install -g @vue/cli

你可以使用 vue serve 和 vue build 命令对单个 *.vue 文件进行快速原型开发,不过这需要先额外安装一个全局的扩展:

npm install -g @vue/cli-service-global

创建 vue项目

vue create hello-world

创建时建议选择手动去勾选配置,带*建议勾选:

  1. (*)Babel (转换es6)
  2. (*)router (路由)
  3. (*)vuex
  4. (*)less
  5. linter / formatter (一个语法规则和代码风格的检查工具,可以检测出你代码中潜在的问题,可以保证写出语法正确和风格统一的代码),lint有两种检查时机,一是用户保存文件的时候,二是用户提交文件到git的时候。选择Lint on save。
    1. ESLint with error prevention only —— 只检测错误。
    2. ESLint + Airbnb config —— 几乎涵盖了JavaScript的各个方面。
    3. ESLint + Standard config —— 自带linter和自动代码纠正,自动格式化代码。
    4. ESLint + Prettier —— 统一整个团队的代码风格。
  6. 把Babel、ESLint等配置信息全放在package.json文件里呢,还是单独文件管理? => 单独管理。

++这样创建出来的项目结构里,比起cli2,少了build和config文件,更为简洁易懂。++


载入插件

  • 使用图形化界面

    在你安装好了CLI 3的前提下,执行 vue ui 命令 ,会自动在浏览器打开图形界面。

    先导入项目,再搜索要装的插件,直接安装即可,安装好的插件,在\src\plugins目录下统一管理,在 main.js 中只需要引入 plugins文件即可。

  • 按需引入

    借助插件 babel-plugin-import可以实现按需加载组件,减少文件体积。首先安装,并在文件 .babelrc 中配置:

    ps: 这里以iview为例子~

    npm install iview --save
    npm install babel-plugin-import --save-dev
    
    // .babelrc
    {
      "plugins": [
          ["import", {
            "libraryName": "iview",
            "libraryDirectory": "src/components"
          }]
      ]
    }
    // 找不到 .babelrc,在babel.config.js中配置
    module.exports = {
      plugins: [
        ['import', {
          libraryName: 'iview',
          libraryDirectory: 'src/components'
        }]
      ]
    };
    
    //main.js
    import 'iview/dist/styles/iview.css';
    
    // 再按需引入
    import { Button, Table } from 'iview';
    Vue.component('Button', Button);
    Vue.component('Table', Table);
    

环境变量配置

npm run serve => process.env.NODE_ENV = 'development'

npm run build => process.env.NODE_ENV = 'production'

  1. package.json中
"scripts": {
    "serve": "vue-cli-service serve",
    "test": "vue-cli-service build --mode test",
    "production": "vue-cli-service build --mode production",
    "build": "vue-cli-service build"
}
  1. 根目录下新建文件.env.==test== 内容:
NODE_ENV = 'test'
  1. src/utils下新建一个文件setBaseUrl.js
let baseUrl = "";   //这里是一个默认的url,可以没有
switch (process.env.NODE_ENV) { 
                        => 根据NODE_ENV来判断当前环境
    case 'test':
        baseUrl = "https://test-tobet.io"  //测试服务器的请求url
        break
    case 'production':
        baseUrl = "https://tobet.io"   //生产环境url
        break
    default:
        baseUrl = '/api'   //'/api'为vue.config.js配置
}

export default baseUrl;
  1. main.js中
import axios from 'axios';
import baseUrl from '@/utils/setBaseUrl'
axios.defaults.baseURL = baseUrl;
  1. 配置本地请求地址

    在根目录下新建vue.config.js(会自动记载)

module.exports = {
  baseUrl: process.env.NODE_ENV === 'production' ? '/' : '/',

  devServer: {
    proxy: {
        将 setBaseUrl.js 里的 baseUrl 匹配过来
            || 
        '/api': {
            target: 'http://192.168.0.88:8080',   // 需要请求的地址
            changeOrigin: true,  // 是否跨域
            pathRewrite: {
                '^/api': '/'  // 替换target中的请求地址,也就是说,在请求的时候,
                              // url用'/proxy'代替'http://ip.taobao.com'
            }
        }
    },  // 配置多个代理
  }
};

vue+Axios 使用拦截器

Axios是基于Promise机制实现的异步的链式请求框架。当短时间内重复发起同一个请求时,例如搜索推荐列表,需要将上一个请求直接取消掉再发起下一个请求,一来可以减少网络请求的消耗,二来防止上一个请求的返回过慢而覆盖了应有的返回结果。这里我们就可以使用拦截器。

Axios的配置文件中如下:

import Vue from 'vue'
import axios from 'axios';
import urlParams from '../utils/setBaseUrl' //不同环境的请求地址配置

const constant = {};
constant.env = process.env;
constant.url = urlParams;

axios.defaults.baseURL = urlParams.baseUrl;
axios.defaults.withCredentials = true;
axios.defaults.timeout = 30000;


let pending = []; //声明一个数组用于存储每个ajax请求的取消函数和ajax标识
let cancelToken = axios.CancelToken;
let removePending = (ever) => {
    for(let p in pending){
        if(pending[p].u === ever.url + '&' + ever.method) { //当当前请求在数组中存在时执行函数体
            pending[p].f(); //执行取消操作
            pending.splice(p, 1); //把这条记录从数组中移除
        }
    }
}

//http request 拦截器
axios.interceptors.request.use(
    config => {
      config.data = JSON.stringify(config.data);
      config.headers = {
        'Content-Type':'application/json' //application/x-www-form-urlencoded
      }
      // ------------------------------------------------------------------------------------
      removePending(config); //在一个ajax发送前执行一下取消操作
      config.cancelToken = new cancelToken((c)=>{
         // 这里的ajax标识我是用请求地址&请求方式拼接的字符串,当然你可以选择其他的一些方式
         pending.push({ u: config.url + '&' + config.method, f: c });  
      });
      // -----------------------------------------------------------------------------------------
      return config;
    },
    error => {
      return Promise.reject(error);
    }
);

//http response 拦截器
axios.interceptors.response.use(
    response => {
      // console.log(response);
      // ------------------------------------------------------------------------------------------
      removePending(response.config);  //在一个ajax响应后再执行一下取消操作,把已经完成的请求从pending中移除
      // -------------------------------------------------------------------------------------------
      if(response.data.errCode ==2){
        router.push({
          path:"/login",
          querry:{redirect:router.currentRoute.fullPath}//从哪个页面跳转
        })
      }
      return response;
    },
    error => {
      return Promise.reject(error)
    }
)

Vue.prototype.$axios = axios;

动态图片加载

动态图片加载不出来的原因:静态资源是直接被webpack copy到对应的静态资源文件夹下,所以根本原因就在于,用了动态路径的图片,webpack将它认作为一个模块打包了,路径错乱,所以404

解决:

Vue.prototype.$baseUrl = process.env.BASE_URL;
<img :src ="$baseUrl + 'img/xxx.png'" />

reference:

i__May : https://www.jianshu.com/p/f8430536059a (简书)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容

  • 前言 webpack2和vue2已经不是新鲜东西了,满大街的文章在讲解webpack和vue,但是很多内容写的不是...
    技术宅小青年阅读 6,541评论 4 43
  • babel官网 babel 介绍 Babel 是一个通用的多用途 JavaScript 编译器。通过 Babel ...
    锋享前端阅读 1,823评论 0 10
  • vue-cli搭建项目 确保安装了node与npm 再目标文件夹下打开终端 执行cnpm i vue-cli -g...
    Akiko_秋子阅读 3,242评论 1 22
  • ## 框架和库的区别?> 框架(framework):一套完整的软件设计架构和**解决方案**。> > 库(lib...
    Rui_bdad阅读 2,911评论 1 4
  • 好像已经有无数次,在心中默念过这句话。然而,从你年少到今次,依然萦绕于心的这句话,像一根藤蔓,勒紧脖子,喘不过气来...
    袅袅东风阅读 267评论 0 0