webpack+vue.js实现组件化详解


Posted in Javascript onOctober 12, 2016

简介

在vue中实现组件化用到了vue特有的文件格式.vue,在每一个.vue文件就是一个组件,在组件中我们将html,css,js全部写入,然后在webpack中配置vue-loader就可以了。

建立vue组件

在src目录下建立components文件夹,并在其中建立app.vue文件,这样我们项目的目录结构如下:

|--dist    //webpack打包后生成的文件夹
| |--build.js
|--node_modules  //项目的依赖所在的文件夹
|--src    //文件入口
| |--components //组件存放文件夹
|  |--app.vue //组件
| |--main.js  //主js文件
|--index.html  //主html文件
|--package.json
|--webpack.config.js //webpack配置文件

首先在index.hmtl中写入代码:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Vue example</title>
</head>
<body>
 <app></app>
 <script src="dist/build.js"></script>
</body>
</html>

在编辑器中打开app.vue文件,写入如下代码:

<template>
<div class="message">{{msg}}</div> 
</template>
<script>
export default {
 data () {
 return {
  msg: 'Hello from vue-loader'
 }
 }
}
</script>
<style>
.message{
 color:red;
 font-size:36px;
 font-weight:blod;
}
</style>

在main.js中写入:

import Vue from 'vue'
import App from './components/app.vue'
new Vue({
 el: 'body',
 components:{App}
});

这样运行命令webpack就可以看到效果了

这里用到了ES6的模块儿—importexport

export命令

export命令用于规定模块的对外接口。一个模块就是一个独立文件。该文件内的所有变量外部都无法获取。如果希望外部能够读取模块内部的某个变量,就必须使用export关键字对外暴露出该变量。例如:

//export.js
export var firstName = 'Michael';
export var lastName = 'Jackson';
export var year = 1958;

这样就可以对外输出三个变量。

import命令

使用export对外暴露了接口后,其他js文件通过import命令加载这个模块文件。上面暴露的三个变量在另一个js文件中引入如下:

//import.js
import {firstName,lastName,year} from './export';
function setName(element){
 element.textContent = firstName + ' ' + lastName;
}

webpack的hot-reload

前端自动刷新现在已经很常见了,即改变页面后,浏览器自动刷新,但是这个功能在我们做单页面应用时候会很不好用,所以,webpack支持hot-reload(热替换),当我们修改模块时候不会页面不会刷新,会直接在页面中生效。

hot-reload的基础—webpack-dev-server

webpack-dev-server支持两种模式的自动刷新页面:

     iframe模式(页面嵌入一个iframe并在其中呈现页面的变化)

     inline模式(一个小型的webpack-dev-server客户端会作为入口文件打包,这个客户端会在后端代码改变的时候刷新页面)

iframe模式

使用iframe模式无需额外的配置,在dos下输入命令

$ webpack-dev-server

在浏览器中输入 http://loacalhost:8080/webpack-dev-server/index.html

inline模式

在dos下输入命令

$ webpack-dev-server --inline --hot

启动服务器,在浏览器中打开 http://loacalhost:8080 就可以看到我们的页面,此时修改app.vue中的css,以及html中的文字,都可以看到在浏览器中立马呈现。

关于webpack-dev-server的详细说明,可以参考官方文档或者博客WEBPACK DEV SERVER。

这里有一个问题需要说明下

在很多文章中都说,修改app.vue文件中script标签中的msg文字,会在浏览器中立即呈现效果,但是事实上我在做demo的时候并没有出现这个效果,Google了很多,找到了答案,尤大说:“data是初始值,但热更新的时候会保留当前状态”。

至此,关于webpack+vue的基本结束,虽然简单,但是由于在这个过程中也遇到一些坑,所以总结下,关于对vue的研究,这才只是个开始…

附:

我的webpack配置文件:

var path = require('path');
module.exports = {
 entry: './src/main.js',
 output: {
 path: './dist',
 publicPath:'dist/',
 filename: 'build.js'
 },
 //配置自动刷新,如果打开会使浏览器刷新而不是热替换
 /*devServer: {
 historyApiFallback: true,
 hot: false,
 inline: true,
 grogress: true
 },*/
 module: {
 loaders: [
  //转化ES6语法
  {
  test: /\.js$/,
  loader: 'babel',
  exclude: /node_modules/
  },
  //解析.vue文件
  {
  test:/\.vue$/,
  loader:'vue'
  },
  //图片转化,小于8K自动转化为base64的编码
  {
  test: /\.(png|jpg|gif)$/,
  loader:'url-loader?limit=8192'
  }
 ]
 },
 vue:{
 loaders:{
  js:'babel'
 }
 },
 resolve: {
  // require时省略的扩展名,如:require('app') 不需要app.js
  extensions: ['', '.js', '.vue'],
  // 别名,可以直接使用别名来代表设定的路径以及其他
  alias: {
   filter: path.join(__dirname, './src/filters'),
   components: path.join(__dirname, './src/components')
  }
 } 
}

package.json文件:

{
 "name": "webpackvue",
 "version": "1.0.0",
 "description": "",
 "main": "vue.js",
 "scripts": {
 "test": "echo \"Error: no test specified\" && exit 1"
 },
 "author": "",
 "license": "ISC",
 "devDependencies": {
 "babel-core": "^6.9.1",
 "babel-loader": "^6.2.4",
 "babel-plugin-transform-runtime": "^6.9.0",
 "babel-preset-es2015": "^6.9.0",
 "babel-preset-stage-0": "^6.5.0",
 "babel-runtime": "^6.9.2",
 "css-loader": "^0.23.1",
 "file-loader": "^0.8.5",
 "style-loader": "^0.13.1",
 "url-loader": "^0.5.7",
 "vue":"^1.0.24",
 "vue-router":"^0.7.13",
 "vue-hot-reload-api": "^1.3.2",
 "vue-html-loader": "^1.2.2",
 "vue-loader": "^8.5.2",
 "vue-style-loader": "^1.0.0",
 "webpack": "^1.13.1",
 "webpack-dev-server": "^1.14.1",
 "webpack-merge": "^0.13.0"
 }
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
Prototype1.6 JS 官方下载地址
Nov 30 Javascript
jQuery timers计时器简单应用说明
Oct 28 Javascript
js获取url中指定参数值的示例代码
Dec 14 Javascript
返回上一页并自动刷新的JavaScript代码
Feb 19 Javascript
js 判断图片是否加载完以及实现图片的预下载
Aug 14 Javascript
仿淘宝TAB切换搜索框搜索切换的相关内容
Sep 21 Javascript
js操作css属性实现div层展开关闭效果的方法
May 11 Javascript
基于JavaScript实现网页倒计时自动跳转代码
Dec 28 Javascript
微信JSAPI支付操作需要注意的细节
Jan 10 Javascript
vue 点击按钮实现动态挂载子组件的方法
Sep 07 Javascript
微信小程序页面间跳转传参方式总结
Jun 13 Javascript
在vue中使用jsx语法的使用方法
Sep 30 Javascript
微信小程序 加载 app-service.js 错误解决方法
Oct 12 #Javascript
微信js-sdk上传与下载图片接口用法示例
Oct 12 #Javascript
JS禁止查看网页源代码的实现方法
Oct 12 #Javascript
webpack+vue.js快速入门教程
Oct 12 #Javascript
jquery 抽奖小程序实现代码
Oct 12 #Javascript
微信js-sdk地理位置接口用法示例
Oct 12 #Javascript
vue.js表格组件开发的实例详解
Oct 12 #Javascript
You might like
SONY ICF-F10中波修复记
2021/03/02 无线电
PHP写的获取各搜索蜘蛛爬行记录代码
2012/08/21 PHP
新手菜鸟必读:session与cookie的区别
2013/08/22 PHP
php 数组元素快速去重
2017/05/05 PHP
Javascript 继承机制的实现
2009/08/12 Javascript
编写自己的jQuery插件简单实现代码
2011/04/19 Javascript
js获取select标签的值且兼容IE与firefox
2013/12/30 Javascript
JS获取计算机mac地址以及IP的实现方法
2014/01/08 Javascript
js格式化金额可选是否带千分位以及保留精度
2014/01/28 Javascript
JavaScript获取function所有参数名的方法
2015/10/30 Javascript
jQuery实现按钮点击遮罩加载及处理完后恢复的效果
2016/06/07 Javascript
jquery选择器中的空格与大于号&gt;、加号+与波浪号~的区别介绍
2016/06/24 Javascript
jquery ajaxfileupload异步上传插件使用详解
2017/02/08 Javascript
小发现之浅谈location.search与location.hash的问题
2017/06/23 Javascript
jQuery修改DOM结构_动力节点Java学院整理
2017/07/05 jQuery
weui框架实现上传、预览和删除图片功能代码
2017/08/24 Javascript
讲解vue-router之什么是嵌套路由
2018/05/28 Javascript
Nodejs中怎么实现函数的串行执行
2019/03/02 NodeJs
使用layer.msg 时间设置不起作用的解决方法
2019/09/12 Javascript
[01:37]TI4西雅图DOTA2前线报道 VG拿下首胜教练357给出获胜秘诀
2014/07/10 DOTA
[02:36]DOTA2上海特锦赛 回忆电竞生涯的重要瞬间
2016/03/25 DOTA
K-means聚类算法介绍与利用python实现的代码示例
2017/11/13 Python
Python字符串通过'+'和join函数拼接新字符串的性能测试比较
2019/03/05 Python
解决python 文本过滤和清理问题
2019/08/28 Python
在主流系统之上安装Pygame的方法
2020/05/20 Python
CSS3 不定高宽垂直水平居中的几种方式
2020/03/26 HTML / CSS
html5定制表单_动力节点Java学院整理
2017/07/11 HTML / CSS
Mytheresa中国官网:德国时尚奢侈品商城
2017/08/04 全球购物
教育科研先进个人材料
2014/01/26 职场文书
大学新闻系求职信
2014/06/03 职场文书
国家税务局干部作风整顿整改措施
2014/09/18 职场文书
明确岗位职责
2015/02/14 职场文书
班主任班级管理心得体会
2016/01/07 职场文书
教你利用Nginx 服务搭建子域环境提升二维地图加载性能的步骤
2021/09/25 Servers
Qt自定义Plot实现曲线绘制的详细过程
2021/11/02 Python
分享提高 Python 代码的可读性的技巧
2022/03/03 Python