使用Vue构建中(大)型应用
init
首先要起一个项目,推荐用vue-cli安装
$ npm install -g vue-cli
$ vue init webpack demo
$ cd demo
$ npm install
demo 是这个示例项目的名字
现在看到目录结构如下
下面来稍微介绍下
build 目录是一些webpack的文件,配置参数什么的,一般不用动
src 源码文件夹,基本上文件都应该放在这里。
static 生成好的文件会放在这个目录下。
test 测试文件夹,测试都写在这里
.babelrc babel编译参数,vue开发需要babel编译
.editorconfig 看名字是编辑器配置文件,不晓得是哪款编辑器,没有使用过。
.eslintrc.js eslint配置文件,用以规范团队开发编码规范,大中型项目很有用
.gitignore 用来过滤一些版本控制的文件,比如node_modules文件夹
index.html 主页
package.json 项目文件,记载着一些命令和依赖还有简要的项目描述信息
README.md 介绍自己这个项目的,想怎么写怎么写。不会写就参照github上star多的项目,看人家怎么写的
下面我针对自己的需要修改一些配置。你可以根据自己的需要进行修改。
首先去写.eslintrc.js。在rules中加入 "indent": [1, 4, { "SwitchCase": 1 }]
因为我更喜欢4个空格表一个缩进,报警程度调整成1是因为build文件夹里有很多行是2个空格,草草的。
然后在index.html中的 <app></app> 改成 <div id="root"></div>
这个文件没有写入任何加载css和js的link,而依旧可以正常运行的秘诀在于webpack会在编译的时候重新调整这个文件,注入依赖,所以不用太担心。
好了,差不多了。进行下一步
添加依赖
我个人习惯写stylus,所以要加上预处理器,如果喜欢sass可以自行添加。
vue-router做前端路由管理,一个中大型项目必须要做路由管理!
vuex做数据管理,类似于flux的存在,没有vuex,中大型应用中的状态会把开发者搞死,绝对。
$ npm install --save vue-router vuex
$ npm install --save-dev stylus-loader babel-runtime
好了,到这里,依赖也加好了。剩下的就是写代码了?
不急,我先说下两个vue插件的介绍
vue-router 简明API
vue-router用起来非常的简单
入口文件( src/main.js ):
'use strict'
import Vue from 'vue' // 引入vue
import Router from 'vue-router' // 引入vue-router
import App from './App' // 引入根组件
import routerMap from './router' // 引入路由表
Vue.use(Router) // 声明使用vue-router
const router = new Router() // 创建路由
routerMap(router) // 路由表引入
router.start(App, '#root') // 开启应用
看到缺了一个 ./router.js 文件,来,创建。
// src/router.js
'use strict'
export default function (router) {
router.map({
'/': {
name: 'index',
component: require('./components/contents/hello.vue')
},
'/hi': {
name: 'hi',
// 按需加载
component: function (resolve) {
require(['./components/contents/hi.vue'], resolve)
}
}
})
}
好了,路由创建成功了,顺便还搞了个按需加载。
那么在模板文件中如何使用?
很简单的,就像这样就可以了。
<!-- src/components/contents/hello.vue -->
<a class="link" v-link="{name: 'hi'}">跳转到hi</a>
还有,告诉应用哪里需要路由转换
<!-- src/App.vue -->
<div class="container">
<router-view></router-view>
</div>
vuex 简明API
这里简要介绍一下状态管理的vuex
在src下创建一个文件夹叫做 vuex 。里面定义三个文件。
mutation-types.js 定义类型的
actions.js 操作,可以分解成多个文件
store.js 入口文件,在根组件调用,然后所有子组件可以共享数据。
modules/headers.js 只是例子用的,一个headers的操作,需要定义数据的状态和mutation。 action.js 只是分发操作。
这一块还是看源码比较容易懂。
// src/vuex/mutation-types.js
export const SET_HEADER_TITLE = 'SET_HEADER_TITLE'
// src/vuex/store.js
import Vue from 'vue'
import Vuex from 'vuex'
import headers from './modules/headers'
import createLogger from 'vuex/logger'
Vue.use(Vuex)
Vue.config.debug = true
const debug = process.env.NODE_ENV !== 'production'
export default new Vuex.Store({
modules: {
headers
},
strict: debug,
moddlewares: debug ? [createLogger()] : []
})
// src/vuex/actions.js
import {
SET_HEADER_TITLE
} from './mutation-types'
export const setTitle = makeAction(SET_HEADER_TITLE)
function makeAction (type) {
return ({ dispatch }, ...args) => dispatch(type, ...args)
}
// src/vuex/modules/headers.js
import {
SET_HEADER_TITLE
} from '../mutation-types'
const state = {
title: 'default'
}
const mutations = {
[SET_HEADER_TITLE](state, newTitle) {
state.title = newTitle
}
}
export default {
state,
mutations
}
我再说两个,一个挂载store,一个获取数据,触发操作。
挂载store
// src/App.vue
import store from './vuex/store'
import HeaderComponent from './components/header'
import FooterComponent from './components/footer'
export default {
store,
components: {
HeaderComponent,
FooterComponent
}
}
获取数据及操作
// src/components/header.vue
// 从vuex拿数据,然后渲染到页面上
// 如果需要修改可以调用setTitle
import { setTitle } from '../vuex/actions'
export default {
vuex: {
getters: {
title: state => state.headers.title
},
actions: {
setTitle
}
}
}
fetch
单页应用少不了服务端交互,别老用ajax了,换 fetch 吧,少年!
$ npm install --save isomorphic-fetch es6-promise
// src/vuex/actions.js
require('es6-promise').polyfill()
require('isomorphic-fetch')
我在示例代码中并没有写。
fetch用起来根本不会回忆ajax时代的。
stylus
在之前的文章中安利过很多次stylus了,各种方便,这里一笔带过,喜欢的同学自然会去找 文档
test
测试是非常重要的一环。要想以后不出乱子,一定要尽早写好测试。
示例代码中有少量测试,推荐看一下
Code
我还是决定不在文章里写代码了。
多端
vue创作的应用不仅可以跑在浏览器里,还可以通过 electron 以客户端的形式跑起来!
使用Vue构建中(大)型应用的更多相关文章
- vue项目中的常见问题
总结了几个vue项目开发过程中遇到的常见问题,希望大家注意. 注:文末有福利! 一.样式问题 1.vue中使用less 安装less依赖 npm install less less-loader -- ...
- [转]Vue生态系统中的库
Vue UI组件库 Vuex vux github ui demo:https://github.com/airyland/vux Mint UI 项目主页:http://mint-ui.github ...
- 【Vue.js游戏机实战】- Vue.js实现大转盘抽奖总结
大家好!先上图看看本次案例的整体效果. 实现思路: Vue component实现大转盘组件,可以嵌套到任意要使用的页面. css3 transform控制大转盘抽奖过程的动画效果. 抽奖组件内使用钩 ...
- 如何在Vue项目中,通过点击DOM自动定位VScode中的代码行?
作者:vivo 互联网大前端团队- Youchen 一.背景 现在大型的 Vue项目基本上都是多人协作开发,并且随着版本的迭代,Vue 项目中的组件数也会越来越多,如果此时让你负责不熟悉的页面功能开发 ...
- 使用Kylin构建企业大数据分析平台的4种部署方式
本篇博客重点介绍如何使用Kylin来构建大数据分析平台.根据官网介绍,其实部署Kylin非常简单,称为非侵入式安装,也就是不需要去修改已有的 Hadoop大数据平台.你只需要根据的环境下载适合的Kyl ...
- C字符串和C++中string的区别 &&&&C++中int型与string型互相转换
在C++中则把字符串封装成了一种数据类型string,可以直接声明变量并进行赋值等字符串操作.以下是C字符串和C++中string的区别: C字符串 string对象(C++) 所需的头文件名称 ...
- Vue 实例中的生命周期钩子
Vue 框架的入口就是 Vue 实例,其实就是框架中的 view model ,它包含页面中的业务处理逻辑.数据模型等,它的生命周期中有多个事件钩子,让我们在控制整个Vue实例的过程时更容易形成好的逻 ...
- 探索js原型链和vue构造函数中的奥妙
这篇文章首先会讲到原型链以及原型链的一些概念,然后会通过分析vue的源码,来看一下vue的构造函数是如何被创建的,now we go! 一.什么是原型链? 简单回顾下构造函数,原型和实例的关系: ...
- 分享我在 vue 项目中关于 api 请求的一些实现及项目框架
本文主要简单分享以下四点 如何使用 axios 如何隔离配置 如何模拟数据 分享自己的项目框架 本文主要目的为以下三点 希望能够帮到一些人 希望能够得到一些建议 奉上一个使用Vue的模板框架 我只是把 ...
随机推荐
- iOS 用xib自定义view控件 debug笔记
1.在view不是很复杂的情况下,如果多次检查后依旧出现coding-compliant这种情况,干脆彻底删除这个xib重新新建一个xib来做一遍.(至今未明真相) 2.初始化xib中的view的大致 ...
- 如何直接在ftp里编辑文件
首先要连接ftp,如何链接ftp,这个我已经分享过,如果还有不懂的,可以查看下经验分享,打开ftp,并连接你要修改的站点! 下载安装代码编辑器,比如EditPlus.sublime text等,随 ...
- [深入浅出WP8.1(Runtime)]Windows Phone 8.1和Silverlight 8.1的区别
1.2.2 Windows Phone 8.1应用程序模型 Windows Phone 8.1支持多种开发语言来开发应用程序,包括C#.VB.JavaScript和C++,那么本书的代码主要是采用C# ...
- crawler4j 学习
crawler4j 学习(一) crawler4j是一个轻量级多线程网络爬虫,开发者可以调用相应的接口在短时间内创建一个多线程网络爬虫. 前期准备 使用maven 为了使用最近版本的crawler4j ...
- Sqlserver查询结果,让某列结果合并一列并且逗号分隔。
create function [dbo].[mergeName](@Id bigint) returns nvarchar(500) as begin dec ...
- mysql刷日志的两个参数
innodb_flush_log_at_trx_commit 0:每秒 ----log---disk1:事物提交 ---log ---disk2:事物提交---log 每秒 ---disk sync_ ...
- seajs实现JavaScript 的 模块开发及按模块加载
seajs实现了JavaScript 的 模块开发及按模块加载.用来解决繁琐的js命名冲突,文件依赖等问题,其主要目的是令JavaScript开发模块化并可以轻松愉悦进行加载. 官方文档:http:/ ...
- MVC无刷新分页(即局部刷新,带搜索,页数选择,排序功能)
我查看了很多网站,大部分评论分页都是局部刷新的,可大部分电商商品展示分页都是有刷新页面的,于是我便做了一个商品展示无刷新分页的例子.接下来我就将做一个模仿淘宝已买到的宝贝功能,不过我的是无刷新分页的. ...
- jquery 图片没有路径,不显示图片。
$("img").each(function () { if ($(this).attr("src").trim() == "") { $( ...
- 球谐光照(Spherical Harmonics Lighting)及其应用-实验篇
简介 之前在一篇实时深度图优化的论文中看到球谐光照(Spherical Harmonics Lighting)的应用,在查阅了许许多多资料之后还是无法完全理解,我个人觉得如果之前对实时渲染技术不是很了 ...