vue将单页面改造成多页面应用的方法


Posted in Javascript onNovember 25, 2018

问题描述: 手头有一个项目是使用 vue-cli 搭建的单页面应用。项目分为了管理平台和用户查看页面,用户查看页面是很简单的页面,但是在加载过程中,却加载了整个应用的打包代码,量重且影响了响应和体验。我想要的效果是,查看页面只加载查看页面的代码,不包含管理系统的代码,因此着手将单页面应用改造成多页面应用,这里分享下方法。

1、改造文件目录

改造前:

vue将单页面改造成多页面应用的方法

改造后:

vue将单页面改造成多页面应用的方法

assets:这里不变,依然放置公用的静态资源文件;components:这里存放应用下所有的vue组件;pages:这里存放我们的多页面,比如我把管理系统页面放在index中,查看页面放在view中;

pages文件:

vue将单页面改造成多页面应用的方法

每个页面下必须包含的文件是 html/js/vue,是文件入口,如果该页面下包含路由,状态管理,接口请求也放在该目录下;

2、打包配置文件修改

我们最后的打包文件是这样的,可以看到有2个html,包括资源也分开了。这是通过修改webpack配置改造的。采用的方法也是网上比较推荐的方法.
HTML分离:
vue将单页面改造成多页面应用的方法

资源分离:
vue将单页面改造成多页面应用的方法

2.1 修改build->utils.js

修改build文件夹下的utils.js,直接将下面的代码复制在后面即可。

var glob = require('glob');
var HtmlWebpackPlugin = require('html-webpack-plugin');
var PAGE_PATH = path.resolve(__dirname, '../src/pages');
var merge = require('webpack-merge');
// 这段代码的意思是根据我们`pages`下的文件夹定义webpack的入口:
exports.entries = function () {
 var entryFiles = glob.sync(PAGE_PATH + '/*/*.js')
 var map = {}
 entryFiles.forEach((filePath) => {
   var filename = filePath.substring(filePath.lastIndexOf('\/') + 1, filePath.lastIndexOf('.'))
   map[filename] = filePath
 })
 return map
}
// 这段代码是将生成的html,加载对应的资源文件
exports.htmlPlugin = function () {
 let entryHtml = glob.sync(PAGE_PATH + '/*/*.html')
 let arr = []
 entryHtml.forEach((filePath) => {
   let filename = filePath.substring(filePath.lastIndexOf('\/') + 1, filePath.lastIndexOf('.'))
   let conf = {
     // 模板来源
     template: filePath,
     // 文件名称
     filename: filename + '.html',
     // 页面模板需要加对应的js脚本,如果不加这行则每个页面都会引入所有的js脚本
     chunks: ['manifest', 'vendor', filename],
     inject: true
   }
   if (process.env.NODE_ENV === 'production') {
     conf = merge(conf, {
       minify: {
         removeComments: true, 
         collapseWhitespace: true,
         removeAttributeQuotes: true
       },
       chunksSortMode: 'dependency'
     })
   }
   arr.push(new HtmlWebpackPlugin(conf))
 })
 return arr
}

2.2 修改入口entry打开 build->webpack.base.conf.js,替换entry为在utils新增的entries

vue将单页面改造成多页面应用的方法

2.3 修改html插件打开build->webpack.prod.conf.js,先去除原来的配置:

vue将单页面改造成多页面应用的方法

然后再把我们刚在utils里新增的配置加上:

vue将单页面改造成多页面应用的方法

3、页面怎么写

上面的方法,网上五花八门的都介绍了,但是在实现的过程中,还是遇到了问题:这里粘贴下我实践成功的页面写法,减少一些爬坑吧~

view.html

vue将单页面改造成多页面应用的方法

view.vue

vue将单页面改造成多页面应用的方法

view.js

vue将单页面改造成多页面应用的方法

ok,这时候 npm run build 就可以打包出我们要的文件了,访问方法是直接输入对应的html,如果是管理首页,无需写index.html,比如本地访问查看页面:

vue将单页面改造成多页面应用的方法

4、进一步优化

这个时候我们又发现一个问题,就是我的查看页面很简单,没有引入状态管理,路由,UI框架,但是我们知道vue的webpack把这些第三方公共组件都打包到render.js里面了且文件很大会影响我们的加载速度。这里我是将比较大的第三方库使用了cdn方法加载,实践证明会减少了一半的加载速度,且压缩后的js代码也小了很多了~

Javascript 相关文章推荐
javascript之对系统的toFixed()方法的修正
May 08 Javascript
javascript 写类方式之四
Jul 05 Javascript
原生javascript图片自动或手动切换示例附演示源码
Sep 04 Javascript
浅析JavaScript中的隐式类型转换
Dec 05 Javascript
JS获取几种URL地址的方法小结
Feb 26 Javascript
js点击选择文本的方法
Feb 09 Javascript
关于JS中的apply,call,bind的深入解析
Apr 05 Javascript
学习Bootstrap滚动监听 附调用方法
Jul 02 Javascript
JS实现重新加载当前页面
Nov 29 Javascript
jQuery实现字符串全部替换的方法【推荐】
Mar 09 Javascript
javascript实现摄像头拍照预览
Sep 30 Javascript
vue - props 声明数组和对象操作
Jul 30 Javascript
vue下拉菜单组件(含搜索)的实现代码
Nov 25 #Javascript
Angular ui-roter 和AngularJS 通过 ocLazyLoad 实现动态(懒)加载模块和依赖
Nov 25 #Javascript
详解Vue CLI 3.0脚手架如何mock数据
Nov 23 #Javascript
详解js静态检查工具eslint配置文件
Nov 23 #Javascript
详解小程序不同页面之间通讯的解决方案
Nov 23 #Javascript
创建echart多个联动的示例代码
Nov 23 #Javascript
详解Angular模板引用变量及其作用域
Nov 23 #Javascript
You might like
php+mysql写的简单留言本实例代码
2008/07/25 PHP
php MessagePack介绍
2013/10/06 PHP
学习php分页代码实例
2013/10/24 PHP
做网页的一些技巧(续)
2007/02/01 Javascript
Javascript和Ajax中文乱码吐血版解决方案
2009/12/21 Javascript
jQuery实现的类flash菜单效果代码
2010/05/17 Javascript
js实现同一页面多个不同运动效果的方法
2015/04/10 Javascript
js实现改进的仿蓝色论坛导航菜单效果代码
2015/09/06 Javascript
jQuery表格(Table)基本操作实例分析
2017/03/10 Javascript
Vue.js实战之组件之间的数据传递
2017/04/01 Javascript
js闭包学习心得总结
2018/04/17 Javascript
jQuery简单实现根据日期计算星期几的方法
2019/01/09 jQuery
微信公众号生成新浪短网址的实现(快速生成)
2019/08/18 Javascript
使用Python进行新浪微博的mid和url互相转换实例(10进制和62进制互算)
2014/04/25 Python
简单分析Python中用fork()函数生成的子进程
2015/05/04 Python
django定期执行任务(实例讲解)
2017/11/03 Python
python统计字母、空格、数字等字符个数的实例
2018/06/29 Python
pandas的唯一值、值计数以及成员资格的示例
2018/07/25 Python
python中正则表达式 re.findall 用法
2018/10/23 Python
Django开发的简易留言板案例详解
2018/12/04 Python
对python3 中方法各种参数和返回值详解
2018/12/15 Python
python基础梳理(一)(推荐)
2019/04/06 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
2019/08/10 Python
python实现大战外星人小游戏实例代码
2019/12/26 Python
python传到前端的数据,双引号被转义的问题
2020/04/03 Python
TensorFlow使用Graph的基本操作的实现
2020/04/22 Python
Python发送邮件实现基础解析
2020/08/14 Python
python 如何停止一个死循环的线程
2020/11/24 Python
基于css3的属性transition制作菜单导航效果
2015/09/01 HTML / CSS
Artist Guitars新西兰:乐器在线商店
2017/09/17 全球购物
京剧自荐信
2014/01/26 职场文书
公司口号大全
2014/06/11 职场文书
2015年个人工作总结报告
2015/04/25 职场文书
房地产项目合作意向书
2015/05/08 职场文书
活动宣传稿范文
2015/07/23 职场文书
Elasticsearch 索引操作和增删改查
2022/04/19 Python