本篇文章主要是我在开发前研究了webpack+vue.js的单页面应用,因为需要用到node的npm,所以确保安装了node,建议官网安装最新的稳定版本。并且在项目中需要加载一些npm包,由于npm的服务器在国外,可能我们下载的过程会比较慢,所以建议用阿里的镜像cnpm安装,10分钟实时更新一次npm的镜像。具体的下载配置参考阿里的cnpm官网。本文章只是和大家探讨怎么利用webpack配合vue.js做一个单页面应用,具体关于vue里面的内容怎么写并不在本篇文章的介绍范围。

1. 定义我们demo的基本目录

├── README.md
├── index.html // 项目入口文件
├── package.json // 项目配置文件
├── src // 生产目录
│ ├── vue // 组件
│ | ├──home.vue
│ | ├──blog.vue
│ | ├──about.vue
│ | ├──topic.vue
│ ├── components // 各种组件
│ ├── views // css文件
│ ├── scss //scss文件
│ └── main.js // Webpack 预编译入口
└── webpack.js // Webpack 配置文件

2. 配置一下我们的webpack.js文件

在介绍怎么配置之前你需要掌握一个命令 npm install <模块> --save-dev这个命令的意思是这个命名的意思是我们安装了这个包并且把它的基本信息写入目录的package.json文件。还有一个命令是我们直接运行cnpm install会自动下载package.json里面写入的包.

在webpack的配置文件我们需要用到四个npm的模块分别是:pathwebpackextract-text-webpack-plugin,vue-loader记得先下载包在用require命令引入进来

//node的路径模块
var path=require('path');
//我们是webpack当然要引入这个
var webpack = require('webpack');
//这个是构建页面资源的插件
var ExtractTextPlugin = require('extract-text-webpack-plugin');
//因为我们是vue.js的应用,把各个组件当做一个页面.vue后缀,所以引入这个可以编译這些文件
var vue = require("vue-loader");

好了,我们已经把需要的模块引入进来了,接下来我们定义一些接下来要用到的一些文件夹路径

//__dirname是node里面的一个变量,指向的是当前文件夹目录
var ROOT_PATH = path.resolve(__dirname);
//这个我们的文件入口,等下我们就会从main.js这个文件作为入口
var APP_PATH = path.resolve(ROOT_PATH, 'src/main.js');
//这个是文件打包出来的输出路径
var BUILD_PATH = path.resolve(ROOT_PATH, 'build');

基本的文件路径我们已经定义好了,接下来我们要用到extract-text-webpack-plugin这个插件了

var plugins = [
//提公用js到common.js文件中
new webpack.optimize.CommonsChunkPlugin('common.js'),
//将样式统一发布到style.css中
new ExtractTextPlugin("style.css"),
// 使用 ProvidePlugin 加载使用率高的依赖库
new webpack.ProvidePlugin({
$: 'webpack-zepto'
})
];

接下来是webpack的重点了loader,webpack的思想是把每个静态资源文件当做一个模块加载,我们需要做一些配置,在这里我们需要用到编译css,sass模块,多以我们还需要安装'css-loader','style-loader','node-sass','md5'

module.exports = {
//文件的入口,还可以写成多数组的形式,具体自己扩展
entry:[APP_PATH],
//输出
output:{
//输出路径
path: BUILD_PATH,
//打包的js命名
filename:build.js'
// 指向异步加载的路径
publicPath : __dirname + '/build/',
// 非主文件的命名规则,加缓存用到md5
chunkFilename: '[id].build.js?[chunkhash]'
},
module: {
loaders: [
{
test: /\.vue$/,
loader: 'vue',
},
{
test: /\.scss$/,
loader: ExtractTextPlugin.extract("style-loader", 'css-loader')
},
{
test: /\.css$/,
loader: ExtractTextPlugin.extract("style-loader", "css-loader")
},
{
test: /\.(png|jpg)$/,
loader: 'url?limit=40000'
}
]
},
//这个特别说明下,vue提倡把一个组件当做一个页面,所以可能在一个页面写html,style,javascript,也可以引入和写scss文件
vue: {
css: ExtractTextPlugin.extract("css"),
sass: ExtractTextPlugin.extract("css!sass-loader")
},
plugins: plugins
}

3. 配置我们的入口文件main.js

这里我们需要三个npm模块,vue,vue-router,vue-resource三个模块,我们依次安装然后在引入

//vue的应用当然要引,等下要用它来注册
var Vue = require('vue')
//这个是路由,spa应用必要哦
var VueRouter = require('vue-router');
//这个是类似ajax请求,肯定要拉去数据啦,所以也下载吧
var VueResource = require('vue-resource');

在vue里面声明并注册个空组件

Vue.use(VueRouter);
Vue.use(VueResource);
var app = Vue.extend({});

实例化VueRounter

var router = new VueRouter({
// 当hashbang的值为true时,所有的路径都会被格式化已#!开头,
hashbang: true,
history: false,
saveScrollPosition: true,
transitionOnLoad: true
});

接下来写下我们的路由路径,也可以单独把路由写在一个文件,我们这边只是个demo所以写一起了,不打紧,关于这块路由的写法可以具体参考下vue-router的文档http://router.vuejs.org/zh-cn...,将的很详细。

这里有必要将一下,webpack提供了异步加载功能,配合vue-router的路由使用,当哪个组件需要渲染是,会加载它依赖的组件,并且异步加载进来。是不是很棒。

router.map({
'/':{ //首页
component: function (resolve) {
require(['./vue/home.vue'],resolve)
}
},
'/home':{
name : 'home', //首页
component: function (resolve) {
require(['./vue/home.vue'],resolve)
}
},
'/blog':{
name : 'blog', //博客列表
component: function (resolve) {
require(['./vue/blog.vue'],resolve)
}
},
'/blog/topic':{
name : 'topic',
//文章详情
component: function (resolve) {
require(['./vue/topic.vue'],resolve)
}
},
'/about':{
name : 'about',
//关于
component: function (resolve) {
require(['./vue/about.vue'],resolve)
}
}
})

再加句代码,测试访问路由访问是否成功

router.afterEach(function (transition) {
console.log('成功浏览到: ' + transition.to.path)
})

最后我们注册下vue

router.start(app, "#app");

4. 填充下index.html文件的结构

<router-view> 用于渲染匹配的组件,它基于 Vue 的动态组件系统。我们的index.html结构是这样子的

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>个人站</title>
<link rel="stylesheet" href="./build/style.css">
</head>
<body>
<div id="app">
<router-view></router-view>
</div>
<script src="./build/common.js"></script>
<script src="./build/build.js"></script>
</body>
</html>

5. 怎么写一个组件

关于组件,vue提倡一个模块写一个具体的组件比如列表组件可以list.vue,然后根据路由加载具体的组件,组件之间也可以相互的引用,具体参考vue文档。

为了方便我们测试,我们以home为例,其他组件也类似,方便等下测试,等项目能完整跑起来你在自己去添加组件里面的内容。

<template>
<div>home</div>
</template>
<script>
// js
</script>
<style>
/*style*/
</style>

6. 运行webpack

关于一个单页面的大体的框架我们已经搭建好了,现在直接运行webpack就能把文件载出来了。然后打开index.html直接测试就好了。更详细的demo已经提交到github上了 demo,还有本人使用webpack+vue+es6+sass的技术栈重构的Cnode中文网单页面应用,感兴趣的可以围观下,欢迎star。

7.开发模式

在实际开发过程中我们肯定不是每一次修改保存,然后在运行一下webpack命令,那样就太麻烦了,所以我们用到了热替换,webpack-dev-server这个包,安装好这个包后在pack.json加上

"scripts": {
"start": "webpack-dev-server --hot --inline"
}

并且把webpack.config.js这前我们配置好的

// 指向异步加载的路径
publicPath : __dirname + '/build/';

替换为

// 指向异步加载的路径
publicPath : '/build/';

为什么这样做呢?因为我们这前用webpack是把组件异步加载在本地上,而我们用了热替换后是地址委托到了http://localhost:8080/端口了,所以要去掉__dirname(指向本地根目录),一切准备完毕了,接下来直接运行npm start,然后打开http://localhost:8080/就可以访问,试着修改内容保存可以看看页面实时的在刷新,是不是省了很多的开发时间呢!

关于vue-cli

vue.js的原作者为了方便我们做项目前期花费时间配置這些自动化构建工具,出了一个vue-cli的脚手架,可以自动生成项目的一系列基本配置。vue-cli的github地址为https://github.com/vuejs/vue-cli,感兴趣的童鞋可以去了解下。

webpack配合vue.js实现完整的单页面demo的更多相关文章

  1. 基于webpack和vue.js搭建开发环境

    前言 在对着产品高举中指怒发心中之愤后,真正能够解决问题的是自身上的改变,有句话说的好:你虽然改变不了全世界,但是你有机会改变你自己.秉承着“不听老人言,吃亏在眼前”的优良作风,我还是决定玩火自焚. ...

  2. 关于vue.js element ui 表单验证 this.$refs[formName].validate()的问题

        方法使用前需了解: 来自”和“小编的小提示: 首先打印一下this.$refs[formName],检查是否拿到了正确的需要验证的form. 其次在拿到了正确的form后,检查该form上添加 ...

  3. Vue项目中设置每个单页面的标题

    两种实现方法,第一种方法引入插件,第二种为编程方式实现(推荐) 首先在路由文件index.js中给每个单页面路由添加title routes: [{     path: '/',     name: ...

  4. 基于laravel5.4 vue 和vue-element搭建的单页面后台CMS

    介绍 该项目后台是基于vue和laravel搭建的单页面CMS系统,包含了文章管理,权限管理,用户管理等基本模块. 前台使用了传统web技术,laravel渲染搭建了个博客系统 github地址:ht ...

  5. 每天记录一点:NetCore获得配置文件 appsettings.json vue-router页面传值及接收值 详解webpack + vue + node 打造单页面(入门篇) 30分钟手把手教你学webpack实战 vue.js+webpack模块管理及组件开发

    每天记录一点:NetCore获得配置文件 appsettings.json   用NetCore做项目如果用EF  ORM在网上有很多的配置连接字符串,读取以及使用方法 由于很多朋友用的其他ORM如S ...

  6. 使用Webpack加速Vue.js应用的4种方式

    Webpack是开发Vue.js单页应用程序的重要工具. 通过管理复杂的构建步骤,你可以更轻松地开发工作流程,并优化应用程序的大小和性能. 其中介绍下面四种方式: 单个文件组件 优化Vue构建 浏览器 ...

  7. Vue - 使用命令行搭建单页面应用

    使用命令行搭建单页面应用 我们来看一下最后完成的效果: 大纲 1. 下载 node, git, npm 2. 使用命令行安装一个项目 一. 下载工具 node , git  的下载大家可以去官网自行下 ...

  8. 052——VUE中使用vue-cli初始化单页面应用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. Vue --6 router进阶、单页面应用(SPA)带来的问题

    一.Vue-router进阶 回顾学过的vue-router,并参考官方文档学习嵌套路由等路由相关知识. 二.单页面应用(SPA)带来的问题 1.虽然单页面应用有优点,但是,如果后端不做服务器渲染(h ...

随机推荐

  1. CLR via C# - CLR模型

    博客园对markdown支持不佳,错乱移步Github IO 博文 CLR 的执行模型 模块/程序集 1.模块 托管模块组成部分 PE32/PE32+头 : PE即Portable Executabl ...

  2. CLR via C# - GC

    //像背书一样,记录下吧 1.CLR分配资源 托管堆上维护着一个指针NextObjPtr.该指针表示下一个新建对象在托管堆上的位置.C#的new Object会产生IL newobj指令,NextOb ...

  3. java学习——abstract 和 final

    当多个类中出现相同功能,但是功能主题不同,这时可以进行向上抽取.这时只抽取功能定义,而不抽取功能主体. 抽象:看不懂.1, 抽象方法一定定义在抽象类中.2, 抽象方法和抽象类都必须被abstract关 ...

  4. I/O多路复用之select

    1.什么是I/O多路复用 关于什么是I/O多路复用,在知乎上有个很好的回答,可以参考罗志宇前辈的回答. 这里记录一下自己的理解.我认为要理解这个术语得从两方面去出发,一是:多路是个什么概念?二是:复用 ...

  5. Python中的Copy和Deepcopy

    一,Python的对象: Python存在大量的对象,我们一般提到的对象都是C中的结构体在堆中申请的一块内存(以CPython为例),每一个对象都有ID,可以通过ID(Object)获得.对象的范围包 ...

  6. self和this的不同

    在Java和C++中,this总是指的是当前实例地址,而在静态方法也就是类方法中,是不可以使用this的.在Objectvie-C中,self是既可以出现在实例方法中,也可以出现在类方法中,并且在不同 ...

  7. NET Core的知识

    NET Core的基础知识补遗 阅读目录 前言 在.NET Core之前 在.NET Core起步 .NET Core 1.0 .NET平台 开发环境 FAQ 写在最后 回到目录 前言 .NET Co ...

  8. jQuery之事件

    (一).事件列表. 1.blur() 当失去焦点时触发.包括鼠标点击离开和TAB键离开. 2.change() 当元素获取焦点后,值改变失去焦点事触发. 3.click() 当鼠标单击时触发. 4.d ...

  9. javascript之url转义escape()、encodeURI()和decodeURI()

    我们可以知道:escape()除了 ASCII 字母.数字和特定的符号外,对传进来的字符串全部进行转义编码,因此如果想对URL编码,最好不要使用此方法.而encodeURI() 用于编码整个URI,因 ...

  10. HttpApplication实战大文件上传 (第四篇)

    一.Asp.net中的文件上传 在Asp.net 1.1中,文件在上传过程中将被全部保存在内存中,对于大文件来说,会造成内存空间的过度使用,可能会招致恶意攻击.为了解决这个问题,Asp.net在配置文 ...