美文网首页Vue
webpack+vue的基本配置(组件和路由)

webpack+vue的基本配置(组件和路由)

作者: 小本YuDL | 来源:发表于2019-08-08 21:58 被阅读0次

    1.webpack中使用vue组件

    引入vue组件步骤


    • 1.导入vue 包
      • 方法一:

        • (1)导入vue 包 import Vue from 'vue';
        • (2)同时配置 webpack.config.js文件的resolve
              resolve: {
                alias:{'vue$':"vue/dist/vue.js"}
            }
          
      • 方法二:

        • 直接引入: import Vue from '../node_modules/vue/dist/vue'

    2.单独建立.vue文件 包含三部分

           <template></template>
           <script></script>
           <style></style>
    

    3.引入 .vue文件

    • (1)默认打包不了.vue文件 需要重新安装一个 loader
    npm install vue-loader vue-template-compiler -D
    
    • (2)在webpack.config.js 文件 中配置
        const vueLoaderPlugin= require('vue-loader/lib/plugin');
        ......
        plugins: [  //引入插件
                new vueLoaderPlugin()
         ],
         module: {     //处理vue文件的第三方模块
             rules: [
                    {test:/\.vue$/,use:'vue-loader'}
             ]
        }
    
    • (3)main.js中引入
     import login from './login.vue';
    

    4.在vue实例里渲染插件

    • (1)方法一:
    components:{ login :login}
    
    • (2)方法二:
    render:function(createElements){
                 return createElements(login); //组件名
           }
    简写为如下:
           render:c=>c(login)
    
    • (3) 注意:render 方法渲染会覆盖页面的所有内容,而components不会

    5.npm run dev 即可渲染成功


    6.若组件内部也可定义数据的暴露方法

    • export default暴露内部成员
    组件内部
       export default {
          data(){
            return{
                message:"这是组件内部的数据"
            }
         },
         methods:{
                show(){
                 console.log("调用了login.vue中的show 方法")
                }
            }
        }
    

    注意:es6使用 export default 向外暴露成员
    使用import 模块名称 from '模块标识符'引入

        eg:  login.vue 文件内部暴露成员:
            export default {
               data(){
                  return{message:"这是组件内部的数据"}
              }
            }
            在main.js文件里引入:
            import login from './login.vue';
    

    注意:export default 与exports 的区别

    • (1) 一个模块 只能使用一次 export default
    • (2) 一个模块 可以使用多次 exports 这个方法接收暴露的成员。[按需导出]
      需要用 { }接收 这个方式:
      import {login} from './login.vue';
    • (3)exports导出的成员 接收时: 定义的名字与暴露的变量名必须保持一致 ,想要改变名字 可以使用 as起别名
      import {login as Login123} from './login.vue';

    配置完 :此刻的

    • webpack.config.js文件:
    const path = require('path');
    const htmlWebpackPlugin = require('html-webpack-plugin');
    const vueLoaderPlugin= require('vue-loader/lib/plugin');
    module.exports ={
        entry:path.join(__dirname,'./src/main.js'),
        output: {
            path:path.join(__dirname,'./dist'), //指定哪个目录 打包哪个文件
            filename: "bundle.js"  // 指定住处文件名
        },
        devServer: {
            open:true,
            port:8080,
            hot:true
        },
        plugins: [
            new htmlWebpackPlugin({
                template:path.join(__dirname,'./src/index.html'),
                filename: 'index.html'
            }),
            new vueLoaderPlugin()
        ],
        module: {
            rules: [
                //处理css路径的loader
                {test:/\.css$/,use:['style-loader','css-loader']},
                //处理图片路径的loader
                {test:/\.(jpg|png|gif|bmp|jpeg)$/,use:'url-loader?limit=99948&name=[hash:8]-[name].[ext]'},
                //处理字体的loader
                {test:/\.(ttf|eot|svg|woff|woff2)$/,use:'url-loader'},
                //处理vue文件
                {test:/\.vue$/,use:'vue-loader'}
            ]
        },
        resolve: {
            alias:{
                'vue$':"vue/dist/vue.js"
            }
        }
    };
    
    • main.js文件内容:
    import Vue from  'vue';
    // npm install vue-loader vue-template-compiler -D
    import login from './main/login.vue';
    let app = new Vue({
        el:'#app',
        data:{
            message:'这是梦吧'
        },
        //渲染组件
        components:{ login},
        // render:c=>c(login)
    });
    
    • index.html文件内容:
    <body>
    <div id="app">
        <login></login>
    </div>
    </body>
    




    2.webpack中使用vue-router

    步骤:

      1. 引入vue包
      • import Vue from 'vue';
      1. 引入vue-router 包
      • import VueRouter from 'vue-router'
      1. 手动安装VueRouter
      • Vue.use(VueRouter);
    • 4.导入你需要的组件
    • 5.创建路由对象,并挂载到Vue实例上
    let routerObj = new VueRouter({
     routes: [
           { path: '/account', component: account },
           { path: '/goodslist', component: goodslist 
        ]
    }); 
    

    6.引入路由 同级路由
    App.vue文件下两个子级的路由 Account/Goodslist

    • main.js文件内容
    import Vue from 'vue';
    import VueRouter from 'vue-router';
    Vue.use(VueRouter);
    import app from './App.vue';
    import account from './main/Account.vue';
    import goodslist from './main/GoodsList.vue';
    let routerObj = new VueRouter({
        routes: [
            { path: '/account', component: account },
            { path: '/goodslist', component: goodslist }
        ]
    });
    const vm = new Vue({
        el: '#app',
        data: { },
        render: c => c(app),
        // 将路由对象挂载到vm上
        router:routerObj
    });
    
    • App.vue
    <template>
        <div>
            <h1>App组件</h1>
            <router-link to="/account">Account</router-link>
            <router-link to="/goodslist">GoodsList</router-link>
            <router-view></router-view>
        </div>
    </template>
    <script></script>
    <style></style>
    

    效果:

    只有一层路由App->Account/GoodsList



    7. 路由嵌套 children
    在Account 组件下面再创建两个子级路由, App->Account->login/signup

    • 得导入子组件
    • main.js
    import Vue from 'vue';
    import VueRouter from 'vue-router';
    Vue.use(VueRouter);
    import app from './App.vue';
    import account from './main/Account.vue';
    import goodslist from './main/GoodsList.vue';
    
    //导入Account的两个子组件
    import login from './other/login.vue';
    import signup from  './other/signup.vue'
    
    let routerObj = new VueRouter({
        routes: [
            {
                path: '/account',
                component: account,
                children:[
                    {path:'login',component:login},
                    {path:'signup',component:signup},
                ]
            },
            { path: '/goodslist', component: goodslist }
        ]
    });
    
    const vm = new Vue({
        el: '#app',
        data: {},
        render: c => c(app),
        router:routerObj
    });
    
    
    • Account.vue
    <template>
        <div>
            <h2>这是Account组件</h2>
            <hr>
            <router-link to="/account/login">登录</router-link>
            <router-link to="/account/signup">注册</router-link>
            <router-view></router-view>
        </div>
    </template>
    <script></script>
    <style></style>
    
    • 其他文件皆无重要内容:
      • index.html 中无任何东西,因为现在所有的内容展示在App组件的模板中
      • App组件中是 Account/GoodsList 组件的展示
      • Account组件中是 login/signup 组件的展示

    效果:

    两层路由:App->Account->login/signup

    可以在每个.vue文件内部写自己的样式,但是默认全局的也会跟着变,所以可以用scoped来表示私有的属性

    写法:
    <style scoped>
        .div{ }
    </style>
    只在各自的组件中起作用
    


    3.抽离路由模块

    抽离 组件的导入和路由对象 的创建,使项目模块更加清晰

    • 新建文件 router.js

    • main.js的内容

    import Vue from 'vue';
    // 导入vue-router包
    import VueRouter from 'vue-router';
    // 手动安装VueRouter
    Vue.use(VueRouter);
    //导入路由模块
    import routerObj from './router'
    import app from './App.vue';
    
    const vm = new Vue({
        el: '#app',
        data: {},
        render: c => c(app),
        // 将路由对象挂载到vm上
        router:routerObj
    });
    
    • router.js内容:
      别忘了暴露路由对象
    import VueRouter from "vue-router";
    
    //导入组件
    import account from './main/Account.vue';
    import goodslist from './main/GoodsList.vue';
    
    //导入Account的两个子组件
    import login from './other/login.vue';
    import signup from  './other/signup.vue'
    
    // 创建路由对象
    let routerObj = new VueRouter({
        routes: [
            {
                path: '/account',
                component: account,
                children:[
                    {path:'login',component:login},
                    {path:'signup',component:signup},
                ]
            },
            { path: '/goodslist', component: goodslist }
        ]
    });
    //暴露路由对象
    export default routerObj;
    

    最后展示下 项目目录:


    总目录 同webpack 展开,内容都在src目录下

    今天的学习到此结束
    也就结束了webpack配合vue的简单学习。

    最近很累,但是不能放弃啊,不然以后拿什么赚钱给自己买零食吃啊(悲伤)

    相关文章

      网友评论

        本文标题:webpack+vue的基本配置(组件和路由)

        本文链接:https://www.haomeiwen.com/subject/erufjctx.html