Vue.Js開源:bilibili-vue-前端 vue + 后端 koa,全棧式開發 bilibili 首頁

wangjunji 7年前發布 | 17K 次閱讀 Vue.js Koa.js Vue.js開發

前言

為什么是寫嗶哩嗶哩(俗稱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 。每次發起網絡需要經歷下面的步驟

  1. 請求中

    rootState.requesting = true  //請求狀態更新為true,表示請求中
    commit(TYPE.XX_REQUEST)  // 發送同步操作,請求中的數據處理
  2. 請求成功

    rootState.requesting = false  //請求狀態更新為false,表示請求結束
    commit(TYPE.XX_SUCCESS, response) //發送同步操作,處理請求成功后數據
  3. 請求失敗

    rootState.requesting = false  //請求狀態更新為false,表示請求結束
    commit(TYPE.XX_SUCCESS, response) //發送同步操作,處理請求失敗

動畫

B站首頁充斥著大量的動畫效果。目前動畫使用的主要有三種方式:

  1. 以 hover 效果觸發。

  2. 通過 js 觸發的效果,如點擊輪播圖的原點時,主要通過設置css屬性 transition: .2s; ,再通過 js 設置css屬性 this.$refs.banner.style.marginLeft = left 。

  3. 通過 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

前端發布

  1. 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 目錄下。

  1. 配置nginx服務器。

    location /bilibili {
      root /var/www/html;
      index index.html;
    }

總結

目前主要功能都已經完成的差不多。主要還差一個預覽視頻與彈幕的功能尚未完成,希望能把B站首頁寫完,并且會持續更新中,后面可能會加上直播等功能。

相關截圖:

首頁:

輪播:

直播:

排行:

游戲:

拖拽排序與滾動效果:

 

項目主頁:http://www.baiduhome.net/lib/view/home/1493172369974

 

 本文由用戶 wangjunji 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!