Vue豆瓣电影浏览器端渲染
Switch branches/tags
Nothing to show
Clone or download
Latest commit 1cb00f9 Sep 11, 2017
Permalink
Failed to load latest commit information.
build first commit Mar 14, 2017
config 路径修改 Mar 20, 2017
images images Mar 17, 2017
src 部分代码优化 Sep 11, 2017
static first commit Mar 14, 2017
style style Mar 17, 2017
.babelrc 按需加载element-ui Mar 27, 2017
.editorconfig first commit Mar 14, 2017
.eslintignore first commit Mar 14, 2017
.eslintrc.js first commit Mar 14, 2017
.gitignore first commit Mar 14, 2017
.postcssrc.js first commit Mar 14, 2017
README.md Update README.md Apr 24, 2017
favicon.ico images Mar 17, 2017
index.html 正在热映 Mar 14, 2017
package.json 按需加载element-ui Mar 27, 2017

README.md

豆瓣电影简单展示

this is doubanMovie show By vue2.0

演示地址

豆瓣电影 服务器欠费了,没有继续续费了,想要看效果的小伙伴可以fork下来在本地run dev 一下。

安装步骤

# install dependencies
npm install

# serve with hot reload at localhost:8080
npm run dev

# build for production with minification
npm run build

# build for production and view the bundle analyzer report
npm run build --report

使用技术简介 (vue2.x + webpack2.x + vue-resource + vue-router + vuex + Element-UI)

项目简单演示

img

教程

安装 vue-cli 脚手架

运行如下命令,即可创建一个名为 doubanMovie 的 vue 项目,并且通过本地 8080 端口启动服务

npm install -g vue-cli
vue init webpack doubanMovie
cd doubanMovie
npm install
npm run dev

在运行 vue init webpack doubanMovie 后,会依次要求输入以下配置内容

  • 项目名称
  • 项目描述
  • 作者
  • 选择 Vue 构建:运行+编译 或 仅运行时
  • 是否安装 vue-loader
  • 是否使用 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 公共组件
|   |-- 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能够很好地规范你的代码,对于新手来说可能有点别扭,但是习惯了可以极大地提升代码的可读性。

静态页面开发  

此时,浏览器应该已经打开了 localhost:8080 页面。

在此情况下,请尝试更改 /src/App.vue/src/components/Hello.vue 文件中<template>标签内的内容,保存后即可立即看到浏览器页面已自动更新了你做出的改动。  这是因为我们配置了vue的热更新组件。在build目录的dev-client.js

/* eslint-disable */
require('eventsource-polyfill')
var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true')

hotClient.subscribe(function (event) {
  if (event.action === 'reload') {
    window.location.reload()
  }
})

提示:./src/components 文件夹多用于保存公用组件。至于页面组件.

Element-ui

使用本项目使用的是Element-ui做为公共组件库,element-ui是由饿了么开源的基于vue2.0的组件库。具体可以参考官网element-ui

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,从而解决跨域的问题。

build生产环境服务跨域方案

以nginx作为简单的描述:找到nginx的配置文件config/nginx.config;用下面代码替换这个文件里面的代码

#
# The default server
#

server {
    listen       80;

    # 需要将主机名改为豆瓣 api
    server_name  api.douban.com;

    # root 即指向服务器存放的编译出的 index.html 目录
    root         /var/www/Vdo/dist;

    # 设定根路由
    location / {

        # 指定 index 文件
        index index.html;

        # 将其他任何路由都交给 index.html 处理,保证能使用 HTML5 History 模式
        # REF https://router.vuejs.org/zh-cn/essentials/history-mode.html#nginx
        try_files $uri $uri/ /index.html;
    }

    # 设定转发豆瓣 api,即 localhost/api/XXX -> api.douban.com/v2/XXX
    location /api/ {

        # 设定头部
        proxy_set_header Host api.douban.com;

        # 设定代理目标
        proxy_pass http://api.douban.com/v2/;
    }
    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }

}

保存启动ngix便可以了

使用 vue-resource

vue-resource 库使用起来相当方便。  

你可以在单个组件中尝试引入并调用:

import Vue from 'vue'
import $http from 'vue-resource'
Vue.use($http)

let vm = new Vue()

const configPath = '/api'
window.configPath = configPath

export class Utils {
  get (url, data = {}) {
    url = configPath + url
    return new Promise((resolve, reject) => {
      vm.$http.get(url, {params: data, credentials: true}).then((response) => {
        resolve(response.body)
      }, function () {
        console.log('接口异常')
      })
    })
  }
}

这里,只使用了里面的get方法

更多 vue-resource 用法请参考 vue-resource

使用 Vuex 并分离代码

为了试代码更加结构化,我们应当将数据请求和视图分离。

这一节中,我们有两个任务要做:

  1. 分离数据请求层逻辑。
  2. 使用 Vuex 管理状态。

将二者放到同一节中主要是因为二者再同一目录下,我们来查看 ./store 文件夹的结构:

.
|-- store                          // 数据处理根目录
|   |-- moving                     // 电影模块文件夹
|   |   |-- actions.js             // 电影模块获取接口actions
|   |   |-- getters.js             // Vuex getters
|   |   |-- index.js               // 定义store 模块入口文件
|   |   |-- mutations.js           // Vuex mutations
|   |   |-- type.js                // Vuex 操作 key
|   |-- index.js                   // Vuex 入口
.

我们需要先了解 Vuex。

请查看 Vuex 文档,了解其 核心概念

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 也集成到 Vue 的官方调试工具 devtools extension,提供了诸如零配置的 time-travel 调试、状态快照导入导出等高级调试功能。

其实在我看来,Vuex 相当于某种意义上设置了读写权限的全局变量,将数据保存保存到该“全局变量”下,并通过一定的方法去读写数据。(希望这能帮助你理解 Vuex)

结语

至此,主体工作已经完成。

欢迎 Star 本项目。