微豆 - Vue 2.0 實現豆瓣 Web App 教程

微豆 Vdo

一個使用 Vue.js 與 Material Design 重構 豆瓣 的項目。 javascript

項目網站 http://vdo.ralfz.com/html

GitHub https://github.com/RalfZhang/Vdovue

gif

快速使用

# 克隆項目到本地
git clone https://github.com/RalfZhang/Vdo.git

# 安裝依賴
npm install

# 在 localhost:8080 啓動項目
npm run dev

教程

安裝 vue-cli 腳手架

運行以下命令,便可建立一個名爲 my-project 的 vue 項目,而且經過本地 8080 端口啓動服務java

npm install -g vue-cli
vue init webpack my-project
cd my-project
npm install
npm run dev

在運行 vue init webpack my-project 後,會依次要求輸入如下配置內容node

  • 項目名稱webpack

  • 項目描述ios

  • 做者nginx

  • 選擇 Vue 構建:運行+編譯 或 僅運行時git

  • 是否安裝 vue-loadergithub

  • 是否使用 ESLint

    • 若是是,請選擇模式:標準模式、AirBNB 模式、自定義

  • 是否使用 Karma + Mocha 的單元測試

  • 是否使用 Nightwatch e2e 測試

圖片描述

安裝完成後,便可看到如下文件結構:

.
|-- build                            // 項目構建相關代碼
|   |-- build.js                     // 生產環境構建代碼
|   |-- check-version.js             // 檢查 node、npm 等版本
|   |-- dev-client.js                // 熱重載相關
|   |-- dev-server.js                // 構建本地服務器
|   |-- utils.js                     // 構建工具相關
|   |-- webpack.base.conf.js         // webpack 基礎配置(出入口和 loader)
|   |-- webpack.dev.conf.js          // webpack 開發環境配置
|   |-- webpack.prod.conf.js         // webpack 生產環境配置
|-- config                           // 項目開發環境配置
|   |-- dev.env.js                   // 開發環境變量
|   |-- index.js                     // 項目一些配置變量(開發環境接口轉發將在此配置)
|   |-- prod.env.js                  // 生產環境變量
|   |-- test.env.js                  // 測試環境變量
|-- src                              // 源碼目錄
|   |-- components                   // vue 公共組件
|   |-- store                        // vuex 的狀態管理
|   |-- App.vue                      // 頁面入口文件
|   |-- main.js                      // 程序入口文件,加載各類公共組件
|-- static                           // 靜態文件,好比一些圖片,json數據等
|-- test                             // 自動化測試相關文件
|-- .babelrc                         // ES6語法編譯配置
|-- .editorconfig                    // 定義代碼格式
|-- .eslintignore                    // ESLint 檢查忽略的文件
|-- .eslistrc.js                     // ESLint 文件,如需更改規則則在此文件添加
|-- .gitignore                       // git 上傳須要忽略的文件
|-- README.md                        // 項目說明
|-- index.html                       // 入口頁面
|-- package.json                     // 項目基本信息
.

ESLint 配置

ESLint 配置在根目錄的 .eslintrc.js 裏。
正常狀況下,ESLint 報錯是由於你的代碼不符合現有的 ESLint 規範。
若是你的狀況實在不想被 ESLint 報錯,我舉出兩個解決方案,來處理 ESLint 報錯問題。

注:本例使用 AirBNB ESLint 規則。
例:經過 npm run dev 啓動服務,打開 ./src/main.js,添加一句 console.log('abc'),結果以下:

import Vue from 'vue';
import App from './App';
import store from './vuex/store';
/* import router from './router';*/

// 添加此句
console.log('abc')

/* eslint-disable no-new */
new Vue({
  el: '#app',
  /* router,*/
  template: '<App/>',
  components: { App },
  store,
});

注:爲作演示,句末未添加分號。

保存 main.js 文件後,頁面與終端均提示以下錯誤:

ERROR  Failed to compile with 1 errors 
 error  in ./src/main.js
  ⚠  http://eslint.org/docs/rules/no-console  Unexpected console statement
  C:\Users\Ralf\Documents\code\ralfz\vue\test\vue02\src\main.js:8:1
  console.log('abc')
   ^
  ✘  http://eslint.org/docs/rules/semi        Missing semicolon
  C:\Users\Ralf\Documents\code\ralfz\vue\test\vue02\src\main.js:8:19
  console.log('abc')
                     ^
✘ 2 problems (1 error, 1 warning)
Errors:
  1  http://eslint.org/docs/rules/semi
Warnings:
  1  http://eslint.org/docs/rules/no-console
 @ multi ./build/dev-client ./src/main.js

以上輸出代表出現兩個問題:

  1. 警告:不容許 console 語句。

  2. 錯誤:句末未加分號。

解決問題 1

  • .eslintrc.js 文件中的 rules 鍵名下添加'no-console': 'off',,即關閉 console 警告。

解決問題 2

  • 你能夠選擇繼續在 .eslintrc.js 文件中添加關閉句末分號斷定的規則。

  • 或者,也能夠把 package.json 文件中的 script 下的 lint 命令改成
    "lint": "eslint --fix *.js *.vue src/* test/unit/specs/* test/e2e/specs/*"

即自動修復。值得注意的是,自動修復不能解決全部問題,有時也不甚完美,能夠多試幾回體會下 fix 的效果。

作完更改後,從新運行 npm run dev 便可看到無問題報告,而且 console 語句後已經自動加上了分號。

靜態頁面開發

此時,瀏覽器應該已經打開了 localhost:8080 頁面。

在此狀況下,請嘗試更改 /src/App.vue/src/components/Hello.vue 文件中<template>標籤內的內容,保存後便可當即看到瀏覽器頁面已自動更新了你作出的改動。

接下來,你須要去閱讀並學習 Vue.js 教程頁面,務必熟悉 基礎 部分的內容,掌握 組件 章節。

熟悉以後,即可以完成基礎的靜態頁面(或者說是組件)設計工做。

本項目使用了基於 Vue 2.0 和 Material Desigin 的 UI 組件庫 Muse-UI

提示:./src/components 文件夾多用於保存公用組件。至於頁面組件,推薦在新建 ./src/view 文件夾後存放於此。

vue-router 2 使用

當一個個靜態組件完成後,須要按照路由組織這些組件文件。

請前往 vue-router 2 介紹 閱讀 基礎 部分教程,並能夠邊閱讀邊配置路由。

路由文件是 ./src/router.index.js

本項目中使用了 HTML5 History 模式,路由配置比較簡單,能夠參考。

API 請求轉發配置

至此,你應該已經完成了全部的靜態頁面的工做,接下來咱們準備搭建請求,爲後面的 xhr 請求作好準備。

  1. 打開 http://api.douban.com/v2/movie/in_theaters 查看接口數據,留意此地址。

  2. ./config/index.js 中的 proxyTable 配置代理:

    proxyTable: {
        '/api': {
            target: 'http://api.douban.com/v2',
            changeOrigin: true,
            pathRewrite: {
                '^/api': ''
            }
        }
    }
  3. 從新啓動 npm run dev,打開 localhost:8080/api/movie/in_theaters 查看結果是否與直接請求豆瓣 API 相同。

  4. 本應該使用瞭如下 API:

    • /v2/movie/search?q={text} 電影搜索api;

    • /v2/movie/in_theaters 正在上映的電影;

    • /v2/movie/coming_soon 即將上映的電影;

    • /v2/movie/subject/:id 單個電影條目信息。

更多請參考 豆瓣電影 API 文檔。

這樣咱們就能夠在應用中調用 /api/movie/in_theaters 來訪問 http://api.douban.com/v2/movie/in_theaters,從而解決跨域的問題。

使用 axios

axios 庫使用起來至關簡單。

你能夠在單個組件中嘗試引入並調用:

import axios from 'axios';
axios.get('/v2/movie/in_theaters', { 'city': '廣州' })
    .then((result) => {
        console.log(result);
    });

這裏,能夠用返回的 result 去更新 data(){ }return 的數據。

更多 axios 用法請參考 文檔

使用 Vuex 並分離代碼

爲了試代碼更加結構化,咱們應當將數據請求和視圖分離。

這一節中,咱們有兩個任務要作:

  1. 分離數據請求層邏輯。

  2. 使用 Vuex 管理狀態。

將兩者放到同一節中主要是由於兩者再同一目錄下,咱們來查看 ./store 文件夾的結構:

.
|-- store                          // 數據處理根目錄
|   |-- movies                     // 單個電影模塊文件夾
|   |   |-- api.js                 // 電影模塊對外開放的接口
|   |   |-- module.js              // Vuex 模塊
|   |   |-- type.js                // Vuex 操做 key
|   |-- base.js                    // 基礎方法
|   |-- store.js                   // Vuex 入口
.

針對第一個任務:

  • base.js 存放封裝的基礎請求函數

  • **/api.js 存放該模塊下公開的請求函數

針對第二個任務,咱們須要先了解 Vuex。

請查看 Vuex 文檔,瞭解其 核心概念

Vuex 是一個專爲 Vue.js 應用程序開發的狀態管理模式。它採用集中式存儲管理應用的全部組件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。Vuex 也集成到 Vue 的官方調試工具 devtools extension,提供了諸如零配置的 time-travel 調試、狀態快照導入導出等高級調試功能。

其實在我看來,Vuex 至關於某種意義上設置了讀寫權限的全局變量,將數據保存保存到該「全局變量」下,並經過必定的方法去讀寫數據。(但願這能幫助你理解 Vuex)

爲了方便模塊化管理:

  • 我將 store.js 做爲入口文件,去掛載各個模塊;

  • /movies/文件夾下爲電影相關的模塊;

  • /movies/moudule.js 爲電影模塊的主要 Vuex 文件;

  • /movies/type.js使用常量替代 Mutation 事件類型的實現。

到此便完成了全部開發上的基礎問題。

發佈

  1. 運行 npm run build,便可在生成的 /dist 文件夾下看到全部文件。

  2. 將文件複製到你的服務器上某個目錄(個人是/var/www/Vdo/dist),按照下一節配置 Nginx 便可

提示:能夠使用 scp 命令將本地文件拷貝至服務器,例如 scp -P 20 -r dist user@host:/target/location

附:配置與開啓 Nginx

注:如下以 CentOS 爲例

  1. 安裝 Nginx:yum install nginx

  2. 打開 /etc/nginx/conf.d/default.conf

  3. 替換全文爲本項目 /doc/nginx.conf 文件中的內容

  4. 運行 nginx

提示:

  1. 403 Forbidden 錯誤多是因爲文件和文件夾權限引發的,請用 chmod 把存放 index.html 的全部路徑上的文件夾權限設置爲 755,並將 index.html 文件權限設置成 644 便可。

  2. 更改 Nginx 配置文件後,能夠使用 nginx -s reload 命令刷新。

結語

至此,主體工做已經完成。

歡迎 Star 本項目。

https://github.com/RalfZhang/Vdo

感謝&參考

License

MIT

相關文章
相關標籤/搜索