您的位置:首页 > Web前端 > Vue.js

vue-cli构建项目---浅析文件

2020-01-13 07:21 387 查看

构建web服务器

在用vue-cli创建了文件夹(myapp)的前提下

cd myapp
yarn serve
然后访问cmd上提示的路径就可以看到一个简单的基于vuejs的项目了

文件分析

代码分析

mian.js:入口文件

//入口文件
// 导入文件。1,vue。2主组件。3.
import Vue from 'vue'
import App from './App.vue'
//导入路由库
//完整的写法是:./router/index.js,但是如果某个文件名叫做index.js则可以省略不写
import router from './router'

Vue.config.productionTip = false

new Vue({
//注册路由
router,
//h函数是将主组件的东西变成虚拟dom
//然后render将这个虚拟dom渲染到public文件夹下的index文件下的#app中
render: h => h(App)
}).$mount('#app')

app.vue:主组件

<!--这是主组件文件-->
<!--完成路由相关操作,1,配置导航,2设置容器-->
<template>
<div id="app">
<div id="nav">
<!--配置导航-->
<router-link to="/">Home</router-link> |
<router-link to="/about">About</router-link>
</div>
<!--设置容器,当请求哪一个导航时,会将对应内容放到这里面去-->
<router-view/>
</div>
</template>

<style lang="less">
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
}

#nav {
padding: 30px;
a {
font-weight: bold;
color: #2c3e50;

&.router-link-exact-active {
color: #42b983;
}
}
}
</style>

router/index.js:路由库

//这是路由库
import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '../views/Home.vue'
//插件的使用
//写了这句话后,可以在组件内部调用如下方法:this.$router.push("./home")这样的编程式路由
Vue.use(VueRouter)

const routes = [
//  定义路由映射关系
{
path: '/',
name: 'home',
component: Home
},
{
path: '/about',
name: 'about',
//如果component的属性值如果是一个函数,则代表当前的组件加载模式为懒加载模式(也称为按需加载)
component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
}
]
//实例化路由
const router = new VueRouter({
routes
})
//导出路由,此处路由导出到main.js
export default router

Vue.use(VueRouter)底层原理

  • 写了这句话后,可以在组件内部调用如下方法:this.$router.push("./home")这样的编程式路由
  • 相当于给vue的原型上增加了一个$router函数,里面有很多方法,例如
Vue.prototype.$router={
push:function(path){},
back:function(){},
go:function(){}
}
  • 在实例对象中就可以使用了
export default {
methods:{
goback(){
this.$router.push('/')//回到首页
}
}
}

懒加载模式

  • 1,什么是懒加载模式

    如果component的属性值如果是一个函数,则代表当前的组件加载模式为懒加载模式(也称为按需加载)
  • 为什么会出现懒加载模式?

      主要原因是vuejs开发出来的单组件,默认情况下在最后打包时,会把所有的单文件打包到一个.js文件中,导致单个文件过大,因为index.html会加载js文件,由于js文件过大,会导致单页面首次加载很慢,或者出现白屏问题
  • 为什么加载慢?

      js加载会阻塞代码的执行
  • 使用懒加载模式优化:

      用户去访问这种单页应用的时候,其实第一次只会去看一些基本的信息,其他的信息是需要点击之后才可以加载查看,没必要把所有的组件代码全部打包到一个文件。
    • 可以把首次展示的打包成一个单独的文件,然后把其他的各个组件也打包成一个一个 的单独文件。
    • 然后用户点击那个路由的时候,就去发送网络请求加载对应的组件的js文件,实现按需加载的效果。

    Home.vue首页组件

    <template>
    <div class="home">
    <img alt="Vue logo" src="../assets/logo.png">
    <!--&ndash;这里其实类似于父子通信,通过属性传递,把模型变量给儿子,但是这里的模型变量其实就是固定的一个字符串-->
    <!--在子组件的调用处定义一个属性:msg-->
    <!--子组件的组件对象里的props定义好调用处已经声明的属性-->
    <HelloWorld msg="Welcome to Your Vue.js App"/>
    </div>
    </template>
    
    <script>
    // @ 是src的别名,代表src的绝对路径
    //HelloWorld是一个局部组件
    import HelloWorld from '@/components/HelloWorld.vue'
    //导出home组件
    //其实这里相当于这样导出
    // var home={
    //   template:``
    //   components:{},
    //   methods:{}
    // }
    export default {
    name: 'home',
    components: {
    HelloWorld
    }
    }
    </script>

    HelloWorld.vue子组件

    <template>
    <div class="hello">
    <!--这里显示属性msg等于的值(父亲给的模型变量)-->
    <h1>{{ msg }}</h1>
    <p>
    For a guide and recipes on how to configure / customize this project,<br>
    check out the
    <a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
    </p>
    </div>
    </template>
    
    <script>
    export default {
    name: 'HelloWorld',
    //子组件的组件对象里的props定义好调用处已经声明的属性
    props: {
    msg: String
    }
    }
    </script>
    
    <!-- Add "scoped" attribute to limit CSS to this component only -->
    <style scoped lang="less">
    
    </style>

    创建一个news组件

    (1)在App.vue中配置导航

    < router-link to="/news">News< /router-link>

    (2)router中定义路由映射表,并且按需加载

    {
    path: '/news',
    name: 'news',
    component: () => import(/* webpackChunkName: "news" */ '../views/news.vue')
    },

    (3)views中创建一个文件news.vue组件,

    <template>
    <div>
    <h2>我是新闻页</h2>
    <h3>{{ msg }}</h3>
    <button @click="fn">点我有惊喜</button>
    </div>
    </template>
    
    <script>
    export default {
    name: "news.vue",
    data:function(){
    return {
    msg:'hello news!'
    }
    },
    methods:{
    fn:function(){
    alert("我是新闻页")
    }
    },
    created() {
    console.log('哈哈我还是新闻页的生命周期函数')
    }
    }
    </script>

    结果大概长这样

    组件的样式要注意:

    1,html 里面的 style标签里面写样式是一样, 可以使用 css选择器选中页面的元素,然后在定义css样式
    2,默认情况下,组件内部写的 style 是全局的 ,会把组件内部的 style 样式放置在 public/index.html 的head头部里面
    3,如果在多个组件里面写的 style 样式,如果不做任何处理的情况下,如果出现了冲突操作,使用的样式的样式,则后面的会覆盖前面的
    4,每个组件有自己的样式作用域,当前写的 style 就在当前的组件内部生效就可以了 如果真的有公共的样式要所有的组件全部公用,就写到 App.vue 主组件里面。
    5,scoped 翻译过来叫做作用域,代表当前的样式只在当前的组件生效

    //声明样式私有
    <style scoped>
    
    </style>

    预处理语言

    如果你的style中的语言是预处理语言,比如less,sass等
    就要在style中加入lang=‘less’/lang=‘sass’

    <style scoped lang="less">
    
    </style>
    • 点赞
    • 收藏
    • 分享
    • 文章举报
    RyleeLouth 发布了40 篇原创文章 · 获赞 3 · 访问量 3174 私信 关注
  • 内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: