总结Vue中index.html、main.js、App.vue、index.js之间关系以及Vue项目加载流程

2023-05-16

总结Vue中index.html、main.js、App.vue、index.js之间关系以及Vue项目加载流程

文章目录

  • 总结Vue中index.html、main.js、App.vue、index.js之间关系以及Vue项目加载流程
    • 1 vue中index.html、main.js、App.vue、index.js关系
      • 简介
      • 1.1 项目的运行入口index.html
      • 1.2 入口文件main.js
      • 1.3 根组件App.vue
      • 1.4 控制路由index.js
    • 2 Vue项目加载流程

1 vue中index.html、main.js、App.vue、index.js关系

简介

项目部署完成后的项目结构以及index.html、main.js、App.vue、index.js如下图所示:

在这里插入图片描述

  1. index.html—主页,项目入口
  1. App.vue—根组件,主窗口 组件汇聚点 Vue是基于主键化开发
  1. main.js—入口文件: 整个项目工程入口 用于全局配置
  1. index.js设置路由–名字和资源映射起来

src中所有的编译打包后在public下index.html中app里面

引出我们的问题:那么这几个文件之间的联系如何呢?

1.1 项目的运行入口index.html

为什么index.html是项目的入口以及为什么index.html加载后会继续加载main.js、App.vue、index.js,以及他们之间的关系是如何联系起来的呢???

解释:

这是vue底层源码实现的,通过项目的里面webpack.dev.conf.js等配置文件,可以加载运行我们的index.html文件以及自动关联vue相关的模块。感兴趣的可以了解下。

首先我们来看一下index.html中的内容

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.png">
    <title>vue-mooc</title>
  </head>
  <body>
    <noscript>
      <strong>We're sorry but vue-mooc doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>

在网页的Title部分,加载了index.html中定义的Title,而在正文部分,加载了App.vue中定义的部分。
网页效果如下:
在这里插入图片描述

1.2 入口文件main.js

index.htmlbody体中只有一个div标签,其idapp,这个id将会连接到src/main.js内容,接着我们看一下main.js中的主要的代码`

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

import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import locale from 'element-ui/lib/locale/lang/en' // lang i18n

// set ElementUI lang to EN
Vue.use(ElementUI, { locale })

// register custom base component
import Mooc from './register.js'
import 'assets/theme/index.styl'
Vue.use(Mooc)

import 'assets/stylus/index.styl'


Vue.config.productionTip = false

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

main.js中,new一个vue实例,并手动挂载在index.html中app里面。也就是说通过main.js我们关联到App.vue组件

1.3 根组件App.vue

接着,我们继续看一下App.vue组件中的内容。

<template>
  <div id="app" :style="getStyle">
    <mooc-container>
      <mooc-header height="72px">
        <m-header />
      </mooc-header>
      <mooc-main>
        <router-view />
      </mooc-main>
      <mooc-footer height="120px">
        <m-footer />
      </mooc-footer>
    </mooc-container>

    <mooc-backtop :show-height="500"></mooc-backtop>
    <login v-if="showLogin" @maskClick="handleMaskClick" />
  </div>
</template>

<script>
import MHeader from 'components/header/index.vue'
import MFooter from 'components/footer/footer.vue'
import { mapGetters, mapMutations } from 'vuex'
import { scrollMixin } from 'assets/js/mixin.js'
export default {
  name: 'App',
  mixins: [scrollMixin],
  computed: {
    getStyle () {
      return {
        'max-height': this.showLogin ? '100%' : '',
        'overflow': this.showLogin ? 'hidden' : ''
      }
    },
    // vuex
    ...mapGetters(['showLogin'])
  },
  methods: {
    // 遮罩点击事件
    handleMaskClick () {
      this.setShowLogin(!this.showLogin)
    },
    // vuex
    ...mapMutations({
      'setShowLogin': 'login/SET_SHOW_LOGIN'
    })
  },
  components: {
    MHeader,
    MFooter,
    Login: () => import('components/login/login.vue')
  }
}
</script>

App.vue中的内容是一个标准的vue模板的形式,包含了<template></template>、<script></script>、<style></style>三部分

script中直接处理好业务,template中直接渲染 ,通过v-model双向绑定,

template标签中可以看到,引入了其他页面组件,也就是我们使用npm run serve运行vue项目后看到的界面
在这里插入图片描述
问题:那么内容是从哪里渲染出来的呢?

1.4 控制路由index.js

我们注意到,<template>标签下,除了<img>标签外,还有<router-view>标签,<router-view>标签将会把路由相关内容渲染在这个地方,接下来,我们看一下路由的内容有哪些,在哪里出现的。其实,这个文件位于src/router/index.js中,我们看一下index.js中的代码

import Vue from 'vue'
import Router from 'vue-router'
import store from '../store/index.js'
import { getUserInfo } from 'utils/cache.js'
Vue.use(Router)

const Home = () => import('pages/home/index.vue') // 首页路由
const CourseIndex = () => import('pages/course/index.vue') // 免费课程路由
const CourseDetail = () => import('pages/course-detail/index.vue') // 免费课程详情路由
const LessonIndex = () => import('pages/lesson/index.vue') // 实战课程路由
const LessonDetail = () => import('pages/lesson-detail/index.vue') // 实战课程详情路由
const ReadIndex = () => import('pages/read/read.vue') // 专栏路由
const ReadDetaiil = () => import('pages/read-detail/read-detail.vue') // 专栏详情路由
const UserCenter = () => import('pages/user/index.vue') // 个人中心路由
const VipCenter = () => import('pages/vip/index.vue') 

const UserCRUD = () => import('pages/admin/user/index')
const CourseCRUD = () => import('pages/admin/course/index')
const ArticleCRUD = () => import('pages/admin/article/index')
const CommentCRUD = () => import('pages/admin/comments/index')

//路由元信息
const routes = [
  {
    path: '/crud/user',
    name: 'UserCRUD',    //给路由起个名,标识路由对象,可以根据name去取一个路由
    component:UserCRUD,
    meta: {
      requireAuth: true  //将开启你的页面路由守卫
    }
  },
  {
    path: '/crud/course',
    name: 'CourseCRUD',
    component:CourseCRUD,
    meta: {
      requireAuth: true
    }
  },
  {
    path: '/crud/article',
    name: 'ArticleCRUD',
    component:ArticleCRUD,
    meta: {
      requireAuth: true
    }
  },
  {
    path: '/crud/comments',
    name: 'CommentCRUD',
    component:CommentCRUD,
    meta: {
      requireAuth: true
    }
  },
  {
    path: '/',
    name: 'Index',
    redirect: '/home'
  },
  {
    path: '/home',
    name: 'Home',
    component:Home
  },
  {
    path: '/user',
    name: 'UserCenter',
    component:UserCenter,
    meta: {
      requireAuth: true
    }
  },
  {
    path: '/vip',
    name: 'VipCenter',
    component:VipCenter,
    meta: {
      requireAuth: true
    }
  },
  {
    path: '/course',
    name: 'CourseIndex',
    component: CourseIndex,
  },
  {
    path: '/course/:id',
    name: 'CourseDetail',
    component: CourseDetail,
    meta: {
      requireAuth: true
    }
  },
  {
    path: '/lesson',
    name: 'LessonIndex',
    component:LessonIndex
  },
  {
    path: '/lesson/:id',
    name: 'LessonDetail',
    component: LessonDetail,
    meta: {
      requireAuth: true
    }
  },
  {
    path: '/read',
    name: 'ReadIndex',
    component:ReadIndex,
  },
  {
    path: '/read/:id',
    name: 'ReadDetaiil',
    component:ReadDetaiil,
    meta: {
      requireAuth: true
    }
  }
]
const router = new Router({
  routes: routes,
  scrollBehavior () {
    return {
      x: 0,
      y: 0
    }
  }
})

// 路由拦截   全局路由守卫  权限控制,前端路由守卫控制,登录才可以访问
router.beforeEach((to, from, next) => {
  let userinfo = getUserInfo()
  if (to.meta.requireAuth) {
    if (userinfo.username) {
      next()
    } else{
      store.commit('login/SET_SHOW_LOGIN', true)
    }
  } else {
    next()  //拿到next才放行
  }
})

//对外输出一个router实例
export default router

index.js的代码中,建立了路由相关的内容,也就会渲染到App.vue下面的router-view中。
本项目在index.js下面配置了路由守卫,路由守卫一般应用于权限控制
路由守卫具体作用可以理解为:前端每次跳转路由,就判断 localStroage中有无token,没有就跳转到登录页面,有则跳转到对应路由页面(本项目为例)

index.js中,取其中一个例子,将UserCRUD组件发布为路由,换句说,index.js在这里就是将UserCRUD发布为路由,以在下面进行展示UserCRUD内容,接下来我们再看看components/UserCRUD中的内容是啥(由于里面的内容比较多,这里我们只截取了template中的内容)。

<template>
  <ul class="course-list">
    <li v-for="(item,index) in list" :key="index" class="course-item" @click="handleCourseClick(item)">
      <div class="img-box">
        <img :src="item.img" alt="">
        <span v-if="item.type == 'vip'" class="vip">{{item.type}}</span>
        <span v-else class="free">{{item.type}}</span>
        <div v-if="item.tags && item.tags.split(',').length > 0" class="tags">
          <span v-for="(tag, index) in item.tags.split(',')" :key="index" class="tag-item">{{ tag }}</span>
        </div>
        <div v-if="item.process > 0" class="badge rate">
          {{ item.process }}%
        </div>
        <div v-if="item.script" class="badge script">
          {{ item.script }}
        </div>
      </div>
      <p class="course-name">
        {{ item.title }}
      </p>
      <p class="info">
        <span>{{ item.rank }}</span>
        <span><i class="iconfont icon-user">&#xe607;</i></span>
        <span>
          <mooc-star class="star-box" :value="num" :disabled="true" />
        </span>
      </p>
    </li>
  </ul>
</template>

course.vuetemplate中,我们可以看到界面上渲染的一些连接等内容。
course实际渲染效果如下:
在这里插入图片描述

到此,这个页面的加载渲染过程结束了。

2 Vue项目加载流程

通过上述过程,我们可以看到项目加载的过程是index.html->main.js->app.vue->index.js->course.vue

本项目完整代码可以进入我的码云查看:我的码云

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

总结Vue中index.html、main.js、App.vue、index.js之间关系以及Vue项目加载流程 的相关文章

  • 修改 Twitter 帖子上可编辑 Div 的内容

    我正在编写一个 chrome 扩展 它可以帮助用户在 Twitter 上输入内容 当在 twitter 上写推文时 twitter 会打开一个可编辑的 div 容器 当用户输入内容时 twitter 大概正在使用某些网络框架 会生成子 di
  • 哪些 HTML 元素不能包含子节点?

    我一直在寻找一份详尽的清单 但在任何地方都找不到 为了避免必须仔细阅读规范 有谁知道它们是什么 我认为可以包含子元素的补充元素列表也很有用 XHTML 1 和 HTML5 之间的列表有何不同 您可以在以下位置找到 void 元素 不能有任何
  • 嵌套 DIV 的类似斑马的 CSS 样式

    我嵌套了 DIV 元素 但我不知道嵌套的级别 我需要每个都有与其父级不同的背景 创建类似斑马的颜色 我只使用两种背景 深色和白色 效果需要类似于在容器中设置奇数和偶数子级的样式 但在我的例子中 子级是嵌套的 我可以使用每个嵌套元素的规则来做
  • 如何使用 jQuery 单击特定链接时打开引导导航选项卡的特定选项卡?

    我是 jquery 和 bootstrap 的新手 所以请考虑我的错误 我已经创建了一个用于登录和注册的 bootstrap 模式 它包含两个导航选项卡 称为登录和注册 我有两个按钮可以弹出相同的模态窗口 但在模态窗口内显示不同的选项卡 每
  • 选择单选按钮时隐藏/显示 3 个文本框

    我有 2 个单选按钮 选择一个文本框时 我想显示 3 个文本框 并在选择其他文本框时隐藏它 这是代码 这是我的 2 个单选按钮
  • 如果选中复选框则显示 div

    我正在尝试构建类似 WordPress 选项的东西 用于在创建文章时切换字段可见性 我所构建的依赖于 click函数使用相应的字段名称切换父项 我想知道如果选中该复选框 执行此操作的最佳方法是什么 因为如果您选中一个框并重新加载页面 因为它
  • PHP 文件上传帮助

    div align center div 这是我的代码
  • 如何在非 CSS3 浏览器上制作圆角?

    我知道在这种情况下我必须使用图像 每个角一个 例如 如果我需要给定元素周围有一个 4px 的纯蓝色边框 边框半径为 8px 我相应地设计了四幅图像 左上角 png 右上角 png 左下角 png 右下角 png 如果可能的话 我应该如何实现
  • 如何在不关闭浏览器自动完成建议的情况下改进它们?

    这里有十个无数的线程 如何disable浏览器自动完成行为 例如如何禁用网络表单字段 输入标签上的浏览器自动完成功能 https stackoverflow com questions 2530 how do you disable bro
  • html 空格引起的非常奇怪的错误

    我在 Firefox 中遇到了一个非常奇怪的错误 我在外部文件中有一个 javascript 函数 可以在常规复杂性网站上完美运行 然而 我一直在整理一些演示示例并遇到一些奇怪的事情 html 格式如下 在编辑器中 div p Q Wher
  • 有没有办法编写屏幕阅读器会忽略的内容?

    我刚刚开发了一个需要视力正常和视障用户都可以访问的页面 内容的某些元素仅与视觉元素相关 因此根本不适用于使用屏幕阅读器的人 例如 链接在新窗口中打开视听演示文稿 但由于我无法控制的情况 窗口的大小被笨拙地调整 因此有一条消息说您应该调整窗口
  • 如何将表格中的td高度设置为0px?

    我有一个包含几行的 HTML 表 这是动态构建的 全部 tr 有一个 td inside If one td 里面没有 HTML 内容 我希望它是不可见的 如何才能做到这一点 并不是说里面的 HTML 是动态渲染的 我不想使用display
  • 自动调整Google网站嵌入代码的高度(html)

    我正在使用 Google 协作平台嵌入 HTML 代码 将代码粘贴到 从网络嵌入 窗口中 输出的长度是可变的 我希望有一种方法可以动态调整父级的高度iframeGoogle 协作平台用于托管我的 HTML 我知道我可以使用 Google 协
  • 使用 pkg:sjPlot 函数创建一个生成部分斜体单元格的数据框

    我正在尝试创建一个简单的数据表 其中 Coral taxon 列中的属名称为斜体 而 spp 列中的属名称为斜体 属名后面的部分不大写 我尝试使用 expression 函数对 Coral taxon 的每一行进行编码 但没有成功 sum
  • 在 javascript、jQuery 或 css 中,如何让 div 或 iframe 展开以填充其余空间

    我有三个 iframe 我将顶部 iframe 设置为 50px 高度 将底部 iframe 设置为 50px 但我希望中间 iframe 扩展以填充其余空间 有没有一种技术可以用来对任何窗口屏幕尺寸执行此操作 谢谢 example
  • GWT - 如何组织项目以拥有多个网页以及它们之间的导航

    我是 GET 的新手 顺便说一句 它给我留下了深刻的印象 并且发现它对于像我这样熟悉 C NET 桌面技术并愿意编写 Web 应用程序的人来说非常有吸引力 我根据 GWT Eclipse 向导生成的示例启动了自己的项目 该项目生成带有面板的
  • IE 中的 HR 标签 - 删除边框

    在除 IE7 及更低版本之外的其他浏览器中 hr 在 hr 标签周围显示边框 但我不希望它出现 我已经尝试过这个解决方案 但它周围似乎仍然有边框 它看起来像这样 我该如何摆脱它 See http webdesign about com od
  • html css 下拉菜单

    这是我第一次在 Stack Overflow 上发帖 我不熟悉论坛发帖规定 所以请让我知道我做错了什么 我在论坛中研究过这个问题 但我所遇到的一切都没有给我明确的答案 我试图从 新闻 元素创建一个下拉菜单 但在运行代码时我从未得到任何可见的
  • 如何在html中制作多行类型的文本框?

  • HTML 属性 bgcolor 已弃用:用什么代替?

    VStudio ASP NET 给出以下消息 Attribute bgcolor is considered outdated A newer construct is recommended 推荐的结构是什么 bgcolor是在一个 td

随机推荐

  • 十进制转化为八进制和十六进制

    用C语言可以轻松的把10进制转化为8进制或16进制 include lt stdio h gt int main void int m printf 34 输入你想要转化的十进制整数 34 scanf 34 d 34 amp m print
  • Python处理大量csv(Excel)文件将数据保留两位小数

    Python处理大量csv文件是十分方便的 xff0c Python有许多用于数据处理数据分析的库 用Excel处理csv文件很痛苦 xff0c 效率很低 xff0c 没法批量保留两位小数 在处理需要大量数据的机器学习和神经网络的csv文件
  • BMI(体重指数)计算C语言

    计算BMI需要计算BMI的公式 xff0c 需要与用户交互 用户要输入体重和身高 include lt stdio h gt int main void BMI计算公式 float weight float height float BMI
  • SQL插入数据

    插入完整的行简单的一种方法 这种语法很简单 xff0c 但是避免使用 依赖列的定义次序 xff0c 在结构变动后不安全 INSERT INTO Customers INTO关键字保证代码可移植 VALUES 100000006 与列的定义次
  • 用栈实现中缀表达式求值

    include lt stdio h gt include lt string h gt include lt stdlib h gt define MAX 100 define Error 0 define True 1 typedef
  • 循环打印九九乘法表

    下面为三种打印九九乘法表的方法 第一种是使用while循环 xff0c 第二种是使用for循环 xff0c 第三种是使用while和for循环 其实还有很多种实现方式 xff0c 但是核心是利用循环实现 while循环实现九九乘法表 i 6
  • Python猜单词小程序

    import random flag 61 39 Y 39 print 34 欢迎使用猜单词小程序 34 while flag 61 61 39 Y 39 and flag 61 39 N 39 WORDS 61 39 easy 39 39
  • 扑克牌Python实现

    扑克牌可以洗牌 扑克牌有花色和数字 四个人的版本 每个人13张牌 对牌可以实现自动排序 xff08 先按照花色 xff0c 再按照数字 xff09 import random def gen pocker n 34 34 34 生成初始扑克
  • linux下执行sh脚本,提示Command not found解决办法

    确保用户对文件有读写及执行权限 xff08 如果此时的权限是 dr xff0c 没有x xff0c 就说明没有执行的权限 xff09 xff1a chmod a 43 x xxx sh
  • Python猜单词小游戏(GUI代码实现)

    本代码实现了带有用户界面的猜单词小游戏 xff0c 使用类进行编程 xff0c 用到了tkinter random等库 主界面可以进行猜单词游戏 xff0c 包含提示功能 更新单词 提交 退出等功能 菜单界面可以实现导入词库 xff0c 显
  • 伪黑客Windows下常使用的小黑窗口cmd,以及DOS(磁盘操作系统)

    什么是DOS xff1f 简单的来说 xff0c 就是使用命令的方式来操作电脑磁盘的文件 xff08 现在基本上都被图形化界面操作的方式取代 xff09 xff0c 如增删改查等操作 xff0c 是比较久远的一种操作系统 xff08 感兴趣
  • 【归并排序】C++数据结构实现归并排序完整代码

    归并排序 C 43 43 数据结构实现归并排序完整代码 归并排序 xff08 Merging Sort xff09 定义 xff1a 把两个或者多个有序的序列合并为一个 递归调用方式实现方式实现代码 xff1a 一 归并排序函数入口 归并排
  • 【css提取数据】

    css提取数据 一 了解网页代码格式二 标签之间的关系1 引入库 三 css选择器1 了解解析对象 xff0c 导入相关模块2 标签选择器3 类选择器4 id选择器5 组合选择器6 伪类选择器7 属性提取器 总结 提取数据方法有很多 xff
  • ubuntu 18.04 安装pycharm社区版以及创建桌面快捷方式

    1 下载 Download PyCharm Python IDE for Professional Developers by JetBrains 2 解压提取到此处 3 安装 xff08 1 xff09 打开终端 xff0c 进入pych
  • docker各种报错解决

    目录 问题1 Get https registry 1 docker io v2 context deadline exceeded 解决方法 问题反思 问题2 Error response from daemon Get 34 https
  • org.slf4j.Logger无法输出日志的BUG

    场景 依赖 lt dependency gt lt groupId gt org apache zookeeper lt groupId gt lt artifactId gt zookeeper lt artifactId gt lt v
  • 【安全知识】——SSH的两种远程登录方法详解

    作者名 xff1a Demo不是emo 主页面链接 xff1a 主页传送门 博主简介 xff1a 一 个普通的大二学生 xff0c 在CSDN写博客主要是为了分享自己的学习历程 xff0c 学习方法 xff0c 总结的经验等等 xff0c
  • scanf()函数错误C4996解决办法(严重性 代码 说明 项目 文件 行 禁止显示状态)

    问题如下 xff1a 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C4996 scanf This function or variable may be unsafe Consider using scanf s instea
  • Uubuntu 更新内核出现的问题_libssl3

    电脑系统 xff1a ubuntu系统 ubuntu版本 xff1a 1804 内核版本 xff1a 5 17 15 内核从5 15 升级到5 17后 xff0c 1 xff0c 在安装N卡驱动的时候 xff0c error xff1a l
  • 总结Vue中index.html、main.js、App.vue、index.js之间关系以及Vue项目加载流程

    总结Vue中index html main js App vue index js之间关系以及Vue项目加载流程 文章目录 总结Vue中index html main js App vue index js之间关系以及Vue项目加载流程1