webpack配置vue(由浅入深,循序渐进)

webpack配置vue

npm时加上-dev,是开发时依赖,运行时依赖就直接–save不加-dev.

npm install vue@2.5.21 --save

–save可以简写-S,一个横杠加大写S

然后在mian.js里引入

//使用vue进行开发
import Vue from 'vue'

const app = new Vue({
  el: '#app',
  data: {
    message: 'hello webpack'
  }
});

然后执行npm run build

会产生报错

在这里插入图片描述

这是因为vue在构建发布版本时,有两个版本

1.runtime-only:

该版本代码里不能有任何template,el里挂载的id组件也会被当成template

el: '#app',
2.runtime-compiler

代码里可以有template,因为有compiler可以编译template

解决办法

在webpack.config.js里配置

/*配置vue发行使用的版本*/
resolve: {
  /*alias:别名*/
   alias: {
    'vue$':'vue/dist/vue.esm.js'
   }
}

意思是:一旦我们在js文件里使用

import Vue from 'vue'

看看‘vue’是否指向其他文件夹,在webpack.config.js离我们配置了

'vue$':'vue/dist/vue.esm.js'

就会在这个路径下找到对应的js,默认使用的vue.runtime.js

再进行 npm run build即可

el与template区别

mian.js里

new Vue({
  el: '#app',
  template: `
    <div>
    <h2>{{message}}</h2>
    <button @click="btnClick">按钮</button>
    <h2>{{name}}</h2>
    </div> `,
  data: {
    message: 'hello webpack',
    name:'lcq'
  },
  methods: {
    btnClick() {
        
    }
  }
});

index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<div id="app">

</div>
<script src="dist/bundle.js"></script>
</body>
</html>

一般开发intex.html文件里我们不会有很多的代码,也不会去随意修改。

我们如果在vue实例里既挂载了‘#app’,又定义了template,会自动将template里的html代码,添加到index.html的app div内

vue的终极方案

直接在vue实例里写模板肯定搞得很杂乱,js代码和html写到了一起

直接将上边的代码格式化

//使用vue进行开发
import Vue from 'vue'

//定义模板对象
const App = {
  template: `
    <div>
    <h2>{{message}}</h2>
    <button @click="btnClick">按钮</button>
    <h2>{{name}}</h2>
    </div> `,
  data() {
    return {
      message: 'hello webpack',
      name: 'lcq'
    };
  },
  methods: {
    btnClick() {
      console.log('我是按钮');
    }
  }
}

new Vue({
  el: '#app',
    //在模板里使用组件标签
  template: '<App></App>',
  comments: {
   //组件名和组件对象名字相同的简写
    App
  }
});

这样写豁然开朗有木有,之前我们的模板抽离

<body>
<div id="app">
  <cpn></cpn>
  <cpn2></cpn2>
</div>
<!--2.直接使用template标签-->
<template id="cpn2">
  <div>
    <h2>我是标题2</h2>
    <p>我是内容2</p>
  </div>
</template>

<!--1.抽离模板写法-->
<script type="text/x-template" id="cpn1">
  <div>
    <h2>我是标题</h2>
    <p>我是内容</p>
  </div>
</script>

<script src="../js/vue.js"></script>
<script>
  /*注册一个全局组件*/
  Vue.component('cpn',{
    template: '#cpn1',
  });
  const app = new Vue({
    el: '#app',
    data: {
      message: '你好啊'
    },
    components: {
      cpn2:{
        template: '#cpn2'
      }
    }
  });
</script>
</body>

之前只是将子组件的html部分代码抽离,然后还是在vue实例里注册,写组件方法,现在直接将整个组件全部抽离成单独对象,里边有结构,方法等,然后只用在vue实例里运用同名简写的方式注册子组件,然后将自定义的html标签写到vue实例的template里边,由于同时有el和template,会自动用template里的代码替换到el挂载的div内,结构明了。

注意components别打错了,也就我了。。。

再往下来

这样抽离是比之前清晰了不少,但是,还是很臃肿在入口js里(mian.js),还是有很多代码。

我们为何不再将模块抽离到单独文件呢?于是在src里新建vue文件夹,抽离一个app.js

export default {
  template: `
    <div>
    <h2>{{message}}</h2>
    <button @click="btnClick">按钮</button>
    <h2>{{name}}</h2>
    </div> `,
  data() {
    return {
      message: 'hello webpack',
      name: 'lcq'
    };
  },
  methods: {
    btnClick() {
      console.log('我是按钮');
    }
  }
}

然后直接在mian.js里导入

//使用vue进行开发
import Vue from 'vue'

//导入模板
import App from "./vue/app.js";

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

之前讲过一个js文件里只能有一个export default,然后import导入时,可以自定义名字接受该对象。

这样入口js是否更简便,结构更清晰?

在这里插入图片描述

继续分析

在这个app.js里边有不好的地方,js代码和html代码没有分离,我们不是叫讲,html结构,css样式,js行为,三者分离结构清晰。

引出vue文件原型

<template>
  <div>
    <h2 class="title">{{message}}</h2>
    <button @click="btnClick">按钮</button>
    <h2>{{name}}</h2>
  </div>
</template>

<script>
  export default {
    name: "App",
    data() {
      return {
        message: 'hello webpack',
        name: 'lcq'
      };
    },
    methods: {
      btnClick() {
        console.log('我是按钮');
      }
    }
  }
</script>

<style scoped>
.title{
  color: green;
}
</style>

直接将app.js文件中各部分切割,放到App.vue文件对应的地方,还加了点样式。

然后导入vue文件

import App from "./vue/App.vue";

然后npm run build,然后就报错了

在这里插入图片描述

为啥呢?

因为编译器还不认识.vue后缀的文件

解决它

为他引入vue-loader 和 vue-template-compiler ,前边是加载vue文件,后边是真正编译vue文件,都是开发依赖

npm install vue-loader@13.0.0 vue-template-compiler@2.5.21 --save-dev

引入loader后配置webpack.config.js文件,在rules里

  /*配置vue-loader和vue-template-compiler*/
{
  test: /\.vue$/,
  use: ['vue-loader']

}

然后运行 npm run build 成功

那么如何在App.vue里引用其他vue文件

Cpn.vue里边有一个Cpn组件

<template>
  <div>
    <h2>我是cpn组件的标题</h2>
    <p>我是cpn的内容</p>
    <h2>{{name}}</h2>
  </div>
</template>

<script>
  export default {
    name: "Cpn",
    data() {
      return {
        name: 'cpn组件的name',

      };
    }
  }
</script>

<style scoped>

</style>

我们在App.vue里引入和注册使用

<template>
  <div>
    <h2 class="title">{{message}}</h2>
    <button @click="btnClick">按钮</button>
    <h2>{{name}}</h2>
    <Cpn></Cpn>
  </div>
</template>

<script>
  import Cpn from './Cpn.vue'

  export default {
    name: "App",
    /*注册cpn*/
    components: {
      Cpn
    },
    data() {
      return {
        message: 'hello webpack',
        name: 'lcq'
      };
    },
    methods: {
      btnClick() {
        console.log('我是按钮');
      }
    }
  }
</script>

<style scoped>
  .title {
    color: green;
  }
</style>

然后在mian.js里使用App.vue

//使用vue进行开发
import Vue from 'vue'

//导入模板
/*import App from "./vue/app.js";*/
import App from "./vue/App.vue";

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

});

这样我们index.html文件里就不用设置其他结构,直接在App.vue里开发初始页面,然后再mian.js里引入App.vue组件,组测,在template里使用替换到index.html里。

如果App.vue文件开发中要用到其他组件,同样的方式在App.vue里导入Cpn.vue,然后注册使用,这样就可以形成一个个树桩结构。

如果像偷懒,import导入vue文件或js文件时省略后缀在webpack.config.js里配置

resolve: {
  extension: ['.js','.css','.vue'],
  /*alias:别名*/
  alias: {
    'vue$': 'vue/dist/vue.esm.js'
  }
}

extension里的后缀名都可以省略。

来个完整地webpack.config.js配置

/*导入path模块*/
const path = require('path');

module.exports = {
  /*入口*/
  entry: './src/main.js',
  /*出口*/
  output: {
    /*绝对路径,动态获取,第一个参数获取当前文件所在路径,我们要放到dist文件夹下*/
    path: path.resolve(__dirname, 'dist'),
    filename: 'bundle.js',
    publicPath: 'dist/'
  },
  module: {
    rules: [
      /*配置css*/
      {
        test: /\.css$/,
        /*
        * css-loader只负责css文件加载
        * style-loader负责将样式加到DOM中
        * 使用多个loader,是从右向左读的,先用的要放到右边
        */
        use: ['style-loader', 'css-loader']
      },
      /*对象写法,配置less*/
      {
        test: /\.less$/,
        use: [
          {
            loader: "style-loader" //creates style nodes from JS strings
          }, {
            loader: "css-loader" //translate css into CommonJS
          }, {
            loader: "less-loader" //complies Less to css
            /*还可以有options选项*/
          }
        ]
      },
      /*配置url*/
      {
        test: /\.(png|jpg|gif|jpeg)$/,
        use: [{
          loader: 'url-loader',
          options: {
            //当加载图片,小于limit时,会将图片编译成base64字符串形式
            //当加载图片,大于limit时,会将图片使用file-loader模块加载
            limit: 8192,
            name: 'img/[name].[hash:8].[ext]'
          }

        }]
      },
      /*配置es6转es5*/
      {
        test: /\.js$/,
        /*排除以下文件夹转换*/
        exclude: /(node_modules|bower_components)/,
        use: {
          loader: 'babel-loader',
          options: {

            presets: ['es2015']
          }
        }
      },
        /*配置vue-loader和vue-template-compiler*/
      {
        test: /\.vue$/,
        use: ['vue-loader']

      }
    ]
  },
  /*配置vue发行使用的版本*/
  resolve: {
    extensions: ['.js','.css','.vue'],
    /*alias:别名*/
    alias: {
      'vue$': 'vue/dist/vue.esm.js'
    }
  }
}
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值