为何选择多单页

最近在核心业务上做了一项新的尝试,抛弃臃肿的PHP后端渲染的多页应用模式,全站改造单页应用。单页渲染在加载速度已经有了极大的提升,并且MVVM的模式使前端开发从繁琐的DOM操作中解放出来。为什么考虑多单页模式,可综合多页和单页的优势,多页分离减少模块耦合,特别是应用复杂程度高时,此后也可在每个单页里面尝试不同的方案,利于拓展。本文是记录多单页实践的思路,脚手架vue-cli生成,详细的代码可参考demo,欢迎探讨。

webpck搭建多单页

1.从入口文件entry说起

entry对象主要用于配置应用js入口文件,由模块名称为属性名(编译生成的js chunks的名称),以该js文件路径为属性值。以vue-cli搭建的单页应用为例,以下是初始配置。单页应用通常只有一个入口js文件(不包括其他公共js模块)。

多单页应用则有多个js入口文件,entry也要配置多个入口,如下: webpack.base.conf.js

  entry: {'index': './src/pages/main.js',// index.html 的入口文件'asset': './src/pages/asset/index.js',// 页面 asset.html 的入口文件'login': './src/pages/login/index.js',// 页面 login.html 的入口文件},
复制代码

当页面应用比较多的时候,可以引入glob模块,封装遍历函数。

//引入模块
var glob = require('glob');//遍历函数
function getEntry(globPath) {var entries = {},basename, tmp, pathname;//下面的路径根据自己的目录结构修改,打印出来检查是否跟手写的一致glob.sync(globPath).forEach(function (entry) {basename = path.basename(entry, path.extname(entry));console.log("basename",basename);tmp = entry.split('/').splice(-3);pathname = tmp.splice(0, 1) + '/' + tmp.splice(0, 1) + '/' + basename; // 正确输出js和html的路径entries[pathname] = entry;});return entries;
}//遍历pages路径下所有的main.js文件,所有的入口文件命名一致
var entries=getEntry('./src/pages/**/main.js');// 传值entry: entries,
复制代码

关于entry更详细的内容可参考官网。

2. 多页应用还需修改HtmlWebpackPlugin配置页面渲染模版

webpack.dev.conf.js

    new HtmlWebpackPlugin({//访问filename: 'pages/login/login.html',template: './src/pages/login/login.html',inject: true,//对应entry的chunks名称chunks:['login']}),new HtmlWebpackPlugin({filename: 'pages/asset/asset.html',template: './src/pages/asset/asset.html',inject: true,chunks:['asset']}),
复制代码

写成遍历: webpack.dev.conf.js

 var pages = getEntry('./src/pages/**/*.html');
for (var pathname in pages) {// 配置生成的html文件,定义路径等var conf = {filename: pathname + '.html',template: pages[pathname],   // 模板路径inject: true              // js插入html尾部};if (pathname in baseWebpackConfig.entry) {//这里配置当前单页需要加载的chunksconf.chunks = ['manifest', 'vendor',pathname];conf.hash = true;}devWebpackConfig.plugins.push(new HtmlWebpackPlugin(conf));
}//遍历函数
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) + '/' + tmp.splice(0, 1) + '/' + basename; // 正确输出js和html的路径entries[pathname] = entry;});return entries;
}复制代码

webpack构建多单页一些踩过的坑

  1. webpack打包后样式丢失 检查了好久发现是这2个插件冲突的问题,postCss loader 与 OptimizeCSSPlugin。 解决:去掉下列代码。
    new OptimizeCSSPlugin({cssProcessorOptions: config.build.productionSourceMap? { safe: true, map: { inline: false } }: { safe: true }}),
复制代码
  1. cannot find the element #app 单页页面加载了其他页面的入口文件,找不到对应的模版id导致。解决:在webpack配置,在前面HtmlWebpackPlugin配置只注入指定的chunks,这样就不会把其他页面的js也加载进来,导致找不到对应的html模版,也优化了加载。
   if (pathname in baseWebpackConfig.entry) {//这里配置当前单页需要加载的chunksconf.chunks = ['manifest', 'vendor',pathname];conf.hash = true;}
复制代码
  1. 多单页命名问题 多单页面vue应用根元素的id不能相同, 否则会出现页面互相覆盖的问题。
    new Vue({//根元素idel: '#app',components: { App },template: '<App/>'})
复制代码
  1. css 到底是 import 还是 require 两种都是模块引入的方式,import使es6规范,require是commonJS规范,需要注意的是import会有提升效果,可能出现import覆盖require样式。
require('/style.css');
import '/style.css';
复制代码
  1. 多单页之间vuex数据不能共享 单页应用之间vuex数据是不能共享的,因为其本质还是多页应用。页面与页面之间的数据传递还是要通过URL传参数或者通过缓存读取。这在一定程度上还是增加了应用复杂度,所以在业务粒度的拆分上不能太细,尽量保证在单个业务流程是在一个单页内,数据可以共享。

  2. 考虑后续部署的问题 单页应用的部署很简单,只有一个html文件,采取多单页的方案,必须要提前跟运维沟通后续部署的问题,确保能实现平稳过渡。

webpack 搭建vue多单页应用相关推荐

  1. webpack搭建vue项目(不用脚手架)

    webpack搭建vue项目(不用脚手架) npm默认安装的是最新版本,这里讲的是Webpack4用法,如果遇到问题请检查是否是版本问题 webpack5升级了一些东西,例如图片的打包 1.初始化项目 ...

  2. 从零开始使用webpack 搭建vue项目

    从零开始使用webpack 搭建vue项目 1 创建项目 npm init 生成 package.json 创建 index.html webpack.confug.js project-name|- ...

  3. webpack搭建vue项目开发环境【文档向学习】

    为何有这篇文章 各个社区已经有无数篇帖子介绍如何使用webpack搭建前端项目,但无论是出于学习webpack的目的还是为了解决工作实际需要都面临着一个现实问题,那就是版本更新.别人的帖子可能刚写好版 ...

  4. Vue-CLI + Webpack 搭建 Vue 项目最全分析

    一.vue-cli介绍 vue-cli是一个用于快速搭建vue项目的 脚手架. 二.vue-cli安装.更新 安装过nodeJs .cnpm 后,全局安装vue-cli(以后其他项目可直接使用): c ...

  5. vue实现div多选全选功能_怎样为你的 Vue.js 单页应用提速

    每日前端夜话第323篇 翻译:疯狂的技术宅 作者:Matthias Sommer 来源:dzone 正文共:1956 字 预计阅读时间:10 分钟 我有一个项目用了 Vue.js 来构建单页应用程序. ...

  6. webpack搭建vue脚手架

    之前搞过的webpack版本搭建vue脚手架项目,今天分享一下! 在读这篇文章之前你可能需要了解一些webpack的配置才行 否则可能看不懂部分配置 首先我们的项目的src目录结构如下 基本上与vue ...

  7. 使用vue-cli + webpack搭建vue项目环境

    打开终端(点击开始,在搜索框中输入cmd) 第一步:  找到需要安装项目所在的盘  (我问项目都在d盘下的vuework下) 第二步:安装淘宝镜像(淘宝镜像安装包会比官网快, 而且有时候用npm安装会 ...

  8. Vue 部署单页应用,刷新页面 404/502 报错

    在 Vue 项目中,可以选择 hash或者 history.pushState() 实现路由跳转.如果在路由中使用history模式: export default new Router({mode: ...

  9. 使用 Vue + Flask 搭建单页应用

    单页应用,只加载一个主页面,然后通过 AJAX 无刷新加载其它页面片段.表面上看,就只有一个 HTML 文件,所谓单页.开发上,做到了前后端分离,前端专注于渲染模板,而后端只要提供 API 就行,不用 ...

最新文章

  1. 第二项目AIaisell(易销宝)
  2. USEARCH — 最简单易学的扩增子分析流程(中国总代理)
  3. Kubernetes基本概念之Name和NameSpace
  4. 《OD大数据实战》MongoDB环境搭建
  5. vue2项目使用codemirror插件实现代码编辑器功能
  6. 初入c++(四)string类和c++中的引用
  7. oracle 函数可变参数,6.3 带有可变参数的函数
  8. echarts 获取点击的y轴数值_ECharts关系图
  9. Windows Server 2008 R2 远程桌面服务RDS和VDI介绍
  10. vm虚拟机安装gho系统_虚拟机怎么安装gho系统
  11. 地外水平/斜面的太阳理论辐照度计算及其python实现
  12. 一键修改QQ运动刷步助手 V3.0
  13. ArcGIS软件的基本使用
  14. Excel表格合并两列数据且保留全部内容
  15. 磨刀不误砍柴工——模板方法模式
  16. 关于Oblog 2.52 help.asp漏洞的修补问题
  17. H5中ajax()方法发送网络数据请求
  18. BNUZ-ACM 2018国庆新生欢乐赛部分题解+思路(已解出答案部分)
  19. Codeforces ~ 1063C ~ Dwarves, Hats and Extrasensory Abilities (交互题,二分)
  20. Dream it possible-我的2016

热门文章

  1. python requests 上传文件_Fastapi 上传多个文件(包含服务器端和python客户端代码)...
  2. java计算机毕业设计高校社区生鲜配送系统MyBatis+系统+LW文档+源码+调试部署
  3. 树莓派gpio控制输出电压
  4. Labview表达式节点的应用——以一个计算式为例
  5. psychopy写stroop实验
  6. 马鞍山市“四化”打造智慧交通引领智慧城市建设
  7. H5的新特新及API
  8. C++: 团体程序设计天梯赛 (一帮一)
  9. 理光Ricoh MP C3504exSP 一体机驱动
  10. android 支付宝是否安装包,Android App集成支付宝