详解vue-cli + webpack 多页面实例应用


Posted in Javascript onApril 25, 2017

关于vue.js

vue.js是一套构建用户界面的 轻型的渐进式前端框架。它的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。使用vue可以给你的开发带来极致的编程体验。

关于vue-cli

Vue-cli是vue官方提供的一个命令行工具(vue-cli),可用于快速搭建大型单页应用。该工具提供开箱即用的构建工具配置,带来现代化的前端开发流程。只需一分钟即可启动带热重载、保存时静态检查以及可用于生产环境的构建配置的项目。

疑问

vue-cli主要是用于构建单页应用的脚手架,但是现实项目中,大部分项目都是多页的,怎么样可以很好的利用这一套官方配置呢?我在网上找了一下, 几乎找不到vue多页应用实例,所以才有基于vue-cli生成的单页应用进行改造。

代码地址:

Github:https://github.com/breezefeng/vue-cli-multipage

使用方法

# install dependencies
npm install

# serve with hot reload at localhost:8080/module/index.html
npm run dev

# build for production with minification
npm run build

目录结构

vue-cli-multipage
 |---build
 |---config
 |---src
  |---assets
   |---img 图片文件
   |---css 样式文件
   |---font 字体文件   
  |---components 组件
   |---Button.vue 按钮组件
   |---Hello.vue
  |---module
   |---index 首页模块
    |---index.html
    |---index.js
    |---App.vue
   |---detail 详情页模块
    |---detail.html
    |---detail.js
    |---App.vue

从目录结构上,各种组件、页面模块、资源等都按类新建了文件夹,方便我们储存文件。

其实我们所有的文件,最主要都是放在module文件夹里,以文件夹名为html的名称。

例如:

|---index 首页模块
 |---index.html
 |---index.js
 |---App.vue

此时我们访问的链接是:http://localhost:8080/module/index.html

这里一定要注意,在module里下级文件夹里需要将html,js,vue template 都统一放在当前文件夹里,当然你也可以继续放其他的资源,例如css、图片、组件等,webpack会打包到当前页面里。

如果项目不需要这个页面了,可以把这个文件夹直接删除掉,干净利落,干活也开心。

像以前传统的开发项目,所有的图片都习惯放在images里,当项目有改动时,有些图片等资源用不上了,但还占着坑位,导致项目越来越大,虽然现在的硬件容量大到惊人,但我们应该还是要养到一个良好的习惯。

组件的使用

组件(Component)是 vue.js 最强大的功能之一,当你发现使用组件可以减少造轮子里,你会深深的爱上它。

我们的组件都是放在components目录下的,调用组件的方法也很简单。

import Hello from 'components/Hello'

然后记得在*.vue注册导入的组件,要不然会无法使用。

import Hello from 'components/Hello'

export default {
 name: 'app',
 components: {
  //在这里注册组件,不然无法使用
  Hello
 }
}

构建代码说明

那我们使用的是vue-cli的手脚架,用过vue-cli的同学都知道构建代码是放在根目录build下,vue多页面主要修改了这三个JS文件:webpack.base.conf.js、webpack.dev.conf.js、webpack.prod.conf.js。

/**
**  [webpack.base.conf.js]这里主要列出相关代码的修改点,具体代码请看build/webpack.base.conf.js
*/
var entries = getEntry('./src/module/**/*.js'); // 获得入口js文件

module.exports = {
 entry: entries,
 ....
}

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;
}
/**
**  [webpack.prod.conf.js]这里主要列出相关代码的修改点,具体代码请看build/webpack.base.prod.js
*/
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;
}

var pages = getEntry('./src/module/**/*.html');

for (var pathname in pages) {
 // 配置生成的html文件,定义路径等
 var conf = {
  filename: pathname + '.html',
  template: pages[pathname],  // 模板路径
  inject: true,       // js插入位置
  minify: {
   //removeComments: true,
   //collapseWhitespace: true,
   //removeAttributeQuotes: true
  },
  // necessary to consistently work with multiple chunks via CommonsChunkPlugin
  chunksSortMode: 'dependency'
 };

 if (pathname in module.exports.entry) {
  conf.chunks = ['manifest', 'vendor', pathname];
  conf.hash = true;
 }

 module.exports.plugins.push(new HtmlWebpackPlugin(conf));
}

修改的代码不是很多,但是却为多页应用提供了强大的构建支持。以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
将HTML自动转为JS代码
Jun 26 Javascript
在JavaScript的正则表达式中使用exec()方法
Jun 16 Javascript
JavaScript兼容性总结之获取非行间样式案例
Aug 07 Javascript
微信小程序 toast 详解及实例代码
Nov 09 Javascript
JavaScript脚本语言是什么_动力节点Java学院整理
Jun 26 Javascript
JavaScript定义函数_动力节点Java学院整理
Jun 27 Javascript
hammer.js实现图片手势放大效果
Aug 29 Javascript
JS+jQuery实现注册信息的验证功能
Sep 26 jQuery
浏览器调试动态js脚本的方法(图解)
Jan 19 Javascript
代码整洁之道(重构)
Oct 25 Javascript
如何解决js函数防抖、节流出现的问题
Jun 17 Javascript
对vuex中store和$store的区别说明
Jul 24 Javascript
基于Vue实现timepicker
Apr 25 #Javascript
VueJS如何引入css或者less文件的一些坑
Apr 25 #Javascript
详解Angular 4.x 动态创建组件
Apr 25 #Javascript
Angular 4.x中表单Reactive Forms详解
Apr 25 #Javascript
Angular 4.x 动态创建表单实例
Apr 25 #Javascript
AngularJS动态菜单操作指令
Apr 25 #Javascript
Angular.js 4.x中表单Template-Driven Forms详解
Apr 25 #Javascript
You might like
第一个无线电台是由谁发明的
2021/03/01 无线电
[转帖]PHP世纪万年历
2006/12/06 PHP
PHP基于ORM方式操作MySQL数据库实例
2017/06/21 PHP
Nigma vs Alliance BO5 第一场2.14
2021/03/10 DOTA
js 数组克隆方法 小结
2010/03/20 Javascript
关于javascript DOM事件模型的两件事
2010/07/22 Javascript
基于JQuery的多标签实现代码
2012/09/19 Javascript
jquery入门—数据删除与隔行变色以及图片预览
2013/01/07 Javascript
Javascript学习笔记之 函数篇(二) : this 的工作机制
2014/06/24 Javascript
用js判断是否为360浏览器的实现代码
2015/01/15 Javascript
jquery获取img的src值的简单实例
2016/05/17 Javascript
JS实现对中文字符串进行utf-8的Base64编码的方法(使其与Java编码相同)
2016/06/21 Javascript
COM组件中调用JavaScript函数详解及实例
2017/02/23 Javascript
easyui combogrid实现本地模糊搜索过滤多列
2017/05/13 Javascript
实现Vue的markdown文档可以在线运行的方法示例
2018/12/11 Javascript
详解jQuery-each()方法
2019/03/13 jQuery
Electron-vue开发的客户端支付收款工具的实现
2019/05/24 Javascript
利用d3.js制作连线动画图与编辑器的方法实例
2019/09/05 Javascript
JavaScript实现滑动门效果
2020/01/18 Javascript
vue+koa2搭建mock数据环境的详细教程
2020/05/18 Javascript
[01:11:46]DOTA2-DPC中国联赛 正赛 iG vs Magma BO3 第一场 2月23日
2021/03/11 DOTA
Python中optionParser模块的使用方法实例教程
2014/08/29 Python
Python字符编码判断方法分析
2016/07/01 Python
python 实现矩阵上下/左右翻转,转置的示例
2019/01/23 Python
python实现DEM数据的阴影生成的方法
2019/07/23 Python
Python3.6+selenium2.53.6自动化测试_读取excel文件的方法
2019/09/06 Python
Keds加拿大官网:购买帆布运动鞋和皮鞋
2019/09/26 全球购物
奢华时尚的创新平台:Baltini
2020/10/03 全球购物
Linux常见面试题
2016/10/04 面试题
接待员岗位责任制
2014/02/10 职场文书
2014年毕业演讲稿范文
2014/05/13 职场文书
司法助理专业自荐书
2014/06/13 职场文书
村委会贫困证明范本
2014/09/17 职场文书
房屋租赁协议书(标准版)
2014/10/02 职场文书
7个关于Python的经典基础案例
2021/11/07 Python
uniapp 微信小程序 自定义tabBar 导航
2022/04/22 Javascript