Vue開源:微豆 - Vue 2.0 實現豆瓣 Web App

sophy 7年前發布 | 16K 次閱讀 Vuex Vue.js開發

微豆 Vdo

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

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

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

快速使用

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

安裝依賴

npm install

在 localhost:8080 啟動項目

npm run dev</code></pre>

教程

安裝 vue-cli 腳手架

運行如下命令,即可創建一個名為 my-project 的 vue 項目,并且通過本地 8080 端口啟動服務

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

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

  • 項目名稱

  • 項目描述

  • 作者

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

  • 是否安裝 vue-loader

  • 是否使用 ESLint

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

    </li>
  • 是否使用 Karma + Mocha 的單元測試

  • 是否使用 Nightwatch e2e 測試

  • </ul>

    安裝完成后,即可看到以下文件結構:

    .
    |-- 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, });</code></pre>

    注:為做演示,句末未添加分號。

    保存 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/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 的數據。

    使用 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 為例

    yum install nginx
    /etc/nginx/conf.d/default.conf
    /doc/nginx.conf
    nginx
    

    提示:

    1. 403 Forbidden 錯誤可能是由于文件和文件夾權限引起的,請用 chmod 把存放 index.html 的所有路徑上的文件夾權限設置為 755,并將 index.html 文件權限設置成 644 即可。

    2. 更改 Nginx 配置文件后,可以使用 nginx -s reload 命令刷新。

     

     

     

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