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 相关文章推荐
关于IE7 IE8弹出窗口顶上
Dec 22 Javascript
JavaScript 利用Cookie记录用户登录信息
Dec 08 Javascript
javascript 四则运算精度修正函数代码
May 31 Javascript
基于jquery的大众点评,分类导航实现代码
Aug 23 Javascript
50个比较实用jQuery代码段
Sep 18 Javascript
js自动查找select下拉的菜单并选择(示例代码)
Feb 26 Javascript
javaScript如何处理从java后台返回的list
Apr 24 Javascript
jquery中页面Ajax方法$.load的功能使用介绍
Oct 20 Javascript
jquery动态遍历Json对象的属性和值的方法
Jul 27 Javascript
jQuery表单事件实例代码分享
Aug 18 Javascript
node.js中Buffer缓冲器的原理与使用方法分析
Nov 23 Javascript
JavaScript执行机制详细介绍
Dec 06 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
信用卡效验程序
2006/10/09 PHP
php中session退出登陆问题
2014/02/27 PHP
PHP统计目录中文件以及目录中目录大小的方法
2016/01/09 PHP
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.3
2008/03/22 Javascript
js格式化时间和js格式化时间戳示例
2014/02/10 Javascript
JS实现一个按钮的方法
2015/02/05 Javascript
jQuery插件pagination实现分页特效
2015/04/12 Javascript
JavaScript浏览器对象模型BOM(BrowserObjectModel)实例详解
2016/11/29 Javascript
nodejs实例解析(输出hello world)
2017/01/03 NodeJs
js实现不提示直接关闭网页窗口
2017/03/30 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
2017/06/13 Javascript
axios简单实现小程序延时loading指示
2018/07/30 Javascript
vue webpack打包后图片路径错误的完美解决方法
2018/12/07 Javascript
[47:46]完美世界DOTA2联赛 Magma vs GXR 第三场 11.07
2020/11/10 DOTA
[27:08]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第二场 11.21
2020/11/23 DOTA
Python类的专用方法实例分析
2015/01/09 Python
在Python中实现贪婪排名算法的教程
2015/04/17 Python
Python遍历目录并批量更换文件名和目录名的方法
2016/09/19 Python
tensorflow学习教程之文本分类详析
2018/08/07 Python
详解python的sorted函数对字典按key排序和按value排序
2018/08/10 Python
在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法
2019/06/18 Python
Python解压 rar、zip、tar文件的方法
2019/11/19 Python
Python中Subprocess的不同函数解析
2019/12/10 Python
python 牛顿法实现逻辑回归(Logistic Regression)
2020/10/15 Python
python Matplotlib基础--如何添加文本和标注
2021/01/26 Python
阿巴庭院:Abba Patio
2019/06/18 全球购物
公务员年总结的自我评价
2013/10/25 职场文书
文秘专业大学生求职信
2013/11/10 职场文书
艺校音乐专业自我鉴定范文
2014/03/01 职场文书
中学生关于梦想的演讲稿
2014/08/22 职场文书
邓小平理论心得体会
2014/09/09 职场文书
大学生党员学习焦裕禄精神思想汇报
2014/09/10 职场文书
内乡县衙导游词
2015/02/05 职场文书
什么是执行力?9个故事告诉您:成功绝非偶然!
2019/07/05 职场文书
详解Javascript实践中的命令模式
2021/05/05 Javascript
Win11控制面板快捷键是什么?Win11打开控制面板的方法汇总
2022/07/07 数码科技