现代化的 vue 项目

目前为止,我们的 vue 的讲解都是通过 cdn 的方式去弄的。
而现代化的 vue 项目,用的是构建工具打包工具 npm 相关的方式。

构建打包工具使用的是 webpack 。

可以理解为与 gulp 类似的东西

使用 vue 官方的脚手架工具(@vue/cli)快速搭建现代化的 vue 项目

  1. 什么叫脚手架呢?

快速搭建项目的工具

  1. 如何使用
    1. 全局安装工具

$ npm install @vue/cli -g

  1. 全局安装完成之后,提供了一个 vue 的命令。使用 vue -V 来查看一下脚手架版本

$ vue -V

@vue/cli 4.3.1
注意:不要把脚手架的版本与 vue 核心的版本搞混了

  1. 使用 vue 命令创建一个项目
    1. 先在要创建项目的文件夹下打开 cmd
    2. 运行如下命令

$ vue create 项目名字
注意,不要使用 git bash 来操作,git bash 不能上下键

脚手架创建的项目的基本文件介绍

  • node_modules 项目依赖包
  • public 静态资源文件,里面默认有一个 index.html 和 一个 favicon.ico。这里存放的是不需要被构建工具处理的。比如一个css。我们直接通过 link 的方式去引入
    • favicon.ico 当前项目的浏览器的小图标
    • index.html 整个项目的入口页面,这个文件中只提供了一个挂载点元素,js内容都是构建工具去处理的
  • src 项目的源代码文件夹 (放在这个文件夹中的内容我们认为都是需要被构建工具处理的文件)
    • assets 静态资源文件。需要被构建工具处理的
    • components 存放公用的vue组件的文件夹
      • HelloWorld.vue 一个单文件组件
    • App.vue 项目的万年老二组件
    • main.js 整个项目的入口js文件 。构建工具打包生成js文件的起点就是它。
  • .gitignore git 的忽略文件的设置文件。脚手架创建的项目,默认做了git初始化
  • babel.config.js babel相关的配置文件。(转换es6、es7、es8等高级语法到es5的一个工具)
  • package-lock.json 依赖锁文件
  • package.json 项目描述文件,里面有依赖项的配置
  • READMD.md 读我。接手一个项目,第一件事情,就是看 README.md

构建打包工具使用的是 webpack 。

两个常用的 UI 组件库

vant element

1.node.js 安装 ( 电脑管家 )

  1. $ node -v // 检测node安装
  2. $ npm -v // 检测 npm 工具包

2.git安装(电脑管家) 用来上传代码等

3. 安装 vscode (编译器)

  1. 创建vue项目

    1. // 全局安装工具
    2. $ npm install @vue/cli -g
  2. 2 .全局安装完成之后,提供了一个 vue 的命令。使用 vue -V 来查看一下脚手架版本

  1. $ vue -V // 大写的V
  1. @vue/cli 4.3.1 注意: 不要把教手架的版本与核心的版本搞混了

3.使用vue命令创建一个项目

    1. 先在要创建项目的文件夹下打开 cmd运行如下命令
      2. 运行如下命令
      1. $ vue create 项目名字

注意,不要使用 git bash 来操作, git bash 不能上下键
咧 :第一步: 创建 app-app 的项目

  1. 第二步 点击回车就可以默认选中第一个
  2. : 出现这个 就是已经成功了

4.脚手架创建的项目的基本文件介绍
  1. - node_modules 项目依赖包
  2. - public 静态资源文件,里面默认有一个 index.html 一个 favicon.ico。这里存放的是不需要被构建工具处理的。比如一个css。我们直接通过 link 的方式去引入
  3. - favicon.ico 当前项目的浏览器的小图标
  4. - index.html **整个项目的入口页面**,这个文件中只提供了一个挂载点元素,js内容都是构建工具去处理的
  5. - src 项目的**源代码文件夹** (放在这个文件夹中的内容我们认为都是需要被构建工具处理的文件)
  6. - assets 静态资源文件。需要被构建工具处理的
  7. - components 存放公用的vue组件的文件夹
  8. - HelloWorld.vue 一个单文件组件
  9. - App.vue 项目的万年老二组件
  10. - main.js **整个项目的入口js文件** 。构建工具打包生成js文件的起点就是它。
  11. - .gitignore git 的忽略文件的设置文件。脚手架创建的项目,默认做了git初始化
  12. - babel.config.js babel相关的配置文件。(转换es6es7es8等高级语法到es5的一个工具)
  13. - package-lock.json 依赖锁文件
  14. - package.json 项目描述文件,里面有依赖项的配置
  15. - READMD.md 读我。接手一个项目,第一件事情,就是看 README.md

  1. 第一步 先把 package.json
  1. "scripts": {
  2. "start": 'npm run serve' // 运行就是直接 npm start
  3. }
  1. 配置代理 防止跨域 新建 vue.config.js 文件
  2. 下载 axios 用来请求数据
    1. 自己封装方法 ``` $ npm install axios -S

// 新建一个文件 utils/fetch.js import axios from ‘axios’

let baseURL_dev = ‘http://localhost:8080‘ // 解决跨域问题 // let baseURL_pro = ‘’ // 公司域名 // let baseURL_test = ‘’ // 内网地址

// 创建axios实例 const fetch = axios.create({ baseURL: baseURL_dev, timeout: 7000, // 超时设置 headers: { ‘Content-Type’: ‘application/json;charset=UTF-8’ } })

// 封装请求拦截器 fetch.interceptors.request.use((config) => { // 在这里做一些检测或者包装等处理 // console.log(‘请求拦截’, config) // 鉴权 token添加 config.headers.Authorization = localStorage.getItem(‘token’) || ‘’ return config })

// 封装响应拦截器 fetch.interceptors.response.use((response) => { // 请求成功 // console.log(‘响应拦截’, response) // 数据过滤,根据后端标识字符来进行数据 if (response.data && response.data.err==0) { return response.data } else { console.log(‘网络异步,请稍后再试’) } }, (error) => { // 请求失败 return Promise.reject(error) })

export default fetch

  1. 1. 调用方法的时候 :
  2. ```javascript
  3. utils/api 这个文件里写
  4. import fetch from './fetch'
  5. // 例如这两个方法 让他导出去
  6. // 获取所有商品信息
  7. export function getGoodList(params) {
  8. return fetch({
  9. url: '/jd/getHotGoodList',
  10. method: 'GET',
  11. params
  12. })
  13. }
  14. // 获取所有分类名
  15. export function getCates(params) {
  16. return fetch({
  17. url: '/jd/getAllCates',
  18. method: 'GET',
  19. params
  20. })
  21. }
  22. // 导出去
  23. export default {
  24. getGoodList,
  25. getCates
  26. }
  1. 最后记得在 app.js 挂载到原型:

    1. // 加这个
    2. import http from './utils/api'
    3. Vue.prototype.$http = http
  2. 然后调用数据的时候 :

    this.$http.getGoodList( params ).then(res => console.log(res))
    这个getGoodList 是在 utils/api 写的方法


  1. rem布局问题 ( 移动端要用)写一个 js文件

    1. 写在public /rem.js

    ```

function resetRootFZ(){
var oHtml = document.querySelector(‘html’);
var w = oHtml.getBoundingClientRect().width;
// 设置根字体的大小等于html节点的宽度的十分之一
oHtml.style.fontSize = w/10 + ‘px’;
}
resetRootFZ()
// 当window窗口尺寸变化时,重新设置根字体的大小
window.addEventListener(‘resize’,function(){
resetRootFZ()
});

  1. 然后在vscode 插件里 px-to-rem 配置
  2. 1. sass安装 node-sass -S sass-loader -S (要安装两个)

下载 cnpm : $ npm install -g cnpm —registry=https://registry.npm.taobao.org

$ cnpm install node-sass —save-dev

$ cnpm install sass-loader —save-dev

  1. 1. router 安装 (路由配置)

$ cnpm install router -S

  1. 1. Vuex安装 (全局状态管理)

$ cnpm install Vuex -S ```

一些插件
  1. monent 处理时间戳
  2. nprogress 进度条

Vuex

一: vuex 是什么

** vue 官方提供的状态管理器, 用于处理全局的数据共享问题的

二: vuex 的仓库中的五大核心概念
state 专门存共享数据的地方
getter 可以针对现有的state 数据或者其余的 getter 做的一个二次计算,可以理解为仓库中的计算属性
mutation 唯一能够修改 state 数据的东西 , 不允许写异步代码
action 它里面可以写异步代码, 它如果要修改 state 数据, 是通过去调用 mutation
module 仓库模块的拆分、
三: 组件中如何使用 state 与 getter
方案一:使用挂载到 Vue原型上的 $store 对象, 这个 $store 就是 new Vue.store() 生成的仓库实例对象
mapState 计算属性 接收一个数组做为参数,参数中的每一项,就是在仓库中 state 数据
mapGetters 辅助函数

mapState 接收一个数组做为参数,参数中的每一项,就是在仓库中的 state 数据
mapState ([ state1, state2, state3])

mapGetters 接收一个数组作为参数,参数中的每一项,就是在仓库中的 getter 数据
mapGetters( [getter1, getter2])

Vue router路由

路由的概念就是, 能够通过不同的请求地址来响应不同的页面或数据

视图: router-view 路由坑 路由匹配到的组件将渲染在这里

导航: router-link 路由跳转 相当于a标签 没有a标签的#号 而且还自带样式 .router-link-active 还有起到跳转作用

一: $ npm install vue-router 引入: import Vue from ‘vue’ import VueRouter from ‘vue-router’ // 引入 Home组件 import Home from ‘../view/Home’ // 注册 Vue.use(VueRouter) // 定义路由 const router = new VueRouter({ routes: [ path:’/‘ // 地址 component: Home // 组件名 ] }) // 将这个导出去 export default router

动态路由匹配:

{
// 动态路径参数,以冒号开头
path: ‘ /user/:id’
}

嵌套路由

/user/foo/profile

编程式的导航

router.push(‘/路径’)
router.replace(‘/路径’)
push 和 replace 区别 : 跟 router.push 很像,唯一的不同就是,它不会向 history 添加新记录,而是跟它的方法名一样 —— 替换掉当前的 history 记录。

声明式

router-link :to=’/url路径’

重定向:

path: ‘/a ‘ , redirect : ‘ /b ‘ 把/a 重定向 到/b
重定向的目标也可以是一个命名的路由: { path: ‘/a’, redirect: { name: ‘foo’ }}

甚至是一个方法,动态返回重定向目标:
{ path: ‘/a’, redirect: to => { // 方法接收 目标路由 作为参数 // return 重定向的 字符串路径/路径对象 }}