Vue.Js開源:bilibili-vue-前端 vue + 后端 koa,全棧式開發 bilibili 首頁
前言
為什么是寫嗶哩嗶哩(俗稱B站)呢?其一是因為本人是B站的重度使用者,每周基本上都會在B站上看看火影忍者、暴走大事件等。另外一個原因呢,就是B站首頁很美觀大方,而且處處充滿了細節。所以對于實踐確實是一個不錯的項目。目前的技術棧主要的采用的是前端Vue2+后端Koa2的前后端分離的方式,語法全部使用ES6/7。關于數據也來自真實的數據接口。
技術棧
前端:vue2 + vuex + webpack + ES6/7 + stylus + nginx
后端:koa2
項目運行
源碼地址: https://github.com/lybenson/bilibili-vue
如何運行
運行前請先安裝 nodejs
clone 項目到本地
git clone https://github.com/lybenson/bilibili-vue.git
前端運行
cd bilibili-vue npm install npm run dev
后端運行
cd bilibili-vue/bilibili-api npm install npm run dev
為了確保運行正確,請先運行后端服務。再運行前端,之后訪問 http://localhost:8080
組件
根據首頁的各模塊的功能不同,劃分出了共20多個可復用的組件。具體請看下方
├── banner //輪播組件 │ ├── Banner.vue │ └── BannerItem.vue ├── common // 公共組件 │ ├── BHeader.vue │ ├── BMenu.vue │ ├── BMenuItem.vue │ ├── PostMaterial.vue │ ├── Search.vue │ └── TopContainer.vue ├── content // 主內容組件 │ └── BContent.vue ├── contentRow // 單個分類的組件 │ ├── BContentRow.vue │ ├── BRowBody.vue │ ├── BRowHead.vue │ ├── BRowItem.vue │ ├── BRowRank.vue │ └── BRowRankBody.vue ├── contentTop // 頁面頂部組件 │ ├── BContentTop.vue │ └── BContentTopItem.vue ├── live //直播所在的組件 │ ├── BLive.vue │ ├── BLiveItem.vue │ ├── BLiveRank.vue │ └── BLiveRankItem.vue ├── nav //右側導航條組件 │ ├── BNavSide.vue │ └── smooth-scroll.js └── promote // 推廣組件 ├── BPromote.vue └── BPromoteItem.vue
組件的原則就是盡量將復雜的UI布局劃分成單個小的UI組件,邏輯處理也被劃分成更多的單個小的邏輯。數據流動采用的單向數據流動。子組件的數據更多的是來自于父組件,父組件的數據主要是其本身發起的 ajax 請求。本項目中 ajax 請求庫使用的是 axios 。
狀態管理
目前的狀態管理采用 vuex 。由于 vuex 可以分多個子 module 。所以在不同模塊下單獨維護一份狀態,同時對于一些公共的狀態,比如發起網絡請求的 requesting ,錯誤時的狀態 error 則保存在根狀態中,之后可以通過子模塊中的 rootState.requesting 獲取來賦值。
在子模塊中發送網絡請求獲取數據是一個異步的過程,所以將網絡請求放在 actions 。每次發起網絡需要經歷下面的步驟
-
請求中
rootState.requesting = true //請求狀態更新為true,表示請求中 commit(TYPE.XX_REQUEST) // 發送同步操作,請求中的數據處理
-
請求成功
rootState.requesting = false //請求狀態更新為false,表示請求結束 commit(TYPE.XX_SUCCESS, response) //發送同步操作,處理請求成功后數據
-
請求失敗
rootState.requesting = false //請求狀態更新為false,表示請求結束 commit(TYPE.XX_SUCCESS, response) //發送同步操作,處理請求失敗
動畫
B站首頁充斥著大量的動畫效果。目前動畫使用的主要有三種方式:
-
以 hover 效果觸發。
-
通過 js 觸發的效果,如點擊輪播圖的原點時,主要通過設置css屬性 transition: .2s; ,再通過 js 設置css屬性 this.$refs.banner.style.marginLeft = left 。
-
通過 vue 提供的動畫方式。
<transition name="fade"> <div v-if="isSort"> <div class="tip"></div> <div class="custom-bg"></div> </div> </transition>
樣式
樣式文件使用的是 stylus ,暫未使用任何 vue 現成的UI組件。需要安裝 stylus-loader , stylus ,由于 vue-cli 中的 webpack 已經配置好了 stylus 了,所以只需要安裝就可以了。
npm install stylus-loader --save-dev npm install stylus --save-dev
性能優化
-
圖片懶加載
-
壓縮 js 、 css
-
服務器開啟 gzip
-
瀏覽器緩存
-
...
發布
完成項目后將發布到自己的服務器上,首先確保服務器已安裝 nodejs ,具體安裝步驟不再贅述。
后端發布
后端采用 pm2 做項目管理
安裝 pm2
npm install pm2 -g
啟動項目
cd bilibili-api && npm install pm2 start index.js
前端發布
- webpack 打包
npm run build
需要注意的是,直接運行此命令可能會導致資源無法找到的問題。所以需要對 webpack 配置做一定的修改。
在 webpack.base.conf.js 文件中修改 publicPath 如下
output: { path: config.build.assetsRoot, publicPath: './', //資源的公共路徑 // publicPath: process.env.NODE_ENV === 'production' ? config.build.assetsPublicPath : config.dev.assetsPublicPath, filename: '[name].js' }
這樣打包后還會出現 stylus 中 background-image 資源無法找到的問題,我采用的方式修改 ExtractTextPlugin 配置,在 webpack.prod.conf.js 中修改
new ExtractTextPlugin('[name].[contenthash].css')
將分離的 css 打包路徑分離到 static 文件夾之外。
打包完成后上傳到服務器 /var/www/html/bilibili 目錄下。
-
配置nginx服務器。
location /bilibili { root /var/www/html; index index.html; }
總結
目前主要功能都已經完成的差不多。主要還差一個預覽視頻與彈幕的功能尚未完成,希望能把B站首頁寫完,并且會持續更新中,后面可能會加上直播等功能。
相關截圖:
首頁:
輪播:
直播:
排行:
游戲:
拖拽排序與滾動效果:
項目主頁:http://www.baiduhome.net/lib/view/home/1493172369974