详解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 相关文章推荐
js trim函数 去空格函数与正则集锦
Nov 20 Javascript
jQuery的运行机制和设计理念分析
Apr 05 Javascript
js不完美解决click和dblclick事件冲突问题
Jul 16 Javascript
js实现右下角可关闭最小化div(可用于展示推荐内容)
Jun 24 Javascript
js实现点小图看大图效果的思路及示例代码
Oct 28 Javascript
JS实现倒计时和文字滚动的效果实例
Oct 29 Javascript
node.js中的fs.lchownSync方法使用说明
Dec 16 Javascript
JS+CSS实现带关闭按钮DIV弹出窗口的方法
Feb 27 Javascript
jquery判断至少有一个checkbox被选中的方法
Jun 05 Javascript
浅谈Vue路由快照实现思路及其问题
Jun 07 Javascript
vue搜索和vue模糊搜索代码实例
May 07 Javascript
Node.js 多进程处理CPU密集任务的实现
May 26 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中的HashTable结构详解
2013/06/13 PHP
php通过字符串调用函数示例
2014/03/02 PHP
在CentOS上搭建LAMP+vsftpd环境的简单指南
2015/08/01 PHP
php处理静态页面:页面设置缓存时间实例
2017/06/22 PHP
PHP通过get方法获得form表单数据方法总结
2018/09/12 PHP
详解CSS样式中的 !important * _ 符号
2021/03/09 HTML / CSS
使用EXT实现无刷新动态调用股票信息
2008/11/01 Javascript
在网页里看flash的trace数据的js类
2009/01/10 Javascript
基于jQuery的Spin Button自定义文本框数值自增或自减
2010/07/17 Javascript
JS函数验证总结(方便js客户端输入验证)
2010/10/29 Javascript
TinyMCE 新增本地图片上传功能
2010/11/05 Javascript
jQuery原生的动画效果
2015/07/10 Javascript
JavaScript实现的类字典插入或更新方法实例
2015/07/10 Javascript
jquery+css实现动感的图片切换效果
2015/11/25 Javascript
关于Bootstrap弹出框无法调用问题的解决办法
2016/03/10 Javascript
基于jQuery实现歌词滚动版音乐播放器的代码
2016/09/17 Javascript
jQuery自动或手动图片切换效果
2017/10/11 jQuery
JS组件系列之Gojs组件 前端图形化插件之利器
2017/11/29 Javascript
node.js连接mysql与基本用法示例
2019/01/05 Javascript
Vue自定义属性实例分析
2019/02/23 Javascript
简单了解Ajax表单序列化的实现方法
2019/06/14 Javascript
微信小程序使用蓝牙小插件
2019/09/23 Javascript
Python编写屏幕截图程序方法
2015/02/18 Python
Python常用的爬虫技巧总结
2016/03/28 Python
python中星号变量的几种特殊用法
2016/09/07 Python
Python网络爬虫项目:内容提取器的定义
2016/10/25 Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
2019/09/05 Python
python 的 openpyxl模块 读取 Excel文件的方法
2019/09/09 Python
python 读写文件包含多种编码格式的解决方式
2019/12/20 Python
Mac中PyCharm配置Anaconda环境的方法
2020/03/04 Python
中科前程Java笔试题
2016/11/20 面试题
争论的故事教学反思
2014/02/06 职场文书
小学绿色学校申报材料
2014/08/23 职场文书
孝敬父母的活动方案
2014/08/31 职场文书
离婚协议书样本
2015/01/26 职场文书
MongoDB安装使用并实现Python操作数据库
2021/06/28 MongoDB