【進(jìn)化指南】從vue-cli2到vue-cli3

CLI 2和CLI 3第一個區(qū)別是npm包的包名,CLI 3并沒有沿用CLI 2的vue-cli,而是另起為@vue/cli。創(chuàng)建項目方面也發(fā)生了變化,CLI 2 可以選擇根據(jù)模板初始化項目,而CLI 3并未重新開發(fā)模板,如果開發(fā)者想要像CLI 2一樣使用模板初始化項目,可全局安裝一個橋接工具@vue/cli-init。


安裝 vue-cli3

如果已經(jīng)安裝過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 文件進(jìn)行快速原型開發(fā),不過這需要先額外安裝一個全局的擴(kuò)展:

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

創(chuàng)建 vue項目

vue create hello-world

創(chuàng)建時建議選擇手動去勾選配置,帶*建議勾選:

  1. (*)Babel (轉(zhuǎn)換es6)
  2. (*)router (路由)
  3. (*)vuex
  4. (*)less
  5. linter / formatter (一個語法規(guī)則和代碼風(fēng)格的檢查工具,可以檢測出你代碼中潛在的問題,可以保證寫出語法正確和風(fēng)格統(tǒng)一的代碼),lint有兩種檢查時機(jī),一是用戶保存文件的時候,二是用戶提交文件到git的時候。選擇Lint on save。
    1. ESLint with error prevention only —— 只檢測錯誤。
    2. ESLint + Airbnb config —— 幾乎涵蓋了JavaScript的各個方面。
    3. ESLint + Standard config —— 自帶linter和自動代碼糾正,自動格式化代碼。
    4. ESLint + Prettier —— 統(tǒng)一整個團(tuán)隊的代碼風(fēng)格。
  6. 把Babel、ESLint等配置信息全放在package.json文件里呢,還是單獨文件管理? => 單獨管理。

++這樣創(chuàng)建出來的項目結(jié)構(gòu)里,比起cli2,少了build和config文件,更為簡潔易懂。++


載入插件

  • 使用圖形化界面

    在你安裝好了CLI 3的前提下,執(zhí)行 vue ui 命令 ,會自動在瀏覽器打開圖形界面。

    先導(dǎo)入項目,再搜索要裝的插件,直接安裝即可,安裝好的插件,在\src\plugins目錄下統(tǒng)一管理,在 main.js 中只需要引入 plugins文件即可。

  • 按需引入

    借助插件 babel-plugin-import可以實現(xiàn)按需加載組件,減少文件體積。首先安裝,并在文件 .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);
    

環(huán)境變量配置

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== 內(nèi)容:
NODE_ENV = 'test'
  1. src/utils下新建一個文件setBaseUrl.js
let baseUrl = "";   //這里是一個默認(rèn)的url,可以沒有
switch (process.env.NODE_ENV) { 
                        => 根據(jù)NODE_ENV來判斷當(dāng)前環(huán)境
    case 'test':
        baseUrl = "https://test-tobet.io"  //測試服務(wù)器的請求url
        break
    case 'production':
        baseUrl = "https://tobet.io"   //生產(chǎn)環(huán)境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機(jī)制實現(xiàn)的異步的鏈?zhǔn)秸埱罂蚣?。?dāng)短時間內(nèi)重復(fù)發(fā)起同一個請求時,例如搜索推薦列表,需要將上一個請求直接取消掉再發(fā)起下一個請求,一來可以減少網(wǎng)絡(luò)請求的消耗,二來防止上一個請求的返回過慢而覆蓋了應(yīng)有的返回結(jié)果。這里我們就可以使用攔截器。

Axios的配置文件中如下:

import Vue from 'vue'
import axios from 'axios';
import urlParams from '../utils/setBaseUrl' //不同環(huán)境的請求地址配置

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

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


let pending = []; //聲明一個數(shù)組用于存儲每個ajax請求的取消函數(shù)和ajax標(biāo)識
let cancelToken = axios.CancelToken;
let removePending = (ever) => {
    for(let p in pending){
        if(pending[p].u === ever.url + '&' + ever.method) { //當(dāng)當(dāng)前請求在數(shù)組中存在時執(zhí)行函數(shù)體
            pending[p].f(); //執(zhí)行取消操作
            pending.splice(p, 1); //把這條記錄從數(shù)組中移除
        }
    }
}

//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發(fā)送前執(zhí)行一下取消操作
      config.cancelToken = new cancelToken((c)=>{
         // 這里的ajax標(biāo)識我是用請求地址&請求方式拼接的字符串,當(dāng)然你可以選擇其他的一些方式
         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響應(yīng)后再執(zhí)行一下取消操作,把已經(jīng)完成的請求從pending中移除
      // -------------------------------------------------------------------------------------------
      if(response.data.errCode ==2){
        router.push({
          path:"/login",
          querry:{redirect:router.currentRoute.fullPath}//從哪個頁面跳轉(zhuǎn)
        })
      }
      return response;
    },
    error => {
      return Promise.reject(error)
    }
)

Vue.prototype.$axios = axios;

動態(tài)圖片加載

動態(tài)圖片加載不出來的原因:靜態(tài)資源是直接被webpack copy到對應(yīng)的靜態(tài)資源文件夾下,所以根本原因就在于,用了動態(tài)路徑的圖片,webpack將它認(rèn)作為一個模塊打包了,路徑錯亂,所以404

解決:

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

reference:

i__May : http://www.itdecent.cn/p/f8430536059a (簡書)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 webpack2和vue2已經(jīng)不是新鮮東西了,滿大街的文章在講解webpack和vue,但是很多內(nèi)容寫的不是...
    技術(shù)宅小青年閱讀 6,681評論 4 43
  • babel官網(wǎng) babel 介紹 Babel 是一個通用的多用途 JavaScript 編譯器。通過 Babel ...
    鋒享前端閱讀 1,929評論 0 10
  • vue-cli搭建項目 確保安裝了node與npm 再目標(biāo)文件夾下打開終端 執(zhí)行cnpm i vue-cli -g...
    Akiko_秋子閱讀 3,358評論 1 22
  • ## 框架和庫的區(qū)別?> 框架(framework):一套完整的軟件設(shè)計架構(gòu)和**解決方案**。> > 庫(lib...
    Rui_bdad閱讀 3,151評論 1 4
  • 好像已經(jīng)有無數(shù)次,在心中默念過這句話。然而,從你年少到今次,依然縈繞于心的這句話,像一根藤蔓,勒緊脖子,喘不過氣來...
    裊裊東風(fēng)閱讀 312評論 0 0

友情鏈接更多精彩內(nèi)容