详解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 相关文章推荐
use jscript with List Proxy Server Information
Jun 11 Javascript
基于JQuery的类似新浪微博展示信息效果的代码
Jul 23 Javascript
select、radio表单回显功能实现避免使用jquery载入赋值
Jun 08 Javascript
超棒的响应式布局jQuery插件Freetile.js
Nov 17 Javascript
基于jQuery实现的仿百度首页滑动选项卡效果代码
Nov 16 Javascript
javacript获取当前屏幕大小
Jun 04 Javascript
基于jQuery的ajax方法封装
Jul 14 Javascript
JavaScript中windows.open()、windows.close()方法详解
Jul 28 Javascript
vue实现全选、反选功能
Nov 17 Javascript
使用Easyui实现查询条件的后端传递并自动刷新表格的两种方法
Sep 09 Javascript
Vuex实现数据增加和删除功能
Nov 11 Javascript
mpvue实现微信小程序快递单号查询代码
Apr 03 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
php守护进程 加linux命令nohup实现任务每秒执行一次
2011/07/04 PHP
php分页思路以及在ZF中的使用
2012/05/30 PHP
PHP编码转换
2012/11/05 PHP
PHP内核探索:变量存储与类型使用说明
2014/01/30 PHP
php版微信公众号接口实现发红包的方法
2016/10/14 PHP
node.js chat程序如何实现Ajax long-polling长链接刷新模式
2012/03/13 Javascript
浅析jQuery中常用的元素查找方法总结
2013/07/04 Javascript
用jquery等比例控制图片宽高的具体实现
2014/01/28 Javascript
jQuery实现鼠标单击网页文字后在文本框显示的方法
2015/05/06 Javascript
JavaScript常用基础知识强化学习
2015/12/09 Javascript
JS获取时间的相关函数及时间戳与时间日期之间的转换
2016/02/04 Javascript
Angular的模块化(代码分享)
2016/12/26 Javascript
jQuery实现文章图片弹出放大效果
2017/04/06 jQuery
vue的事件绑定与方法详解
2017/08/16 Javascript
详解angularjs实现echart图表效果最简洁教程
2017/11/29 Javascript
微信小程序使用npm支持踩坑
2018/11/07 Javascript
countUp.js实现数字滚动效果
2019/10/18 Javascript
微信小程序实现横向滚动导航栏效果
2019/12/12 Javascript
js实现简单放大镜效果
2020/03/07 Javascript
[53:49]LGD vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Django 路由系统URLconf的使用
2018/10/11 Python
python生成lmdb格式的文件实例
2018/11/08 Python
python引用(import)某个模块提示没找到对应模块的解决方法
2019/01/19 Python
Linux下远程连接Jupyter+pyspark部署教程
2019/06/21 Python
python 通过视频url获取视频的宽高方式
2019/12/10 Python
浅析Python requests 模块
2020/10/09 Python
Django扫码抽奖平台的配置过程详解
2021/01/14 Python
Expedia泰国:预订机票、酒店和旅游包(航班+酒店)
2016/09/27 全球购物
高清安全摄像头系统:Lorex Technology
2018/07/20 全球购物
介绍一下Java中的Class类
2015/04/10 面试题
吃空饷专项治理工作实施方案
2014/03/04 职场文书
平面设计专业大学生职业规划书
2014/03/12 职场文书
2014年学校法制宣传日活动总结
2014/11/01 职场文书
2015元旦文艺汇演主持稿(开场白+结束语)
2014/12/14 职场文书
大明湖导游词
2015/02/03 职场文书
2016年大学生寒假社会实践心得体会
2015/10/09 职场文书