一個使用 Vue.js 與 Material Design 重構 豆瓣 的項目。 javascript
項目網站 http://vdo.ralfz.com/html
GitHub https://github.com/RalfZhang/Vdovue
# 克隆項目到本地 git clone https://github.com/RalfZhang/Vdo.git # 安裝依賴 npm install # 在 localhost:8080 啓動項目 npm run dev
運行以下命令,便可建立一個名爲 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 配置在根目錄的 .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
以上輸出代表出現兩個問題:
警告:不容許 console 語句。
錯誤:句末未加分號。
解決問題 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 介紹 閱讀 基礎 部分教程,並能夠邊閱讀邊配置路由。
路由文件是 ./src/router.index.js
。
本項目中使用了 HTML5 History 模式,路由配置比較簡單,能夠參考。
至此,你應該已經完成了全部的靜態頁面的工做,接下來咱們準備搭建請求,爲後面的 xhr 請求作好準備。
打開 http://api.douban.com/v2/movie/in_theaters
查看接口數據,留意此地址。
在 ./config/index.js
中的 proxyTable
配置代理:
proxyTable: { '/api': { target: 'http://api.douban.com/v2', changeOrigin: true, pathRewrite: { '^/api': '' } } }
從新啓動 npm run dev
,打開 localhost:8080/api/movie/in_theaters
查看結果是否與直接請求豆瓣 API 相同。
本應該使用瞭如下 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 庫使用起來至關簡單。
你能夠在單個組件中嘗試引入並調用:
import axios from 'axios'; axios.get('/v2/movie/in_theaters', { 'city': '廣州' }) .then((result) => { console.log(result); });
這裏,能夠用返回的 result
去更新 data(){ }
中 return
的數據。
更多 axios 用法請參考 文檔
爲了試代碼更加結構化,咱們應當將數據請求和視圖分離。
這一節中,咱們有兩個任務要作:
分離數據請求層邏輯。
使用 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 事件類型的實現。
到此便完成了全部開發上的基礎問題。
運行 npm run build
,便可在生成的 /dist
文件夾下看到全部文件。
將文件複製到你的服務器上某個目錄(個人是/var/www/Vdo/dist
),按照下一節配置 Nginx 便可
提示:能夠使用 scp
命令將本地文件拷貝至服務器,例如 scp -P 20 -r dist user@host:/target/location
注:如下以 CentOS 爲例
安裝 Nginx:yum install nginx
打開 /etc/nginx/conf.d/default.conf
替換全文爲本項目 /doc/nginx.conf
文件中的內容
運行 nginx
提示:
403 Forbidden
錯誤多是因爲文件和文件夾權限引發的,請用 chmod
把存放 index.html
的全部路徑上的文件夾權限設置爲 755,並將 index.html
文件權限設置成 644 便可。
更改 Nginx 配置文件後,能夠使用 nginx -s reload
命令刷新。
至此,主體工做已經完成。
歡迎 Star 本項目。
https://github.com/RalfZhang/Vdo
MIT