前端組件化是如今前端框架中一個很是重要的思想元素,將頁面內容進行拆分以後,可獨立維護,可複用性大大提升。哪一個地方出問題,直接去修改的對應的組件便可。團隊人員配置多的時候,你寫你的header,我寫個人footer。相互不影響,不衝突。而組件的合理拆分,也就變成了衡量水平的一個維度之一。css
組件其實就是頁面組成的一部分,比如是電腦中的每個元件(如硬盤、鍵盤、鼠標),它是一個具備獨立的邏輯和功能或界面,同時又能根據規定的接口規則進行相互融化,變成一個完整的應用。html
頁面只不過是這樣組件的容器,組件自由組合造成功能完整的界面,當不須要某個組件,或者想要替換某個組件時,能夠隨時進行替換和刪除,而不影響整個應用的運行。前端組件化的核心思想就是將一個巨大複雜的東西拆分紅粒度合理的小東西。前端
組件化是長期開發過程當中一個提煉精華的過程,目的主要是如下幾點:vue
Vue組件化開發webpack
Vue.component(tagName,option)
component
註冊,可使組件僅在另外一個實例或者組件的做用域中可用基於Vue-cli腳手架的結構基礎劃分:git
├── index.html 入口頁面 ├── build 構建腳本目錄 │ ├── build-server.js 運行本地構建服務器,能夠訪問構後的頁面 │ ├── build.js 生產環境構建腳本 │ ├── dev-client.js 開發服務器熱重載腳本,主要用來實現開發階段的頁面自動 │ ├── dev-server.js 運行本地開發服務器 │ ├── utils.js 構建相關工具方法 │ ├── webpack.base.conf.js wabpack基礎配置 │ ├── webpack.dev.conf.js wabpack開發環境配置 │ └── webpack.prod.conf.js wabpack生產環境配置 ├── config 項目配置 │ ├── dev.env.js 開發環境變量 │ ├── index.js 項目配置文件 │ ├── prod.env.js 生產環境變量 │ └── test.env.js 測試環境變量 ├── mock mock數據目錄 │ └── hello.js ├── package.json npm包配置文件,裏面定義了項目的npm腳本,依賴包等信息 ├── src 項目源碼目錄 │ ├── main.js 入口js文件 │ ├── App.vue 根組件 │ ├── components 公共組件目錄 │ │ └── Title.vue │ ├── assets 資源目錄,這裏的資源會被wabpack構建 │ │ ├── css 公共樣式文件目錄 │ │ ├── js 公共js文件目錄 │ │ └── img 圖片存放目錄 │ ├── routes 前端路由 │ │ └── index.js │ ├── store 應用級數據(state) │ │ └── index.js │ └── views 頁面目錄 │ ├── Hello.vue │ └── NotFound.vue ├── static 純靜態資源,不會被wabpack構建。 ├── test │ └── unit 單元測試 │ │ ├── index.js 入口腳本 │ │ ├── karma.conf.js karma配置文件 │ │ └── specs 單測case目錄 │ │ │ └── HelloWorld.spec.js │── .gitignore.js 提交代碼時候須要配置的忽略提交的代碼目錄 │── README.md 展現項目基本用法功能的說明性文件
Vue官方文檔給予如下說明:web
當註冊組件 (或者 prop) 時,可使用 kebab-case (短橫線分隔命名)、camelCase (駝峯式命名) 或 PascalCase (單詞首字母大寫命名)。
camelCase 是最通用的聲明約定,而 kebab-case 是最通用的使用約定。算法
命名可遵循如下規則:npm
同時還須要注意:必須符合自定義元素規範: 使用連字符分隔單詞,切勿使用保留字。app- 前綴做爲命名空間, 若是很是通用的話可以使用一個單詞來命名,這樣能夠方便於其它項目裏複用。json
組件名爲多個單詞
組件名應該始終是多個單詞的,根組件 App 除外。
// 反例 export default { name: 'Todo', // ... } // 正例 export default { name: 'TodoItem', // ... }
組件數據
組件的 data 必須是一個函數。
當在組件中使用 data 屬性的時候 (除了 new Vue 外的任何地方),它的值必須是返回一個對象的函數。
// 反例 export default { data: { foo: 'bar' } } // 正例 export default { data () { return { foo: 'bar' } } } // 在一個 Vue 的根實例上直接使用對象是能夠的, // 由於只存在一個這樣的實例 new Vue({ data: { foo: 'bar' } })
Prop定義
Prop 定義應該儘可能詳細。
在你提交的代碼中,prop 的定義應該儘可能詳細,至少須要指定其類型。
細緻的 prop 定義有兩個好處: 1) 它們寫明瞭組件的 API,因此很容易看懂組件的用法; 2) 在開發環境下,若是向一個組件提供格式不正確的 prop,Vue 將會告警,以幫助你捕獲潛在的錯誤來源。 // 反例 props: ['status'] //正列 props: { status: String } // 更好的作法! props: { status: { type: String, required: true, validator: function (value) { return [ 'syncing', 'synced', 'version-conflict', 'error' ].indexOf(value) !== -1 } } }
爲v-for設置鍵值
老是用 key 配合 v-for。
在組件上老是必須用 key 配合 v-for,以便維護內部組件及其子樹的狀態。甚至在元素上維護可預測的行爲,好比動畫中的對象固化 (object constancy),也是一種好的作法。
// 反例 <ul> <li v-for="todo in todos"> {{ todo.text }} </li> </ul> // 正例 <ul> <li v-for="todo in todos" :key="todo.id"> {{ todo.text }} </li> </ul>
避免 v-if 和 v-for 用在一塊兒
永遠不要把 v-if 和 v-for 同時用在同一個元素上。
通常咱們在兩種常見的狀況下會傾向於這樣作:
爲了不渲染本應該被隱藏的列表 (好比 v-for="user in users" v-if="shouldShowUsers")。這種情形下,請將 v-if 移動至容器元素上 (好比 ul, ol)。
// 反例 <ul> <li v-for="user in users" v-if="user.isActive" :key="user.id" > {{ user.name }} </li> </ul> <ul> <li v-for="user in users" v-if="shouldShowUsers" :key="user.id" > {{ user.name }} </li> </ul> // 正例 <ul> <li v-for="user in activeUsers" :key="user.id"> {{ user.name }} </li> </ul> <ul v-if=""> <li v-for="user in users" :key="user.id"> {{ user.name }} </li> </ul>
爲組件樣式設置做用域
對於應用來講,頂級 App 組件和佈局組件中的樣式能夠是全局的,可是其它全部組件都應該是有做用域的。
這條規則只和單文件組件有關。你不必定要使用 scoped 特性。設置做用域也能夠經過 CSS Modules,那是一個基於 class 的相似 BEM 的策略,固然你也可使用其它的庫或約定。
無論怎樣,對於組件庫,咱們應該更傾向於選用基於 class 的策略而不是 scoped 特性。
這讓覆寫內部樣式更容易:使用了常人可理解的 class 名稱且沒有過高的選擇器優先級,並且不太會致使衝突。
// 反例 <template> <button class="btn btn-close">X</button> </template> <style> .btn-close { background-color: red; } </style> // 正例 <template> <button class="button button-close">X</button> </template> <!-- 使用 `scoped` 特性 --> <style scoped> .button { border: none; border-radius: 2px; } .button-close { background-color: red; } </style>
單文件組件文件的大小寫
單文件組件的文件名應該要麼始終是單詞大寫開頭 (PascalCase),要麼始終是橫線鏈接 (kebab-case)。
// 反例 components/ |- myComponent.vue |- mycomponent.vue // 正例 components/ |- MyComponent.vue
基礎組件名
應用特定樣式和約定的基礎組件 (也就是展現類的、無邏輯的或無狀態的組件) 應該所有以一個特定的前綴開頭,好比 Base、App 或 V。
// 反例 components/ |- MyButton.vue |- VueTable.vue |- Icon.vue // 正例 components/ |- BaseButton.vue |- BaseTable.vue |- BaseIcon.vue
單例組件名
只應該擁有單個活躍實例的組件應該以 The 前綴命名,以示其惟一性。
這不意味着組件只可用於一個單頁面,而是每一個頁面只使用一次。這些組件永遠不接受任何 prop,由於它們是爲你的應用定製的,而不是它們在你的應用中的上下文。若是你發現有必要添加 prop,那就代表這其實是一個可複用的組件,只是目前在每一個頁面裏只使用一次。
// 反例 components/ |- Heading.vue |- MySidebar.vue // 正例 components/ |- TheHeading.vue |- TheSidebar.vue
緊密耦合的組件名
和父組件緊密耦合的子組件應該以父組件名做爲前綴命名。
若是一個組件只在某個父組件的場景下有意義,這層關係應該體如今其名字上。由於編輯器一般會按字母順序組織文件,因此這樣作能夠把相關聯的文件排在一塊兒。
// 反例 components/ |- SearchSidebar.vue |- NavigationForSearchSidebar.vue // 正例 components/ |- TodoList.vue |- TodoListItem.vue |- TodoListItemButton.vue components/ |- SearchSidebar.vue |- SearchSidebarNavigation.vue
模板中的組件名大小寫
對於絕大多數項目來講,在單文件組件和字符串模板中組件名應該老是 PascalCase 命名.
// 反例 <!-- 在單文件組件和字符串模板中 --> <mycomponent/> <!-- 在單文件組件和字符串模板中 --> <myComponent/> // 正例 <!-- 在單文件組件和字符串模板中 --> <MyComponent/>
帶引號的特性值
非空 HTML 特性值應該始終帶引號。
在 HTML 中不帶空格的特性值是能夠沒有引號的,但這鼓勵了你們在特徵值裏不寫空格,致使可讀性變差。
建議:html屬性使用雙引號" ",js中使用單引號' '
// 反例 <AppSidebar :style={width:sidebarWidth+'px'}> let name = "張三", address = '上海'; // 正例 <AppSidebar :style="{ width: sidebarWidth + 'px' }"> let name = '張三', address = '上海';
推薦單文件組件元素的順序
單文件組件應該老是讓<template> 、<script> 和 <style> 標籤的順序保持一致。且 <style> 要放在最後,另外兩個標籤至少要有一個,而且全部單文件組件格式要統一。
<template>...</template> <script>/* ... */</script> <style>/* ... */</style>
- name - components - directives - filters - mixins - props - data - computed - watch - beforeCreate - created - beforeMount - mounted - beforeUpdate - updated - activated - deactivated - beforeDestroy - destroyed - methods
代碼註釋在一個項目的後期維護中顯的尤其重要,因此咱們要爲每個被複用的組件編寫組件使用說明,爲組件中每個方法編寫方法說明。
如下狀況,務必添加註釋:
單行註釋
普通方法通常使用單行註釋// 來講明該方法主要做用
多行註釋
組件使用說明,和調用說明
<!--公用組件:Dialog彈出框 /** * 組件名稱 * @module 組件存放位置 * @desc 組件描述 * @author 組件做者 * @date 2018年12月20日17:22:43 * @param {Object} [title] - 參數說明 * @param {String} [show] - 參數說明 * @example 調用示例 * <dialog :title="title" :show="show"></dialog> */ -->
優秀的項目源碼,即便是多人開發,看代碼也如出一人之手。統一的編碼規範,可以使代碼更易於閱讀,易於理解,易於維護。儘可能按照ESLint格式要求編寫代碼:
使用ES6
風格編碼源碼
定義變量使用let ,定義常量使用const 使用export ,import 模塊化
組件 props
原子化
提供默認值 使用 type 屬性校驗類型 使用 props 以前先檢查該 prop 是否存在
this.$parent
this.$refs
this
賦值給 component
變量console.log(),debugger
使用完及時刪除let name = 'jack'
v-for
循環時必定要寫:key
,而且key
使用不能使用循環的序號index
,要使用屬性id
computed
watch
監聽時,慎用deep:true
屬性,深度監聽會對性能產生影響這是我在項目開發中總結出來的一些vue開發規範,總結的還不是很完善,有問題的地方但願你們提出來,進一步完善vue開發規範,謝謝!
參考:vue風格指南
來都來了點一下贊吧,你的贊是對我最大的鼓勵^_^