webpack的VUE配置
引入vue.js
-
后续项目中,我们会使用Vuejs进行开发,而且会以特殊的文件来组织vue的组件
- 所以,下面我们来学习一下如何在我们的webpack环境中集成Vuejs
-
现在,我们希望在项目中使用Vuejs,那么必然需要对其有依赖,所以需要先进行安装
- 注:因为我们后续是在实际项目中也会使用vue的,所以并不是开发时依赖
npm install vue --save -
那么,接下来就可以按照我们之前学习的方式来使用Vue了
-
项目中运用代码
- index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"> <h2>{{message}}</h2> </div> </body> <script src="./dist/commen.js"></script> </html>- main.js中增加vue代码
//使用vue进行开发 import Vue from "vue" new Vue({ el:"#app", data:{ message:"Hello webpack" } })
-
打包项目–错误信息
-
修改完成后,重新打包,运行程序:
-
打包过程没有任何错误(因为只是多打包了一个vue的js文件而已)
-
但是运行程序,没有出现想要的效果,而且浏览器中有报错
-
-
这个错误说的是我们使用的是runtime-only版本的Vue,什么意思呢?
-
这里我只说解决方案:Vue不同版本构建,后续我具体讲解runtime-only和runtime-compiler的区别。
- runtime-only 代码中,不可以有任何的template
- runtime-compiler 代码中可以有template,因为有compiler可以用于编译template
-
-
所以我们修改webpack的配置,添加如下内容即可
resolve:{ alias:{ 'vue$':'vue/dist/vue.esm.js' } } -
在此编译,运行成功
el和template区别(一)
-
正常运行之后,我们来考虑另外一个问题:
- 如果我们希望将data中的数据显示在界面中,就必须是修改index.html
- 如果我们后面自定义了组件,也必须修改index.html来使用组件
- 但是html模板在之后的开发中,我并不希望手动的来频繁修改,是否可以做到呢?
-
定义template属性:
- 在前面的Vue实例中,我们定义了el属性,用于和index.html中的#app进行绑定,让Vue实例之后可以管理它其中的内容
- 这里,我们可以将div元素中的{{message}}内容删掉,只保留一个基本的id为div的元素
- 但是如果我依然希望在其中显示{{message}}的内容,应该怎么处理呢?
- 我们可以再定义一个template属性,代码如下:
# 在index.html中将模板内容抽取出来 <div id="app"></div># 使用template进行代码开发 //使用vue进行开发 import Vue from "vue" new Vue({ el:"#app", template:` <div> <h2>{{message}}</h2> <button @click="buttonClick">按钮</button> </div> `, data:{ message:"Hello webpack" }, methods:{ buttonClick(){ alert("点击了按钮") } } })-
效果展示
el和template区别(二)
- 重新打包,运行程序,显示一样的结果和HTML代码结构
- 那么,el和template模板的关系是什么呢?
- 在我们之前的学习中,我们知道el用于指定Vue要管理的DOM,可以帮助解析其中的指令、事件监听等等
- 而如果Vue实例中同时指定了template,那么template模板的内容会替换掉挂载的对应el的模板
- 这样做有什么好处呢?
- 这样做之后我们就不需要在以后的开发中再次操作index.html,只需要在template中写入对应的标签即可
- 但是,书写template模块非常麻烦怎么办呢?
- 没有关系,稍后我们会将template模板中的内容进行抽离。
- 会分成三部分书写:template、script、style,结构变得非常清晰。
Vue组件化开发引入
-
在学习组件化开发的时候,我说过以后的Vue开发过程中,我们都会采用组件化开发的思想
- 那么,在当前项目中,如果我也想采用组件化的形式进行开发,应该怎么做呢?
-
查看下面的代码:
- 当然,我们也可以将下面的代码抽取到一个js文件中,并且导出
# 在APP.js文件中 将VUE代码进行剥离 export default { template:` <div> <h2>{{message}}</h2> <button @click="buttonClick">按钮</button> </div> `, data(){ return { message:"waws" } }, methods:{ buttonClick(){ alert("点击了按钮") } } }# 在main.js中进行引入,完成组件注册,和template中调用 import App from "./vue/app" new Vue({ el:"#app", template:"<App></App>", components:{ App } })-
效果展示
.vue文件封装处理
-
但是一个组件以一个js对象的形式进行组织和使用的时候是非常不方便的
- 一方面编写template模块非常的麻烦
- 另外一方面如果有样式的话,我们写在哪里比较合适呢?
-
现在,我们以一种全新的方式来组织一个vue的组件
-
但是,这个时候这个文件可以被正确的加载吗?
- 必然不可以,这种特殊的文件以及特殊的格式,必须有人帮助我们处理。
- 谁来处理呢?vue-loader以及vue-template-compiler。
-
安装vue-loader和vue-template-compiler
npm install --save-dev vue-loader@13.0.0 vue-template-compiler- 安装过程报错:
-
我们可以更改package.json
- ^13.0.0 安装大于13.0.0的版本
- ~13.0.0
- 当我们修改了package.json之后,我们需要执行一下 npm install 对node的包进行更新
-
-
-
- 安装过程报错:
-
修改webpack.config.js的配置文件:
module: { rules: [ {test:/.vue$/,use:[ "vue-loader" ]} ] } -
编译成功
-
定义.vue文件 将vue代码进行抽离,完整过程
-
index.html
# 只需要定义一个替换元素即可 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"></div> </body> <script src="./dist/commen.js"></script> </html> -
vue/App.vue
# template、style、script的代码完成分离 # 在App中引入Cpn的组件,注意导入实在script中完成的 <template> <div> <h2 class="title">{{message}}</h2> <button @click="buttonClick">按钮</button> <Cpn></Cpn> </div> </template> <script> import Cpn from "./Cpn.vue" export default { name: "App", components:{ Cpn }, data(){ return { message:"waws" } }, methods:{ buttonClick(){ alert("点击了按钮") } } } </script> <style scoped> .title { color:pink; } </style> -
vue/Cpn.vue
<template> <div> <h2>我是Cpn组件的标题</h2> <p>我是Cpn的内容</p> <button @click="btnClick">Cpn按钮</button> <h3>{{name}}</h3> </div> </template> <script> export default { name: "Cpn", data(){ return { name:"waws", } }, methods:{ btnClick(){ console.log("waws就是神"); } } } </script> <style scoped> </style> -
main.js
//使用vue进行组件化开发 import Vue from "vue" import App from "./vue/App.vue" new Vue({ el:"#app", template:"<App></App>", components:{ App } }) -
效果展示:
- 其实在这个部分我们就能感受到vue的组件化的好处,定义一个根组件,再在根组件中注册其他组件,一层一层向下延展,整个Vue的树就出来了
-
在import 进行导入vue包的时候,后缀名不能省略
但是在resolve增加extensions可以将后缀名为数组[".js",".vue",".css"]中的文件名的后缀省略
resolve:{ extensions:[".js",".vue",".css"], alias:{ 'vue$':'vue/dist/vue.esm.js' } }不是重点,了解即可