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 相关文章推荐
jQuery数组处理方法汇总
Jun 20 Javascript
js导航菜单(自写)简单大方
Mar 28 Javascript
JS中prototype关键字的功能介绍及使用示例
Jul 21 Javascript
利用js(jquery)操作Cookie的方法说明
Dec 19 Javascript
js拖拽一些常见的思路方法整理
Mar 19 Javascript
javascript实现页面内关键词高亮显示代码
Apr 03 Javascript
JavaScript生成验证码并实现验证功能
Sep 24 Javascript
深入理解基于vue-cli的vuex配置
Jul 24 Javascript
Angular 2 利用Router事件和Title实现动态页面标题的方法
Aug 23 Javascript
axios发送post请求springMVC接收不到参数的解决方法
Mar 05 Javascript
初探Vue3.0 中的一大亮点Proxy的使用
Dec 06 Javascript
JavaScript提升机制Hoisting详解
Oct 23 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的FTP学习(四)
2006/10/09 PHP
组合算法的PHP解答方法
2012/02/04 PHP
ThinkPHP CURD方法之where方法详解
2014/06/18 PHP
php中文乱码问题的终极解决方案汇总
2017/08/01 PHP
ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写方法
2018/09/26 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
DOM精简教程
2006/10/03 Javascript
JavaScript this调用规则说明
2010/03/08 Javascript
解决jquery异步按一定的时间间隔刷新问题
2012/12/10 Javascript
运算符&&的三个不同层次
2013/04/07 Javascript
Jquery Uploadify上传带进度条的简单实例
2014/02/12 Javascript
使用jsonp完美解决跨域问题
2014/11/27 Javascript
JavaScript中switch语句的用法详解
2015/06/03 Javascript
jquery pagination分页插件使用详解(后台struts2)
2017/01/22 Javascript
浅谈Node Inspector 代理实现
2017/10/19 Javascript
AngularJS实现controller控制器间共享数据的方法示例
2017/10/30 Javascript
node下使用UglifyJS压缩合并JS文件的方法
2018/03/07 Javascript
基于Vue自定义指令实现按钮级权限控制思路详解
2018/05/23 Javascript
如何在Vue中使用CleaveJS格式化你的输入内容
2018/12/14 Javascript
node.js连接mysql与基本用法示例
2019/01/05 Javascript
vue router 传参获取不到的解决方式
2019/11/13 Javascript
node.js 基于 STMP 协议和 EWS 协议发送邮件
2021/02/14 Javascript
python os模块简单应用示例
2019/05/23 Python
Python读取stdin方法实例
2019/05/24 Python
Python爬取股票信息,并可视化数据的示例
2020/09/26 Python
H&M美国官网:欧洲最大的服饰零售商
2016/09/07 全球购物
Lancome兰蔻官方旗舰店:来自法国的世界知名美妆品牌
2018/06/14 全球购物
美国知名眼镜网站:Target Optical
2020/04/04 全球购物
EJB的基本架构
2016/09/22 面试题
公司员工检讨书
2014/02/08 职场文书
全运会口号
2014/06/20 职场文书
2015年党风廉政承诺书
2015/01/22 职场文书
MySQL下使用Inplace和Online方式创建索引的教程
2021/05/26 MySQL
TypeScript中条件类型精读与实践记录
2021/10/05 Javascript
html5调用摄像头截图功能
2022/01/18 Javascript
WIN10使用IIS部署ftp服务器详细教程
2022/08/05 Servers