vue项目结构

项目

通过webpack构建vue项目

1、建立项目路径,然后cmd切换到工作路径

2、输入vue init webpack demo ,建立项目。其中demo是我们要建立的项目名称。

接下来就是确认项目描述信息,作者信息

 

 然后出现js语法检测的内容,直接输入n就可以。暂时用不到。一直enter

 

 然后切换到刚刚新建的demo目录下,然后执行npm run dev.编译并启动我们的项目

 

 在浏览器中输入网址,就表示已经正确配置

项目构成

简单阐述一下当我们构建完成后,vue项目中的index.html、main.js、App.vue、index.js的运行加载过程,以及首界面是如何出现的,逐步了解vue项目

 项目运行

 

Vue.component 是注册全局组件,如果注册全局组件,我们就可以直接在html直接写了 

 // 定义全局组件,两个参数:1,组件名称。2,组件参数
    Vue.component("counter",{
        template:'<button v-on:click="count++">你点了我 {{ count }} 次,我记住了.</button>',
        data(){
            return {
                count:0
            }
        }
    })


在网页的Title部分,加载了index.html中定义的Title,而在正文部分,加载了App.vue中定义的部分。但是需要注意的是,在浏览器打开的瞬间,浏览器中正文部分会瞬间显示index.html中定义的正文部分

那么,我们就可以来分析上述的逻辑了,浏览器访问项目,最先访问的是index.html文件,

而index.html中 

 
<div id="app">来自index.html正文中的内容</div>

 上面有一个id为app的挂载点,之后我们的Vue根实例就会挂载到该挂载点上

 main.js作为项目的入口文件,在main.js中,新建了一个Vue实例,在Vue实例中,通过

new Vue({
  el: '#app',
router, //components: {App }, //template: '<App/>' })

告诉该实例要挂载的地方;(即实例装载到index.html中的位置)

接着,实例中注册了一个局部组件App,这个局部组件App来自于哪儿呢?

复制代码
import App from './App.vue'

new Vue({
  //el: '#app',
  components: {App },
  //template: '<App/>'
})
复制代码

这个局部组件是当前目录下的App.vue;

而起模板是什么呢?模板就是组件App.vue中的template中的内容。(template会替代原来的的挂载点处的内容)

 所以Vue这个实例就是暂时的是App.vue这个组件的内容

所以,我们进行总结:在项目运行中,main.js作为项目的入口文件,运行中,找到其实例需要挂载的位置,即index.html中,刚开始,index.html的挂载点处的内容会被显示,但是随后就被实例中的组件中的模板中的内容所取代,所以我们会看到有那么一瞬间会显示出index.html中正文的内容。

而index.html中的Title部分不会被取代,所以会一直保留。

为什么在main.js文件里面,用render: h => h(App)把它们挂载到#app里面,有的却写的是components:{app}?

new Vue({
  router,
  store,
  //components: { App }   <!---------------------------------------------vue1.0的写法
  render: h => h(App)     <!---------------------------------------------vue2.0的写法
}).$mount('#app')

 

先说render:render函数是渲染一个视图,然后提供给el挂载,如果没有render那页面什么都不会出来。

  然后是  =>   箭头函数。是Es6中的新语法:(如果大家想更深入的了解,推荐一篇文章:链接:https://segmentfault.com/a/1190000009410939)

  其实render: h => h(App)的意思, 首先 :表示 Vue 实例选项对象的 render 方法,它作为一个函数,接受传入的参数 h 函数,返回 h(App) 的函数调用结果。等价于:               

                              {
                      render: function(h) {
                          return h(App);
                      }
                  }

  其次:Vue 在创建 Vue 实例时,通过调用 render 方法来渲染实例的 DOM 树。

接着看到app.vue内容

<template>
  <div id="app">
    <img src="./assets/logo.png">
    <router-view/>
  </div>
</template>
 
<script>
export default {
  name: 'App'
}
</script>
 
<style>
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

 

看一下App.vue中的内容,是一个标准的App.vue模板的形式,包含了<template></template>、<script></script>、<style></style>三部分,我们注意到,<template>标签下有<router-view>标签,<router-view>标签将会把路由相关内容渲染在这个地方,接下来,我们看一下路由的内容有哪些,在哪里出现的。其实,这个文件位于src/router/index.js中,我们看一下index.js中的代码

 

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
 
Vue.use(Router)
 
export default new Router({
  routes: [
    {
      path: '/',
      name: 'HelloWorld',
      component: HelloWorld
    }
  ]

 

在index.js的代码中,建立了路由相关的内容,也就会渲染到app.vue下面的<router-view>中。在index.js中,将helloworld组件发布为路由,换句说,index.js在这里就是将helloword发布为路由,然后进行展示helloword内容,到此,这个页面的加载渲染过程结束了。

总结
通过上述过程,我们可以看到项目加载的过程是index.html->main.js->app.vue->index.js->helloworld.vue。这里只是对我们运行项目后,如何出现首页面做了简单的解释,对具体的实现没有进行分析。

index.html---主页,项目入口 

App.vue---根组件 是我们的主组件,页面入口文件 ,所有页面都是在App.vue下进行切换的。也是整个项目的关键,app.vue负责构建定义及页面组件归集。

main.js---程序入口文件,是初始化vue实例并使用需要的插件,加载各种公共组件.

自定义组件得在vue实例中才会生效。自定义组件可以内嵌样式 

单文件组件

vue 的单文件组件是官方提供的一种用来组织组件代码的形式,
该文件以 .vue 为后缀,
该文件会被 vue-cli内置的 webpack解析生成对应的 javascript、html、css文件,涉及到
单文件组件把一个组件所包含的 结构、样式、行为 分别通过 template、style、script 进行分离包含,然后统一组织在一个文件中
一个单文件组件最少必须包含 template,可以不需要 script 和 style
src 属性

我们还可以通过 src 属性把文件分离到单独的文件中

<template src="./template.html"></template>
<style src="./style.css"></style>
<script src="./script.js"></script>
这里的 src 同样遵循模块化的导入规则,./ 开头的表示相对路径,/ 开头表示 NPM 包中的资源

 

个人

posted @ 2020-06-28 23:49  Ren小白  阅读(372)  评论(0)    收藏  举报
levels of contents