目前使用vue来作项目,估计大部分都是单页面(SPA)应用,一个轻型的 MVVM 框架,谁用了MVVM框架,就再也回不去JQ时代了,哈哈。javascript
在手机端的项目,使用vue + vue-router是high到爆,不只仅是咱们开发的而言,最主要的用户体检也是开足马力,体检感杠杠的。css
那问题来了,使用vue+webpack的单页面是爽到爆,那若是是多页面也能不能high到爆呢?那固然呀,必须的必,vue、webpack的忠粉(哈哈,好像这忠粉不关系到多页面的)。html
在谷歌找vue 多页面,实例仍是比较少,功夫不负有心人,在yaoyao1987那找到了,具体能够到这个yaoyao1987 github,很是感谢yaoyao1987童鞋,今天要讲的内容是基于yaoyao1987童鞋的多页面实例上再优化的。vue
一、demo:http://v.lanchenglv.com/demo/...
二、github:https://github.com/bluefox168...java
咱们先来说讲,具体咱们优化了什么内容。webpack
增长全局统一使用的模块Lib.js
库,可能这里看不明白,没关系,后面会讲到。git
支持字体图标github
增长干净的页面、组件的模板,复制便可以使用。web
去掉多余的代码注释,坑了个人注释,别再坑人了vue-router
构建时,增长对css打包的支持
提取公共模块
........
# 安装 npm install # 调试环境 serve with hot reload at http://localhost:8083/module/login.html npm run dev # 生产环境 build for production with minification npm run build
本地默认访问端口为8083,须要更改的童鞋请到项目根目录文件config.js
修改。
webpack |---build |---src |---assets 资源 |---css.css css |---img 图片文件 |---font/ 字体图标 |---components 组件 |---Button.vue 按钮组件 |---module-head.vue head组件 |---module各个页面模块 |---login 登录模块 |---login.html |---login.js |---app.vue |---welcome 欢迎页模块 |---welcome.html |---welcome.js |---app.vue
从目录结构上,各类组件、页面模块、资源等都按类新建了文件夹,方便咱们储存文件。
其实咱们全部的文件,最主要都是放在module
文件夹里,以文件夹名为html的名称。
例如
|---login 登录模块 |---login.html |---login.js |---app.vue
就是咱们访问时的地址:
http://localhost:8083/module/login.html
这里必定要记住,在module
里下级文件夹,一个文件夹就是一个html,js
、vue template
都统一放在当前文件夹里,固然你也能够继续放其余的资源,例如css、图片等,webpack会打包到当前页面里。
若是项目不须要这个页面了,能够直接把这个文件夹直接删除掉,干净项目,干活也开心。
像之前咱们传统开发项目,全部的图片都习惯放在images
里,当项目有改动时,有些图片等资源用不上了,但还占着坑位,虽然如今的硬件容量大到惊人,但咱们应该仍是要养到一个良好的习惯。
当前页面的开发在app.vue
里,打开后你就会看到很熟悉的<template>
、<script>
、<style scoped>
了。
咱们作多页面开发,那确定会涉及到全局都能调用的公共库,或者是把别人封装的库也一块儿打包在全局公共模块里。
若是看过源码的童鞋,在*.vue
页面里,我都统一import了一个文件
import Lib from 'assets/Lib.js'
这就是全局统一公共模块,咱们先看看Lib.js
里的代码
# 导入全局的css import 'assets/css.css'; # 导入全局的站点配置文件 import C from 'assets/conf'; # 导入全局的共用事件 import M from 'assets/common'; var Rxports = { M,C }; module.exports = Rxports
在上方代码的M
、C
都是什么鬼,聪明的小伙伴就知道我想干吗了,省写少事呗。
例如咱们如今想调用APP的名称,在.vue
里能够这么写
import Lib from 'assets/Lib.js' Lib.C.appname; # 蓝锅锅
只须要在*.vue
里导入import Lib from 'assets/Lib.js'
,就能够处处使用全局模块了。
再也不像传统的开发模式,须要一堆的<script>
一个一个的来放到页面的底部。
传统方式:
<script type='text/javascript' src='//g.alicdn.com/sj/lib/zepto/zepto.min.js' charset='utf-8'></script> ></script> <script type='text/javascript' src='//g.alicdn.com/msui/sm/0.6.2/js/sm.min.js' charset='utf-8'></script> <script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
这里就是我想讲的关于优化的第一点提到的全局模块库。
固然也有童鞋问呀,会不会每一个页面都会把这些全局模块库都打包在当前页面,那JS文件体积大到惊人。
哎呀,你当webpack
是二货的呀,webpack
会自动帮你处理好的,会把在*.vue
里的import Lib from 'assets/Lib.js'
的库自动提取出来,放到一个全局的JS文件里,这就是自动构造的神奇呀,省心省电,妈妈不再用担忧我作重复的工做了。
在Lib.js
里,咱们也看到有两个导入的JS文件,主要来作什么的呢?
为了更好的在全局调用模块里,知道哪一个模块的做用是什么,另外在写代码时更能快速查找到JS文件,我区分了配置文件和共用事件文件,即conf
、common
,下面说下具体的用途。
# 储存站点的配置,例如web的名称、LOGO地址等 import C from 'assets/conf'; # 导入全局的共用事件,例如在微信的JS SDK初始化,每一个页面都要分享,都须要初始化的,一次调用,全局使用,棒!! import M from 'assets/common';
固然,你也能够不像这样区分不一样的JS文件,删除也没有影响的,具体也要看项目的须要而定,不能死读书。
另外,若是想要干净的页面模块模板,能够到根目录的tpl
里复制module_tpl
整个文件夹,而后粘贴到src/module
目录下立刻就能够进行开发了,开发以前记得在cmd
里npm run dev
跑一遍,新增页面都要从新dev
一遍。
module
咱们就讲到这里,下面咱们来说讲组件的调用,最爱组件了。
组件(Component)是 vue.js 最强大的功能之一,当你发现使用组件能够减小造轮子里,你会深深的爱上它。
咱们的组件都是放在components
目录下的,调用组件的方法也很简单。
import Button from 'components/Button';
而后记得在*.vue
注册导入的组件,要否则会影响使用。
import Button from 'components/Button'; export default { data() { return { } }, components: { # 在这里注册组件,不注册组件的话,是没法使用的。 Button } }
若是想要干净的组件模板,能够到根目录的tpl
里找到components_tpl
的Hello.vue
文件,复制粘贴到components
目录下立刻就能够进行开发了。
在yaoyao1987童鞋里,是没有打包构造图标字体的代码逻辑,这也是我优化上去的一部分,建议使用iconfont
图标(http://www.iconfont.cn) ,强大到无所不能,能够到iconfont
下载本身想要的图标字体,记得是把文件放到\src\assets\font
文件夹里。
webpack
会自动打包的,无需理会,另外还有一点,iconfont
提供的css文件,复制到\src\assets\css.css
文件便可,要否则没有效果哈。
在*.vue
里使用调用就好了。
<i class="iconfont">!</i>
那咱们使用的是vue-cli的手脚架,用过vue+cli
的朋友知道主要构建代码都放在根目录build
下,vue多页面主要修改了这三个JS文件webpack.base.conf.js
、webpack.dev.conf.js
、webpack.prod.conf.js
# 【webpack.base.conf.js】主要是构建的全局设置,主要是增长了如下代码,已经增长在JS文件里,这里只是作一个补充说明,具体请看`build/webpack.base.conf.js`。 var entries = getEntry('./src/module/**/*.js'); // 得到入口js文件 var chunks = Object.keys(entries); plugins: [ // 提取公共模块 new webpack.optimize.CommonsChunkPlugin({ name: 'vendors', // 公共模块的名称 chunks: chunks, // chunks是须要提取的模块 minChunks: chunks.length }), // 配置提取出的样式文件 new ExtractTextPlugin('css/[name].css') ] function getEntry(globPath) { var entries = {}, basename, tmp, pathname; glob.sync(globPath).forEach(function (entry) { basename = path.basename(entry, path.extname(entry)); tmp = entry.split('/').splice(-3); pathname = tmp.splice(0, 1) + '/' + basename; // 正确输出js和html的路径 entries[pathname] = entry; }); return entries; }
这里还要作一个特别说明,咱们每次更新资源文件,为了去缓存,都会给文件生成hash
值,例如:
<script type='text/javascript' src='vendors.61714a310523a3df9869.js' charset='utf-8'></script> <script type='text/javascript' src='vendors.js?f3aaf25de220e214f84e' charset='utf-8'></script>
这二者都是为了去缓存,惟一的区别的生成的文件名不同,有些项目,为了能够能出严重BUG时第一时间回滚,以文件名
+hash
的方式储存,每次生成都不会覆盖以前的代码,以方便查BUG或者回滚。
另外一种方式,就是以文件名
+?hash
的方式储存,每次都会覆盖以前生成的资源,方便在某些特殊项目使用。
我在webpack.base.conf.js
也已经注释说明了。
module.exports = { entry: entries, output: { path: config.build.assetsRoot, publicPath: config.build.assetsPublicPath, /* ---- 生成的例子 vendors.61714a310523a3df9869.js --- */ //filename: '[name].[hash].js' /* ---- 生成的例子 vendors.js?f3aaf25de220e214f84e --- */ filename: '[name].js' } }
不知不觉时间又过去,啰嗦一堆堆的,每一个项目需求都不同,配置也会有许不一样,也但愿更多的朋友分享本身的代码和想法出来哈,也能够一块儿交流。
有须要一块儿交流的能够加个人微信,amwhuang
,记得备注技术交流
哈。
首发博客地址:http://lanchenglv.com/article...