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(1.6.3) 中css方法对浮动的实现缺陷分析
Sep 09 Javascript
Jquery显示和隐藏元素或设为只读(含Ligerui的控件禁用,实例说明介绍)
Jul 09 Javascript
三种取消选中单选框radio的方法
Sep 09 Javascript
Web表单提交之disabled问题js解决方法
Jan 13 Javascript
如何使用jquery easyui创建标签组件
Nov 18 Javascript
JS中判断字符串中出现次数最多的字符及出现的次数的简单实例
Jun 03 Javascript
vue2.0嵌套路由实现豆瓣电影分页功能(附demo)
Mar 13 Javascript
vue省市区三联动下拉选择组件的实现
Apr 28 Javascript
Javascript 一些需要注意的细节(必看篇)
Jul 08 Javascript
jQuery EasyUI结合zTree树形结构制作web页面
Sep 01 jQuery
教你如何编写Vue.js的单元测试的方法
Oct 17 Javascript
vue-cli 2.*中导入公共less文件的方法步骤
Nov 22 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 smarty 二级分类代码和模版循环例子
2011/06/01 PHP
php设计模式 Singleton(单例模式)
2011/06/26 PHP
CI框架源码阅读,系统常量文件constants.php的配置
2013/02/28 PHP
PHP中::、->、self、$this几种操作符的区别介绍
2013/04/24 PHP
php中实现记住密码下次自动登录的例子
2014/11/06 PHP
ajax+php控制所有后台函数调用
2015/07/15 PHP
CI(CodeIgniter)框架视图中加载视图的方法
2017/03/24 PHP
Windows平台实现PHP连接SQL Server2008的方法
2017/07/26 PHP
从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解
2019/04/03 PHP
jquery ajax 检测用户注册时用户名是否存在
2009/11/03 Javascript
基于jquery的jqDnR拖拽溢出的修改
2011/02/12 Javascript
jquery 操作DOM的基本用法分享
2012/04/05 Javascript
Node.js开发指南中的简单实例(mysql版)
2013/09/17 Javascript
JSuggest自动匹配下拉框使用方法(示例代码)
2013/12/27 Javascript
jQuery中bind,live,delegate与one方法的用法及区别解析
2013/12/30 Javascript
JavaScript运动框架 解决速度正负取整问题(一)
2017/05/17 Javascript
Nodejs环境实现socket通信过程解析
2020/07/03 NodeJs
Python 元组(Tuple)操作详解
2014/03/11 Python
利用python 更新ssh 远程代码 操作远程服务器的实现代码
2018/02/08 Python
Python DataFrame设置/更改列表字段/元素类型的方法
2018/06/09 Python
Python并发之多进程的方法实例代码
2018/08/15 Python
对python中的*args与**kwgs的含义与作用详解
2019/08/28 Python
Python多线程正确用法实例解析
2020/05/30 Python
Django与AJAX实现网页动态数据显示的示例代码
2021/02/24 Python
让IE可以变相支持CSS3选择器
2010/01/21 HTML / CSS
深入解析HTML5中的Blob对象的使用
2015/09/08 HTML / CSS
海外淘书首选:AbeBooks
2017/07/31 全球购物
京东国际站:JOYBUY
2017/11/23 全球购物
印尼第一大家居、生活和家具电子商务:Ruparupa
2019/11/25 全球购物
迪卡侬比利时官网:Decathlon比利时
2019/12/28 全球购物
中间件的定义
2016/08/09 面试题
2014年房地产工作总结范文
2014/11/19 职场文书
2016元旦主持人经典开场白台词
2015/12/03 职场文书
2019年大学生职业生涯规划书
2019/03/25 职场文书
一个成功的互联网创业项目,必须满足这些要求
2019/08/23 职场文书
Python中os模块的简单使用及重命名操作
2021/04/17 Python