Vue CLI 3搭建vue+vuex 最全分析

一、介紹

Vue CLI 是一個基於 Vue.js 進行快速開發的完整系統。有三個組件:

CLI@vue/cli 全局安裝的 npm 包,提供了終端裏的vue命令(如:vue create 、vue serve 、vue ui 等命令)

CLI 服務@vue/cli-service是一個開發環境依賴。構建於 webpack 和 webpack-dev-server 之上(提供 如:servebuild 和 inspect 命令)

CLI 插件:給Vue 項目提供可選功能的 npm 包 (如: Babel/TypeScript 轉譯、ESLint 集成、unit和 e2e測試 等)

二、安裝

1、全局安裝過舊版本的 vue-cli(1.x 或 2.x)要先卸載它,否則跳過此步:

npm uninstall vue-cli -g //或者 yarn global remove vue-cli

操作如下:

可以看到我之前的版本是2.9.6,卸載成功後,vue命令便不存在了

ps:npm WARN警告,可能是coffee-script 的某個依賴包改名了(coffee-script本身已經淘汰了)

2、Vue CLI 3需要 nodeJs ≥ 8.9 (官方推薦 8.11.0+,你可以使用 nvm 或 nvm-windows在同一臺電腦中管理多個 Node 版本)。

(1)查看node 版本

(2)下載安裝nodeJs很簡單(和其他系統軟件一樣根據需求按步驟安裝)這裏不做介紹,中文官方下載地址:http://nodejs.cn/download/ 

3、安裝@vue/cli(Vue CLI 3的包名稱由 vue-cli 改成了 @vue/cli

cnpm install -g @vue/cli  //yarn global add @vue/cli

操作如下圖:

查看版本:

vue -V //vue --version

結果如下圖:

三、使用

1、vue create 搭建新項目

(1)新建項目:

*官方提示:如果你在 Windows 上通過 minTTY 使用 Git Bash,交互提示符並不工作,必須通過 winpty vue.cmd create hello-world 啓動這個命令

vue create <Project Name> //文件名 不支持駝峯(含大寫字母)

具體操作如下:

首先,會提示你選擇一個preset(預設):

① 除最後兩個其他選項都是你此前保存的預設配置(如下圖第一個“ preset-config”是我之前保存的預設配置,如今便可以直接用了):

如果沒有配置保存過,則只有以下兩個選項:

② default(babel,eslint):

默認設置(直接enter)非常適合快速創建一個新項目的原型,沒有帶任何輔助功能的 npm包

③ Manually select features:

手動配置(按方向鍵 ↓)是我們所需要的面向生產的項目,提供可選功能的 npm 包

 

手動配置,根據你需要用方向鍵選擇(按 “空格鍵”選擇/取消選擇,A鍵全選/取消全選)對應功能

簡介:

? Check the features needed for your project: (Press <space> to select, <a> to toggle all, <i> to invert selection)
>( ) Babel                           //轉碼器,可以將ES6代碼轉爲ES5代碼,從而在現有環境執行。                      
 ( ) TypeScript// TypeScript是一個JavaScript(後綴.js)的超集(後綴.ts)包含並擴展了 JavaScript 的語法,需要被編譯輸出爲 JavaScript在瀏覽器運行,目前較少人再用
 ( ) Progressive Web App (PWA) Support// 漸進式Web應用程序
 ( ) Router                           // vue-router(vue路由)
 ( ) Vuex                             // vuex(vue的狀態管理模式)
 ( ) CSS Pre-processors               // CSS 預處理器(如:less、sass)
 ( ) Linter / Formatter               // 代碼風格檢查和格式化(如:ESlint)
 ( ) Unit Testing                     // 單元測試(unit tests)
 ( ) E2E Testing                      // e2e(end to end) 測試

選擇完後直接enter,然後會提示你選擇對應功能的具體工具包,選擇自己擅長或者使用廣泛的(方便遇到問題時百度),簡介如下:

①是否使用history router:

Vue-Router 利用了瀏覽器自身的hash 模式和 history 模式的特性來實現前端路由(通過調用瀏覽器提供的接口)

hash: 瀏覽器url址欄 中的 # 符號(如這個 URL:http://www.abc.com/#/hello,hash 的值爲“ #/hello”),hash 不被包括在 HTTP 請求中(對後端完全沒有影響),因此改變 hash 不會重新加載頁面

history:利用了 HTML5 History Interface 中新增的 pushState( ) 和 replaceState( ) 方法(需要特定瀏覽器支持)。單頁客戶端應用,history mode 需要後臺配置支持(詳細參見:https://router.vuejs.org/zh/guide/essentials/history-mode.html

② css預處理器

主要爲css解決瀏覽器兼容、簡化CSS代碼 等問題(* Sass誕生於2007年,最早也是最成熟的一款CSS預處理器語言。

? Please pick a preset: Manually select features
? Check the features needed for your project: Router, Vuex, CSS Pre-processors, Linter, Unit
? Pick a CSS pre-processor (PostCSS, Autoprefixer and CSS Modules are supported by default):
> SCSS/SASS  //Sass安裝需要Ruby環境,是在服務端處理的,SCSS 是 Sass3新語法(完全兼容 CSS3且繼承Sass功能)
  LESS       //Less最終會通過編譯處理輸出css到瀏覽器,Less 既可以在客戶端上運行,也可在服務端運行 (藉助 Node.js)
  Stylus     //Stylus主要用來給Node項目進行CSS預處理支持,Stylus功能上更爲強壯,和js聯繫更加緊密,可創建健壯的、動態的的CSS。

③ ESLint:

提供一個插件化的javascript代碼檢測工具

? Pick a linter / formatter config: (Use arrow keys)
> ESLint with error prevention only
  ESLint + Airbnb config
  ESLint + Standard config
  ESLint + Prettier         //使用較多

④ 何時檢測:

? Pick additional lint features: (Press <space> to select, <a> to toggle all, <i> to invert selection)
>( ) Lint on save                    // 保存就檢測
 ( ) Lint and fix on commit          // fix和commit時候檢查

⑤ 單元測試 :

? Pick a unit testing solution: (Use arrow keys)
> Mocha + Chai  //mocha靈活,只提供簡單的測試結構,如果需要其他功能需要添加其他庫/插件完成。必須在全局環境中安裝
  Jest          //安裝配置簡單,容易上手。內置Istanbul,可以查看到測試覆蓋率,相較於Mocha:配置簡潔、測試代碼簡潔、易於和babel集成、內置豐富的expect

⑥ 如何存放配置 :

? Where do you prefer placing config for Babel, PostCSS, ESLint, etc.? (Use arrow keys)
> In dedicated config files // 獨立文件放置
  In package.json // 放package.json裏

 ⑦ 是否保存本次配置(之後可以直接使用):

? Save this as a preset for future projects? (Y/n) // y:記錄本次配置,然後需要你起個名; n:不記錄本次配置

(2)搭建完成:

項目結構如下(不同的預設包含不同的文件,大致結構一致):

對比之前的項目包:

vs

精簡的只剩靈魂了~ ,主要的大的區別如下:

① vuex(狀態管理):

vue cli 2 中 :vuex是搭建完成後自己npm install的,並不包括在搭建過程中。可以看到vue cli 2的vuex默認文件夾(store)又包含了三個js文件:action(存放一些調用外部API接口的異步執行的的方法,然後commit mutations改變mutations 數據)、index(初始化mutations 數據,是store的出口)、mutations(處理數據邏輯的同步執行的方法的集合,Vuex中store數據改變的唯一方法commit mutations)

vue cli 3 中:vuex是包含在搭建過程供選擇的預設。vue cli 3 中默認只用一個store.js代替了原來的store文件夾中的三個js文件。action、mutations、state以及store 的 getters 的用法有很多,舉常用的例子:

eg:store.js

import Vue from 'vue';
import Vuex from 'vuex'; //引入 vuex
import store from './store' //註冊store

Vue.use(Vuex); //使用 vuex

export default new Vuex.Store({
    state: {
        // 初始化狀態
        count: 0
    },
    mutations: {
        // 處理狀態
        increment(state, payload) {
            state.count += payload.step || 1;
        }
    },
    actions: {
        // 提交改變後的狀態
        increment(context, param) {
            context.state.count += param.step;
            context.commit('increment', context.state.count)//提交改變後的state.count值
        },
        incrementStep({state, commit, rootState}) {
            if (rootState.count < 100) {
                store.dispatch('increment', {//調用increment()方法
                    step: 10
                })
            }
        }
    }
})

使用時,eg:

main.js:

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store' //引入狀態管理 store

Vue.config.productionTip = false

new Vue({
  router,
  store,//註冊store(這可以把 store 的實例注入所有的子組件)
  render: h => h(App)
}).$mount('#app')

views/home.vue:

<template>
    <div class="home">
      <!--在前端HTML頁面中使用 count-->
        <HelloWorld :msg="count"/>
    </div>
</template>

<script>
    import HelloWorld from '@/components/HelloWorld.vue'
    import {mapActions, mapState} from 'vuex' //註冊 action 和 state

    export default {
        name: 'home',
        computed: {
            //在這裏映射 store.state.count,使用方法和 computed 裏的其他屬性一樣
            ...mapState([
                'count' 
            ]),
        },
        created() {
            this.incrementStep();
        },
        methods: {
            //在這裏引入 action 裏的方法,使用方法和 methods 裏的其他方法一樣
            ...mapActions([
                'incrementStep'
            ]),
        },
        components: {
            HelloWorld
        }
    }
</script>

② router (路由):

vue cli 2 :“ router/index.js ”

vue cli 3:“router.js”(用法和做的事都一樣)

③ 去掉 static  、 新增 public 文件夾

vue cli 2 :static 是 webpack 默認存放靜態資源的文件夾,打包時會直接複製一份到dist文件夾不會經過 webpack 編譯 

vue cli 3  :摒棄 static 新增了 public 。vue cli 3 中“靜態資源”兩種處理方式:

  • 經webpack 處理:在 JavaScript 被導入或在 template/CSS 中通過“相對路徑”被引用的資源會被編譯並壓縮

  • 不經webpack 處理:放置在 public 目錄下或通過絕對路徑被引用的資源將會“直接被拷貝”一份,不做任何編譯壓縮處理

④ index.html :

vue cli 2 :“index.html ” 

vue cli 3 :“public/index.html ”此模板會被 html-webpack-plugin 處理的

⑤ src/views:

vue cli 3 的 src文件夾 新增 views文件夾 用來存放 “頁面”,區分 components(組件)

⑥ 去掉 build(根據config中的配置來定義規則)、config(配置不同環境的參數)文件夾 :

 vue cli 3 中 ,這些配置 你可以通過 命令行參數、或 vue.config.js (在根目錄 新建一個 vue.config.js 同名文件)裏的 devServer 字段配置開發服務器 

⑦ babel.config.js:

配置Babel 。Vue CLI 使用了 Babel 7 中的新配置格式 babel.config.js。和 .babelrc 或 package.json 中的 babel 字段不同,這個配置文件不會使用基於文件位置的方案,而是會一致地運用到項目根目錄以下的所有文件,包括 node_modules 內部的依賴。官方推薦在 Vue CLI 項目中始終使用 babel.config.js 取代其它格式。

⑧ 根目錄的一些其他文件的改變:

之前所有的配置文件都在vue create 搭建時preset預設 或者 後期可以通過 命令參數 、 vue.config.js 中配置

根據需要在根目錄下新建 vue.config.js自行配置,eg:(簡單配置,更多配置詳情參見官網:https://cli.vuejs.org/zh/config/

module.exports = {
    baseUrl: '/',// 部署應用時的根路徑(默認'/'),也可用相對路徑(存在使用限制)
    outputDir: 'dist',// 運行時生成的生產環境構建文件的目錄(默認''dist'',構建之前會被清除)
    assetsDir: '',//放置生成的靜態資源(s、css、img、fonts)的(相對於 outputDir 的)目錄(默認'')
    indexPath: 'index.html',//指定生成的 index.html 的輸出路徑(相對於 outputDir)也可以是一個絕對路徑。
    pages: {//pages 裏配置的路徑和文件名在你的文檔目錄必須存在 否則啓動服務會報錯
        index: {//除了 entry 之外都是可選的
            entry: 'src/index/main.js',// page 的入口,每個“page”應該有一個對應的 JavaScript 入口文件
            template: 'public/index.html',// 模板來源
            filename: 'index.html',// 在 dist/index.html 的輸出
            title: 'Index Page',// 當使用 title 選項時,在 template 中使用:<title><%= htmlWebpackPlugin.options.title %></title>
            chunks: ['chunk-vendors', 'chunk-common', 'index'] // 在這個頁面中包含的塊,默認情況下會包含,提取出來的通用 chunk 和 vendor chunk
        },
        subpage: 'src/subpage/main.js'//官方解釋:當使用只有入口的字符串格式時,模板會被推導爲'public/subpage.html',若找不到就回退到'public/index.html',輸出文件名會被推導爲'subpage.html'
    },
    lintOnSave: true,// 是否在保存的時候檢查
    productionSourceMap: true,// 生產環境是否生成 sourceMap 文件
    css: {
        extract: true,// 是否使用css分離插件 ExtractTextPlugin
        sourceMap: false,// 開啓 CSS source maps
        loaderOptions: {},// css預設器配置項
        modules: false// 啓用 CSS modules for all css / pre-processor files.
    },
    devServer: {// 環境配置
        host: 'localhost',
        port: 8080,
        https: false,
        hotOnly: false,
        open: true, //配置自動啓動瀏覽器
        proxy: {// 配置多個代理(配置一個 proxy: 'http://localhost:4000' )
            '/api': {
                target: '<url>',
                ws: true,
                changeOrigin: true
            },
            '/foo': {
                target: '<other_url>'
            }
        }
    },
    pluginOptions: {// 第三方插件配置
        // ...
    }
};

(3)npm run serve 跑起來~

webstorm打開項目(個人習慣,你也可以搭建完直接順勢運行),運行後webstorm自動生成了個.idea文件(用來存放項目的配置信息,如:括版本控制信息、歷史記錄等)

(4)查看運行結果:

打開瀏覽器,輸入運行結果提示的地址(上上圖紅框),enter

(5)拉取 2.x 模板 (舊版本):

Vue CLI 3 覆蓋了舊版本的vue 命令,如果需要使用舊版本的 vue init 功能,可以全局安裝一個橋接工具:

npm install -g @vue/cli-init //`vue init` 的運行效果將會跟 `[email protected]` 相同
vue init webpack my-project

(6)在現有的項目中安裝插件(vue add 命令),eg:

* 官方提示: vue add 的設計意圖是爲了安裝和調用 Vue CLI 插件。這不意味着替換掉普通的 npm 包。對於這些普通的 npm 包,你仍然需要選用包管理器

!官方警告:我們推薦在運行 vue add 之前將項目的最新狀態提交,因爲該命令可能調用插件的文件生成器並很有可能更改你現有的文件。

vue add @vue/eslint //如果不帶 @vue 前綴,該命令會換作解析一個 unscoped 的包,你也可以基於一個指定的 scope 使用(eg:vue add @foo/bar)

2、vue ui 圖形化界面創建項目

vue ui

命令行輸入命令,操作如下:

然後會自動打瀏覽器頁面,選擇創建如下:

結果如下:

頁面提示正在安裝依賴:

本地已經有項目包了:

安裝完成:你可以在這管理(安裝、刪除)插件、運行並分析你的項目文件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章