详解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 相关文章推荐
JavaScript中的数学运算介绍
Dec 29 Javascript
深入解读JavaScript中的Iterator和for-of循环
Jul 28 Javascript
分享jQuery网页元素拖拽插件
Dec 01 Javascript
基于jQuery实现一个marquee无缝滚动的插件
Mar 09 Javascript
JS正则表达式判断有效数实例代码
Mar 13 Javascript
Angular.JS中的指令引用template与指令当做属性详解
Mar 30 Javascript
JS简单实现数组去重的方法分析
Oct 14 Javascript
vue页面离开后执行函数的实例
Mar 13 Javascript
vue升级之路之vue-router的使用教程
Aug 14 Javascript
Vue父子组件之间的通信实例详解
Sep 28 Javascript
微信小程序自定义单项选择器样式
Jul 25 Javascript
基于JavaScript实现省市联动效果
Jun 22 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下通过QRCode类库创建中间带网站LOGO的二维码
2014/07/12 PHP
php输出xml属性的方法
2015/03/19 PHP
php实现用于计算执行时间的类实例
2015/04/18 PHP
Laravel中使用Queue的最基本操作教程
2017/12/27 PHP
根据判断浏览器类型屏幕分辨率自动调用不同CSS的代码
2007/02/22 Javascript
EXT窗口Window及对话框MessageBox
2011/01/27 Javascript
jquery解析xml字符串示例分享
2014/03/25 Javascript
绑定回车enter事件代码
2014/05/18 Javascript
用JavaScript实现页面重定向功能的教程
2015/06/04 Javascript
Node.js+Express配置入门教程
2016/05/19 Javascript
微信js-sdk预览图片接口及从拍照或手机相册中选图接口用法示例
2016/10/13 Javascript
web前端开发upload上传头像js示例代码
2016/10/22 Javascript
Bootstrap学习笔记之进度条、媒体对象实例详解
2017/03/09 Javascript
JS得到当前时间的方法示例
2017/03/24 Javascript
js 事件的传播机制(实例讲解)
2017/07/20 Javascript
Vue实现数字输入框中分割手机号码的示例
2017/10/10 Javascript
JavaScript实现简单动态进度条效果
2018/04/06 Javascript
Vue组件中的data必须是一个function的原因浅析
2018/09/03 Javascript
Node.js 实现远程桌面监控的方法步骤
2019/07/02 Javascript
echarts实现晶体球面投影的实例教程
2020/10/10 Javascript
elementui实现预览图片组件二次封装
2020/12/29 Javascript
Python3.x和Python2.x的区别介绍
2013/02/12 Python
决策树的python实现方法
2014/11/18 Python
利用QT写一个极简单的图形化Python闹钟程序
2015/04/07 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
2020/03/30 Python
美国著名的婴儿学步鞋老品牌:Robeez
2016/08/20 全球购物
美国孕妇装品牌:Destination Maternity
2018/02/04 全球购物
ZWILLING双立人英国网上商店:德国刀具锅具厨具品牌
2018/05/15 全球购物
物业总经理岗位职责
2014/02/28 职场文书
高三高考决心书
2014/03/11 职场文书
经典演讲稿开场白
2014/08/25 职场文书
校园广播站开场白
2015/06/01 职场文书
关爱空巢老人感想
2015/08/11 职场文书
关于保护环境的建议书
2019/06/24 职场文书
Win11怎么修改电源模式?Win11修改电源模式的方法
2022/04/05 数码科技
Python中的协程(Coroutine)操作模块(greenlet、gevent)
2022/05/30 Python