vue2项目从0搭建(一):项目搭建

news2024/11/26 22:22:27

前言:

vue2项目可谓十分常见,国内大部分的前端码农应该都是用vue2技术在开发,虽然vue3和react等技术也有很多,但是占据绝大多数的中高级搬砖码农应该干的都是vue2技术的项目,就算现在很多人转战vue3技术了,但是维护原有vue2的项目应该也是很多的。

我本来是不打算写vue2的技术博客的,因为这种的博客实在太多了。但是我还是想了想,自己入坑就是靠vue2的,而且vue2虽然算不上先进的技术了,但依然占据很大的比例,而且很多人是看视频学习的,而不是官网.就算查东西,也是很少去官网,都是直接百度。

最主要的一点,其实不少人是没有从0到1对一个项目进行开发的,大部分都是接受原有的项目或者是省事直接用人家的模板,我决定从0搭建一个vue2的项目,这个项目主要是用来写vue2本身一些技术点的demo,因为我知道很多人就算用了2年的vue,也不见得能把官网的技术都看一遍,这里我对主要的技术进行一个总结,需要的小伙伴可以看看。

使用vue-cli下载脚手架: 

 vue-cli地址:介绍 | Vue CLI

 安装:

方法1:

安装全局的vue:

npm install -g @vue/cli

执行下载命令:

vue create vue2-test

 方法2:

npx vue create vue2-test

这个脚手架会为你自动去配置依赖包node_modules的,安装成功之后可以直接运行项目

 运行:

npm run serve

关闭语法检查和配置src路径别名

关闭语法检查

语法检查对于没有精益求精唯薪主义码农们,是一件很烦人的事情,那我们就果断干掉他(大佬不用看)

在vue.config.js中进行如下配置

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
  lintOnSave: false
})

配置src路径别名

配置src的路径联想,可以让我们在项目文件较多时,可以快速精确的找到所需文件路径

创建jsconfig.json

{
  "compilerOptions": {
    "target": "es5",
    "module": "esnext",
    "baseUrl": "./",
    "moduleResolution": "node",
    "paths": {
      "@/*": [
        "src/*"
      ]
    },
    "lib": [
      "esnext",
      "dom",
      "dom.iterable",
      "scripthost"
    ]
  }
}

ok了,重新运行项目,记得重新运行才回生效

基础的router配置和创建对应组件:

vue-router是spa项目必须的东西,vue-router的配置项也不少,不过我们这里先进行最基础的配置

下载vue-router

npm i vue-router@3.1.2

 创建组件

删除App.vue中的HelloWord组件和信息,在src下创建自己对应的pages文件夹,我这里创建目录结构如下:

vue文件的初始化内容我就不写那么明白了,参考App.vue

创建好了组件之后,记得给每个组件的name名字起好。

配置基础的router

在src下创建router文件夹,内部包含三个文件

globalRouteList.js: 全局的路由数据

const globalRouteList = [
    {
        name:'login',
        path:'/login',
        meta:{
            name:'登录',
        },
        component:()=>import('@/pages/login/index.vue')
    },
    {
        name:'notFound',
        path:'/notFound',
        meta:{
            name:'空页面',
        },
        component:()=>import('@/pages/notFound/index.vue')
    },
    {
        redirect:'/login',
        path:'/'
    }
]
export default globalRouteList

asyncRouteList.js: 动态的路由数据

const list = [
    {
        name:'dashboard',
        path:'/dashboard',
        meta:{
            name:'主页',
        },
        component:()=>import('@/pages/dashboard/index.vue'),
        children:[
            {
                name:'communication',
                path:'/dashboard/communication',
                meta:{
                    name:'组件通信',
                    icon:'el-icon-phone'
                },
                component:()=>import('@/pages/communication/index.vue')
            },
            {
                name:'instructions',
                path:'/dashboard/instructions',
                meta:{
                    name:'指令',
                    icon:'el-icon-thumb'
                },
                component:()=>import('@/pages/instructions/index.vue')
            },
        ]
    },

]
export default list

index.js : 路由配置文件

import Vue from 'vue'
import Router from 'vue-router'
import asyncRouteList from './asyncRouteList'
import globalRouteList from './globalRouteList'

const RouteList = [].concat(asyncRouteList).concat(globalRouteList)
console.log(RouteList,'???routeList')
Vue.use(Router)

export default new Router({
    routes:RouteList,
    mode:'history'
})

 然后再main.js中引入我们配置好的router

  main.js中引入

import Vue from 'vue'
import App from './App.vue'
import router from './router/index'

Vue.config.productionTip = false

Vue.use(router)

new Vue({
  router,
  render: h => h(App),
}).$mount('#app')

 现在在vue组件中就能访问到this$router和this.$route了。

引入element-ui

element-ui地址:Element - The world's most popular Vue UI framework

 下载element-ui

npm i element-ui

 main.js引入element-ui:

方法1.整体引入

import Vue from 'vue'
import App from './App.vue'
import router from './router/index'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.config.productionTip = false

Vue.use(router)
Vue.use(ElementUI)
new Vue({
  router,
  render: h => h(App),
}).$mount('#app')

 方法2:分别引入(这块在后续的优化中写,这里就不说了,有需要的可以参考官网)

现在在组件中就可以使用饿了么组件

配置store

vuex虽然不是必须的,但是在常规的vue项目中,存储全局的一些数据vuex还是很简单灵性的,vue3很多人用pinia,但是我感觉vue2项目基本都有vuex,还是用上吧

vuex地址:Vuex 是什么? | Vuex

这里插一句:我其实有一段时间没有写vue2了,我现在做的这些配置都是自己一个一个用手敲的,而且都是参考我所引入的这些文档

下载vuex

src下创建store文件夹,内部文件如下

index.js : store的主要文件

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
import user from './modules/user'
const store = new Vuex.Store({
    modules:{
        user
    }
})
export default store

moudles/user.js : user模块化

const userMode = {
    state:()=>({
        userInfo:{
            name:'wjt',
            age:28
        }
    }),
    mutations:{
        CHANGE_USEINFO:(state,info)=>{
            state.userInfo = info
        }
    },
    actions:{
        changeUserInfo:(({commit},data)=>{
            commit('CHANGE_USEINFO',data)
        })
    }
}
export default userMode

modules/globalCom: 全局数据模块化

...暂无内容

 

main.js引入

import Vue from 'vue'
import App from './App.vue'
import router from './router/index'
import store from './store/index'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import '@/style/reset.css'
Vue.config.productionTip = false

Vue.use(router)
Vue.use(store)
Vue.use(ElementUI)
new Vue({
  router,
  store,
  render: h => h(App),
}).$mount('#app')

引入样式初始化文件

在项目开发时,初始化样式文件还是很有必要的,能给后面省去一些麻烦,这里我就直接引入一个在网上拉下来的文件了,就没有必要自己手写

文件内容如下:

blockquote,body,button,dd,dl,dt,fieldset,form,h1,h2,h3,h4,h5,h6,hr,input,legend,li,ol,p,pre,td,textarea,th,ul {
    margin: 0;
    padding: 0
}

body,button,input,select,textarea {
    font: 12px/1.5 tahoma,arial,'Hiragino Sans GB','\5b8b\4f53',sans-serif
}

h1,h2,h3,h4,h5,h6 {
    font-size: 100%
}

address,cite,dfn,em,var {
    font-style: normal
}

code,kbd,pre,samp {
    font-family: courier new,courier,monospace
}

small {
    font-size: 12px
}

ol,ul {
    list-style: none
}

a {
    text-decoration: none
}

a:hover {
    text-decoration: underline
}

sup {
    vertical-align: text-top
}

sub {
    vertical-align: text-bottom
}

legend {
    color: #000
}

fieldset,img {
    border: 0
}

button,input,select,textarea {
    font-size: 100%
}

table {
    border-collapse: collapse;
    border-spacing: 0
}

京东的reset

* {
    margin: 0;
    padding: 0
}

em,i {
    font-style: normal
}

li {
    list-style: none
}

img {
    border: 0;
    vertical-align: middle
}

button {
    cursor: pointer
}

a {
    color: #666;
    text-decoration: none
}

a:hover {
    color: #c81623
}

button,input {
    font-family: Microsoft YaHei,tahoma,arial,Hiragino Sans GB,\\5b8b\4f53,sans-serif
}

body {
    -webkit-font-smoothing: antialiased;
    background-color: #fff;
    font: 12px/1.5 Microsoft YaHei,tahoma,arial,Hiragino Sans GB,\\5b8b\4f53,sans-serif;
    color: #666
}

.hide,.none {
    display: none
}

.clearfix:after {
    visibility: hidden;
    clear: both;
    display: block;
    content: ".";
    height: 0
}

.clearfix {
    *zoom: 1
}

百度的reset

body,h1,h2,h3,h4,h5,h6,hr,p,blockquote,dl,dt,dd,ul,ol,li,pre,form,fieldset,legend,button,input,textarea,th,td {
    margin: 0;
    padding: 0
}

html {
    color: #000;
    overflow-y: scroll;
    overflow: -moz-scrollbars
}

body,button,input,select,textarea {
    font: 12px arial
}

h1,h2,h3,h4,h5,h6 {
    font-size: 100%
}

em {
    font-style: normal
}

small {
    font-size: 12px
}

ul,ol {
    list-style: none
}

a {
    text-decoration: none
}

a:hover {
    text-decoration: underline
}

legend {
    color: #000
}

fieldset,img {
    border: 0
}

button,input,select,textarea {
    font-size: 100%
}

table {
    border-collapse: collapse;
    border-spacing: 0
}

img {
    -ms-interpolation-mode: bicubic
}

textarea {
    resize: vertical
}

.left {
    float: left
}

.right {
    float: right
}

.overflow {
    overflow: hidden
}

.hide {
    display: none
}

.block {
    display: block
}

.inline {
    display: inline
}

.error {
    color: #F00;
    font-size: 12px
}

label,button {
    cursor: pointer
}

.clearfix:after {
    content: '\20';
    display: block;
    height: 0;
    clear: both
}

.clearfix {
    zoom: 1
}

.clear {
    clear: both;
    height: 0;
    line-height: 0;
    font-size: 0;
    visibility: hidden;
    overflow: hidden
}

在main.js中引入

配置基础页面

登录页:

login.vue

<template>
  <div>
    <el-button @click="login" type="primary">登录</el-button>
  </div> 
</template>
<script>
 export default {
    name:'login',
    data(){
        return{

        }
    },
    methods:{
      login(){
        this.$router.push('/dashboard')
      }
    }
 }
</script>
<style>

</style>

dashboard.vue页面(主要容器页面)

<template>
  <div class="layout">
    <header class="header">
        <div class="logo">
          <h1>Vue2练习</h1>
        </div> 
    </header>
    <content class="content">
        <div class="leftMenu">
           <el-menu
      :default-active="leftMenu[0].name"
      class="el-menu-vertical-demo"
      @open="handleOpen"
      @close="handleClose"
      background-color="#545c64"
      text-color="#fff"
      active-text-color="#ffd04b">
      <el-menu-item :index="item.name" v-for="(item,index) in leftMenu" :key="index" @click="changeMenuItem(item)">
        <i :class="item.meta.icon"></i>
        <span slot="title">{{ item.meta.name }}</span>
      </el-menu-item>
    </el-menu>
        </div>
        <div class="rightbox">
          <router-view></router-view>
        </div>
    </content>
  </div>
</template>
<script>
 export default {
    name:'dashboard',
    data(){
        return{
      leftMenu:[],
        }
    },
    methods: {
      handleOpen(key, keyPath) {
        console.log(key, keyPath);
      },
      handleClose(key, keyPath) {
        console.log(key, keyPath);
      },
      changeMenuItem(item){
        this.$router.push(item.path)
      }
    },
    created(){
      console.log(this.$router,'??路由信息')
      this.leftMenu = this.$router.options.routes.find(item=>item.name === 'dashboard').children || []
    }
 }
</script>
<style lang="less" scoped>
::v-deep(.el-menu){
  border:none;
}
.layout{
    height:100vh;
    width:100vw;
    .header{
        height:100px;
        width:100%;
        background-color:#535b65;
        .logo{
          background-color:#fff;
          height:100%;
          width:200px;
          color:#000;
          display:flex;
          h1{
            margin:auto;
            font-size:20px;
            font-weight:600;
          }
        }
    }
    .content{
        flex:1;
        display:flex;
        height:calc(~"100vh - 100px");
        background-color:#fff;
        .leftMenu{
            width:200px;
            height:100%;
            background-color:#535b65;
        }
        .rightbox{
          flex:1;
          height:100%;
        }
    }
}

</style>

ok,这个最基本的配置也就完成了,效果如下:

也是可以查看到我们配置的store和router。

代码直接复制就可以了,项目的基础配置完成,后续的模块都是vue技术的demo,或者模拟具体业务的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1207948.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Karmada调度器

调度器就像一个发动机&#xff0c;如果没有了发动机输入动力&#xff0c;是无法正常运行的。就像 Kubernetes 的调度器&#xff0c;它会负责根据节点的资源状态、Pod 的运行状态&#xff0c;判断 Pod 是调度到怎样的集群节点上去。对于 Karmada 这样的多云能力的调度器来说&…

mysql之MHA

1、定义 全称是masterhigh avaliabulity。基于主库的高可用环境下可以实现主从复制及故障切换&#xff08;基于主从复制才能故障切换&#xff09; MHA最少要求一主两从&#xff0c;半同步复制模式 2、作用 解决mysql的单点故障问题。一旦主库崩溃&#xff0c;MHA可以在0-30…

OSCNet: Orientation-Shared Convolutional Network for CT Metal Artifact Learning

OSCNet: 面向共享的CT金属伪影学习卷积网络 论文链接&#xff1a;https://ieeexplore.ieee.org/document/10237226 项目链接&#xff1a;https://github.com/hongwang01/OSCNet&#xff08;目前不会开源&#xff09; Abstract X射线计算机断层扫描(CT)已广泛应用于疾病诊断和…

“糖尿病日”感言

长期旺盛的写作欲&#xff0c;今天忽地就莫名其妙地衰退下来了。感到浑身都不舒服&#xff0c;特别是过去从未出现过的腰微痛、乏力现象发生了。 转念一想&#xff0c;或是老龄人一日不如一日的正常反应吧&#xff1f;而且&#xff0c;今天恰逢“ 联合国糖尿病日”&#xff0c…

2023-2024-2 高级语言程序设计-二维数组

7-1 矩阵运算 给定一个nn的方阵&#xff0c;本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。 输入格式: 输入第一行给出正整数n&#xff08;1<n≤10&#xff09;&#xff1b;随后n行&#xff0c;每行给出…

WGCLOUD的特点整理

做运维工作很多年了&#xff0c;项目中用过不少的运维软件工具&#xff0c;今天整理下WGCLOUD的特点&#xff08;优点&#xff09; 首先WGCLOUD是完全免费的 部署使用&#xff1a;部署简单方便&#xff0c;上手容易&#xff0c;几乎没有学习成本&#xff0c;对新手友好 文档…

文献阅读——Layered Costmaps for Context-Sensitive Navigation

摘要 许多导航系统&#xff0c;包括无处不在的ROS导航堆栈&#xff0c;在单个成本图上执行路径规划&#xff0c;其中大部分信息存储在单个网格中。这种方法在生成最小长度的无碰撞路径方面非常成功&#xff0c;但是当成本图中的值超出已占用或空闲空间时&#xff0c;它在动态的…

【教学类-07-08】20231114《破译电话号码-图形篇(图形固定列不重复)》(大4班 有名字 有班级 无学号、零=0)

效果展示 背景需求&#xff1a; 最近大4班做“嵌套骰子”非常频繁&#xff0c;为了避免“疲劳”&#xff0c;我找出他们班家长的手机号&#xff0c;批量做了“破译电话号码”&#xff0c;有图案版和加减法版&#xff0c;考虑到第一次做&#xff0c;还是选最简单的“点数总数&a…

物联网AI MicroPython学习之语法 umqtt客户端

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; umqtt 介绍 模块功能: MQTT客户端功能 - 连线、断线、发布消息、订阅主题、KeepAlive等功能。 MQTT协议采用订阅者/发布者模式&#xff0c;协议中定义了消息服务质量&#xff08;Quality of Service&#x…

墨西哥专线国际物流为何连续几年高增长?

墨西哥专线国际物流之所以连续几年高增长&#xff0c;有多个原因。首先&#xff0c;墨西哥作为北美地区重要的制造业基地&#xff0c;其对国际物流的需求持续增长。墨西哥的地理位置使其成为连接北美、中美洲和南美洲的重要交通枢纽&#xff0c;这意味着墨西哥的国际物流需求将…

二分法中的两个模板

在acwing的算法基础课中&#xff0c;yxc给出了二分的两个模板&#xff0c;这里举有序数组查找某个数的例子来说明这两个模板。 模板1&#xff1a; 当我们将区间[l, r]划分成[l, mid]和[mid 1, r]时&#xff0c;其更新操作是r mid或者l mid 1;&#xff0c;计算mid时不需要加…

用Go实现yaml文件节点动态解析

1.摘要 在大多数Go语言项目中, 配置文件通常为yaml文件格式, 在文件中可以设置项目中可灵活配置的各类参数, 通常这类参数都是比较固定的, 可以将其映射为对应的结构体在项目中进行使用, 如果需要调整参数时, 只需要增减结构体参数字段内容即可。 但同时还存在另外一种情况, …

【PG】PostgreSQL高可用方案repmgr部署(非常详细)

目录 简介 1 概述 1.1 术语 1.2 组件 1.2.1 repmgr 1.2.2 repmgrd 1.3 Repmgr用户与元数据 2 安装部署 2.0 部署环境 2.1 安装要求 2.1.1 操作系统 2.1.2 PostgreSQL 版本 2.1.3 操作系统用户 2.1.4 安装位置 2.1.5 版本要求 2.2 安装 2.2.1 软件包安装 2.2…

git分支管理以及不同git工作流对比

0、 单人开发场景 单人开发可能会出现的场景之一 如果多人协同开发我们则需要使用更加专业的工具Git&#xff08;分布式版本控制&#xff09; 1、多人协同工作使用git会出现什么问题? 代码冲突&#xff1a; 问题&#xff1a; 当多个开发者同时修改同一文件或同一行代码时…

embedding的综述

1 一文读懂Embedding的概念&#xff0c;以及它和深度学习的关系 one-hot 变成地位稠密的向量&#xff0c;降维 什么是词嵌入&#xff1a;讲词汇表中的词或者词语映射成固定长度的向量。 具体过程&#xff1a; one-hot变成低维连续的向量 语义相近的词语&#xff0c;词语赌…

大模型的实践应用6-百度文心一言的基础模型ERNIE的详细介绍,与BERT模型的比较说明

大家好,我是微学AI,今天给大家讲一下大模型的实践应用6-百度文心一言的基础模型ERNIE的详细介绍,与BERT模型的比较说明。在大规模语料库上预先训练的BERT等神经语言表示模型可以很好地从纯文本中捕获丰富的语义模式,并通过微调的方式一致地提高各种NLP任务的性能。然而,现…

英伟达中国特供芯片是缩水版;华为 Mate60 Pro 国产零件价值占比 47%丨 RTE 开发者日报 Vol.84

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

这个双11,谁赚了?

双11落幕&#xff0c;很多品牌迎来一年中最重要的一次生意爆发&#xff0c;但作为普通消费者&#xff0c;还是能感受到今年双11的消费氛围减弱了&#xff0c;一方面&#xff0c;电商大促驱向常态化&#xff0c;双11不一定是全年最低价&#xff0c;“有需要再买”的心态越来越多…

人工智能学院承办南山区区块链公益职业技能培训

11月4日&#xff0c;南山区人力资源局主办、深圳职业技术大学承办的2023年南山区公益职业技能培训项目——区块链技术应用项目&#xff0c;于当天在深圳职业技术大学西丽湖校区图书馆西厅正式开班。此次培训将持续至11月18日。南山区人力资源局职业能力建设科科长张仁勇、人工智…

微服务简单理解与快速搭建

分布式和微服务 含义 微服务架构 微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法&#xff0c;每个服务运行在自己的进程中&#xff0c;服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并且可通过全自动部署机制独立部署。这些服…