# Vuejs 開發相關工具及安裝 ###### tags: `Vuejs` ## VS Code > *[安裝連結](https://code.visualstudio.com/)* ### 入門說明 1. 建立新資料夾 2. 第一種方式:點擊資料夾右鍵 ***"Open With Code"*** 。([設定教學](https://blog.johnwu.cc/article/right-click-open-visual-studio-code.html)) 第二種方式:直接執行**VS Code**, ***"檔案" > "開啟資料夾"*** ### 延伸模組(Marketplace) + **Chinese (Traditional) Language Pack for Visual Studio Code** + 中文 (繁體) 語言套件,讓 VS Code 提供本地化的使用者介面 + **HTML Snippets**: + HTML Code Snippets + [自訂Code Snippets教學](https://www.uuu.com.tw/Public/content/article/20/20200106.htm) + *Vetur* + 檢查vue語法錯誤與校驗由vue-language-server支援 + **Volar (Vue3版的Vetur,安裝Volar就不用安裝Vetur了)** + 檢查vue語法錯誤與校驗由vue-language-server支援 + **Vue 3 Snippets**: + 基於最新的Vue 2 及Vue 3的API添加Code Snippets ## node.js > [下載](https://nodejs.org/en/download/) 建議安裝LTS版本(v16.14.0),其餘版本不確定是否可以正常安裝Vue3開發相關套件 ## 線上套件庫 > 可下載各種JavaScript套件來使用,打開CMD操作。 - **NPM *(Node Package Manager)*** 輸入 **"npm -v"** 檢查是否有安裝 ``` npm -v ``` 若沒有安裝可執行下列命令: ``` npm install npm -g ``` - **Yarn** 新的package管理器,比起npm安裝起來更為快速! 於cmd執行: ``` npm install -g yarn ``` 檢查是否安裝成功: ``` yarn -version ``` ### Yarn 優點 - 快速: 下載的套件模組會存入快取,不需要再重複下載,且 Yarn 可以平行處理多個執行。 - 可靠: 使用 yarn.lock 提高一致性與穩定性。 ## Vue3安裝 > [中文教學](https://www.javascriptc.com/vue3js/) ### 1.獨立版本 > [下載vue.js](https://unpkg.com/vue@3.2.31/dist/vue.global.js) ### 2.使用CDN方法 1. Staticfile CDN(國內) ```javascript= <script src="https://cdn.staticfile.org/vue/3.0.5/vue.global.js"></script> ``` 2. unpkg(推薦) ```javascript= <script src="https://unpkg.com/vue@next"></script> ``` ### 3.NPM方法 ``` // 最新穩定版 npm install vue@next ``` ## 建立Vue3專案(Scaffolding) 為了處理像是CSS預處理器(sass、less、stylus)、JsvaScript的轉譯Babel、TypeScript等工具/語言來負責處理,更不用說像是ESLint、Webpack、Gulp、Mocha、Chai等前端開發工具 ### Vue CLI > 全名是Vue.js Command-Line Interface,提供快速建置Vue.js專案 > 基於webpack而建立,開發服務器和構件功能和性能都將是webpack的超集 > [安裝教學](https://cli.vuejs.org/zh/guide/installation.html) **其主要功能包括:** 1. 工程腳手架(Scaffolding,鷹架) 2. Hot-reload (webpack-dev-server) 3. plug-in system 4. 用戶介面(vue ui) ### Vite(發音:維特) > - Vite 並不是基於 Webpack 的,有自己的開發服務器,利用瀏覽器中的原生 ES 模塊。 > - 這種架構使得 Vite 比 Webpack 的開發服務器快了好幾個數量級。 > - Vite 採用 **Rollup** 進行構建,速度也更快。 > - 專注於提供一個快速的開發服務器和基本的構建工具。 > - vue開發團隊全力開發中 ### 安裝教學 #### 1. Vue CLI 1. 在終端機裡面使用下面的命令列安裝Vue CLI ***(執行一次後未來建立專案就不需要了)*** ``` // 其中-g 代表我們要安裝到全域環境 npm install -g @vue/cli ``` 2. 建立專案 ***(步驟一完成後,之後建置的專案從此步驟開始執行)*** ``` vue create my-project ``` ![選擇版本](https://ppt.cc/fYFoux@.png) <center>圖、選擇安裝的版本,選擇[Vue 3]</center><Br> 3. 以VScode開啟專案資料夾,啟動專案並執行終端機輸入: ``` npm run serve ``` 4. 成功後即可以看見下列網址: ``` App running at: - Local: http://localhost:8080/ - Network: http://10.0.1.101:8080/ ``` #### 2. Vite 1. 建立專案 ``` npm init vite@latest or yarn create vite ``` 2. 選擇yarn create vite指令執行 ``` 輸入 project name select a framework : vue ``` 3. 初始專案、開啟server ``` cd project yarn // 初始化 yarn dev // 開啟server ``` --- # 必學觀念 ## 框架 ### 前端框架 vue提供了一整套的解決方案: - **vue** ( 核心庫 ) - **vue-router** ( 路由方案 ) - **vuex** ( 狀態管理方案 ) - **vue組件庫** ( 快速搭建頁面UI效果的方案,如Element UI、 Ant Design Vue UI等) ### 輔助vue項目開發工具 - **vue-cli** (npm or yarn:一鍵生成vue項目-基於webpack,大而全) - **vite** (npm or yarn:一鍵生成vue項目-基於RollUp打包,小而巧) - **vue-devtools** (瀏覽器擴充套件:輔助測試工具) - **Vetur** (vscode套件:提供語法highlight和智能提示) - **Volar** (vscode套件:提供語法highlight和智能提示,*可理解為Vue3版Vetur*) ## 目錄結構 ![目錄結構說明](https://ppt.cc/fz5uSx@.png) <center>圖、目錄結構說明</center><Br> 1. **node_modules**:負責用來存放經由 npm 安裝過後的套件 2. **public**:靜態資源,*這裡的檔案不經過webpack打包* - **public/index.html**:裡面不會有主要內容,可編輯網頁所需的meta tag或是引入外不的css或js 3. **src**:項目資料夾 - **assets**:圖檔資料夾,會經過webpack打包,必須放在這個資料夾內才能夠被引用 - **main.js**:整個vue專案的源頭,裡面引入了 Vue 並創建了 Vue 實例,這個 Vue 實例有一個引入的 components 就是 App.vue若有使用 vue 的套件,如:vue router 、vue touch,下載後須從 main.js 引入 - **components**:自訂義組件放置資料夾 - **App.vue**:頁面最上層的根節點,綁定在 index.html 中的 ```<div id ="app"></div>``` ,要使用的 component 皆會掛在 App.vue 底下 5. **index.html**:裡面不會有主要內容,可編輯網頁所需的meta tag或是引入外不的css或js 6. **package.json**:藉由此檔案進行套件管理,裡面的key可分為*dependencies* 以及 *devDependencies* - **dependencies**:用來管理一般套件,網頁本體所需要用到的套件都會擺 *dependencies* 內 - **devDependencies**:用來管理開發環境所需套件,像是常見的 webpack 、 babel 等等 ## 生命週期(Hook function) |Hooks名稱(Vue2.x/3.x)|Hooks名稱(對應V3.0 Composition API)|說明 |:---|:---|:--- |`beforeCreate`|`setup()`|Vue實體被建立,狀態、事件尚未初始化 |`created`|`setup()`|Vue實體已建立,狀態、事件初始化完成(`prop`、`data`、`computed`屬性已建立`vm.$el`屬性無法使用) |`beforeMount`|`onBeforeMount`|Vue實體尚未與模板(DOM節點)綁定 |`mounted`|`onMounted`|Vue實體掛載完成,`el`的目標DOM被`$el`替換,可以視作JQuery的Ready |`beforeUpdate`|`onBeforeUpdate`|當狀態被變動時,畫面同步更新前 |`updated`|`onUpdated`|當狀態被變動時,畫面已同步更新完成 |`beforeDestory`(2.x)|onBeforeUnmount|Vue實體物件被銷毀前 |`beforeUnmount`(3.x)|onBeforeUnmount|Vue實體物件被銷毀前 |`destroyed`(2.x)|`onUnmounted`|Vue實體物件被銷毀完畢 |`unmounted`(3.x)|`onUnmounted`|Vue實體物件被銷毀完畢 |`errorCaptured`|`onErrorCaptured`|子/孫元件的錯誤被捕獲時觸發 |`activated`|- -|Vue元件被啟動時觸發,搭配 `keep-alive`使用 |`deactivated`|- -|Vue元件被解除時觸發,搭配 `keep-alive`使用 [>>>更完整的說明](https://book.vue.tw/CH1/1-7-lifecycle.html) ## Vue.js的黑魔法-指令 - **v-bind**:屬性綁定 > 常見的標籤屬性,如:id src href...等DOM元素的屬性 ``` javascript= //-- 樣板 <template> <div class="app"> <p id="{{ PID }}"></p> //-- 錯誤,無法成功渲染PID置瀏覽器上 <p v-bind:id="{{ PID }}"></p> //-- 正確 <p :id="{{ PID }}"></p> //-- 正確,: 為精簡寫法 </div> </template> //-- js <srcipt> const vm =Vue.createApp({ data(){ return{ PID:'item--'' } } }).mount('#app') </srcipt> ``` - **v-model**:表單"雙向"綁定,(表單元件如input、textarea、select) - **v-model修飾子** - .lazy:離開焦點後才更新內容 - .number - .trim ``` javascript= //-- 樣板 <template> <div class="app"> // input文字框 <input v-model="message" placeholder="編輯"> <p>Message is: {{ message }}</p> // textarea文字方塊 <p><span>Multiline message is:</span>{{ message }}</p> <textarea v-model="message"></textarea> //radio <input type="radio" id="one" value="1" v-model="picked"> <label for="one">One</label> <input type="radio" id="two" value="2" v-model="picked"> <label for="two">Two</label> // checked <input type="checkbox" id="jack" value="Jack" v-model="checkedNames"> <label for="jack">Jack</label> <input type="checkbox" id="mike" value="Mike" v-model="checkedNames"> <label for="mike">Mike</label> </div> </template> //-- js <srcipt> const vm =Vue.createApp({ data(){ return{ message:'Hello world!!', picked:1, // 預設1 checkedNames:[] // } } }); vm.mount('#app') ``` - **v-text** > 無視標籤內原本的內容 ``` javascript= <div v-text='text'>World!</div> // vue3不能再加上標籤內增加內容,會報錯 >>> Hello <div>{{ text }} World!</div> >>> Hello World! ``` - **v-html** > v-text會呈現單純字串(不會解析html tag),v-html則會 ``` javascript= <template> <div v-text='text'></div> // 會出現<h1>標籤 <div v-html='text'></div> // 不會出現<h1>標籤 </template> <script> const vm = Vue.createApp({ data(){ return{ text:'<h1>hello world!!</h1>' } } }) </script> ``` - **v-once** 、 **v-pre** v-once:僅渲染一次,不再更新 v-pre:加上v-pre,部會解析模板內容直接顯示 >>> *'{{text}}'* ## 事件處理 - **v-on**:事件綁定 - 修飾子 - .stop - .prevent - .capture - .self - .once - .passive ``` javascript= // 一般寫法 <button v-on:click="alert('text')">Click</button> // 簡寫 <button @click="alert('text')">Click</button> ``` ## 條件判斷與列表渲染 - **v-if/v-show**:條件判斷 v-show:透過CSS隱藏元素、v-if直接移除元素 - **v-for**:列表、陣列渲染 ``` javascript= <li v-for="item in book" :key="itme.id">{{ item.bookName }}</li> ``` ## 元件系統 ### 宣告與註冊 1 建立子元件: *MyList.vue* **元件命名規則** 通常會以兩個以上單字來進行命名,如: *todo-item* 、 *base-table* 2 在根實體註冊 ``` javascript= //-- HTML <div id="app"> <h3>Root Instance</h3> <!-- 使用子元件:連字號標籤 --> <my-list></my-list> <!-- 使用子元件:大寫駝峰式 --> <MyList /> </div> //-- javascript import MyList from './MyList.vue' // 匯入 const app = Vue.createApp({ name:'MyApp', components:{ MyList // 註冊 } }) ``` ### 元件之間的溝通傳遞 - **Props**:上下層元件之間,透過props來引用外部狀態。 ``` javascript= Vue.component('blog-post', { // 在 JavaScript 中是 camelCase 的 props: ['postTitle'], template: '<h3>{{ postTitle }}</h3>' }) <!-- 在 HTML 中是 kebab-case 的 --> <blog-post post-title="hello!"></blog-post> ``` - **emit**:子元件內容要將資料傳遞到父元件時。 ``` javascript= //-- childComponents.vue export default { methods: { onEmit(){ this.%emit("on-change","Hello") } } } //-- parentComponent.vue <template> <div> <child-Component @on-change="onChileChange"></child-Component> </div> </template> <script> import ChildComponent from './childComponents.vue' export default { methods:{ onChileChange(v){ console.log(v) } } } </script> ``` ![PropsAndEmit](https://d1dwq032kyr03c.cloudfront.net/upload/images/20191002/20114645maXrfGHfDH.png) --- # Vue Router ***Vue Router*** 是 Vue.js 官方提供的前端路由管理器。 [文章教學連結](https://medium.com/web-design-zone/vue-router%E9%A0%81%E9%9D%A2%E8%B7%AF%E7%94%B1%E5%88%9D%E6%AC%A1%E9%AB%94%E9%A9%97-%E5%AE%89%E8%A3%9D%E8%88%87%E4%BD%BF%E7%94%A8-bb5db769f1db) --- # Vuex --- # 開發Vue3.js支線任務 ## module bundler(模組打包工具) ### 1. webpack ### 2. rollup <br/> ## CSS Preprocessor(CSS 預處理) > CSS Preprocessor可以說是CSS語法的擴充,為了彌補CSS再大型專案專案維護性的不足,CSS預處理器中新增了變數、混入、繼承、嵌套等寫法 ![處理示意圖](https://uploads-ssl.webflow.com/60d29cc33f302e8be91cf0e2/60d29cc33f302e695b1d00c4_wszpMgU.jpeg) [圖片來源](https://www.ironistic.com/insights/css-preprocessors-or-else/) ### 1. Less ### 2. Sass/SCSS ### 3. Stylus <br/> ## axios ***axios***是Vue官方推薦的非同步工具。一併安裝***vue-axios***,vue-axios的功用很簡單,就是讓你能vue.$http 的方式叫用vue.axios 看起來比較直觀(因為早期vue.resource是這樣寫的)。 安裝: ``` npm install axios vue-axios --save ``` [文章教學連結](https://ad57475747.medium.com/%E5%BE%9E%E9%9B%B6%E9%96%8B%E5%A7%8B%E7%9A%84vue%E5%AD%B8%E7%BF%92%E6%97%A5%E8%AA%8C-%E5%AE%89%E8%A3%9D-axios-1550d6f1c862) --- # 相關教學整理 - [Vue3官方中文文檔](https://v3.cn.vuejs.org/) - [重新認識Vue.js | Kuro Hsu](https://book.vue.tw/preface.html) - [Vue3 One Piece(對岸愛好者社團)](https://vue3js.cn/) - [Vue3 教程](https://www.runoob.com/vue3/vue3-tutorial.html) - [bilibili影片-黑馬程序員](https://www.bilibili.com/video/BV1zq4y1p7ga?p=259) #259集~最後