实现vue多页面开发与打包步骤详解

这次给大家带来实现vue多页面开发打包步骤详解,实现vue多页面开发与打包的注意事项有哪些,下面就是实战案例,一起来看一下。

实现vue多页面开发与打包步骤详解

前段时间做项目,技术栈是vue+webpack,主要就是官网首页加后台管理系统 根据当时情况,分析出三种方案

一个项目代码里面嵌两个spa应用(官网和后台系统)

分开两套项目源码

一套项目源码里面就一个spa应用

思考:

直接否定了一套项目源码里一个spa应用(ui样式会相互覆盖,如果没有代码规范后期比较难维护)

两套源码的话,后台可能开两个端口,然后需要用nginx反向代理可能比较麻烦,而且前端开发也比较麻烦麻烦,毕竟需要维护两个git仓库,两套git上线流程,可能会损耗很多时间。

对自己的技术(盲目)自信,也想尝尝鲜,分析出需求也不算很复杂。选了第一种方案,就是多个单页面应用在一套源码里面

上一张多页面的结构图

实现vue多页面开发与打包步骤详解 

下载vue spa模板

npm install vue-cli -gvue init webpack multiple-vue-amazing

登录后复制

改造多页面应用

npm install glob --save-dev

登录后复制

修改src文件夹下面的目录结构

实现vue多页面开发与打包步骤详解 

在util.js里面加入

/* 这里是添加的部分 ---------------------------- 开始 */// glob是webpack安装时依赖的一个第三方模块,还模块允许你使用 *等符号, 例如lib/*.js就是获取lib文件夹下的所有js后缀名的文件var glob = require('glob')// 页面模板var HtmlWebpackPlugin = require('html-webpack-plugin')// 取得相应的页面路径,因为之前的配置,所以是src文件夹下的pages文件夹var PAGE_PATH = path.resolve(dirname, '../src/pages')// 用于做相应的merge处理var merge = require('webpack-merge')//多入口配置// 通过glob模块读取pages文件夹下的所有对应文件夹下的js后缀文件,如果该文件存在// 那么就作为入口处理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}//多页面输出配置// 与上面的多页面入口配置相同,读取pages文件夹下的对应的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}/* 这里是添加的部分 ---------------------------- 结束 */webpack.base.conf.js 文件/* 修改部分 ---------------- 开始 */ entry: utils.entries(), /* 修改部分 ---------------- 结束 */webpack.dev.conf.js 文件/* 注释这个区域的文件 ------------- 开始 */ // new HtmlWebpackPlugin({ // filename: 'index.html', // template: 'index.html', // inject: true // }), /* 注释这个区域的文件 ------------- 结束 */ new FriendlyErrorsPlugin() /* 添加 .concat(utils.htmlPlugin()) ------------------ */ ].concat(utils.htmlPlugin())webpack.prod.conf.js 文件/* 注释这个区域的内容 ---------------------- 开始 */ // new HtmlWebpackPlugin({ // filename: config.build.index, // template: 'index.html', // inject: true, // minify: { //  removeComments: true, //  collapseWhitespace: true, //  removeAttributeQuotes: true //  // more options: //  // https://github.com/kangax/html-minifier#options-quick-reference // }, // // necessary to consistently work with multiple chunks via CommonsChunkPlugin // chunksSortMode: 'dependency' // }), /* 注释这个区域的内容 ---------------------- 结束 */ // copy custom static assets new CopyWebpackPlugin([  {  from: path.resolve(dirname, '../static'),  to: config.build.assetsSubDirectory,  ignore: ['.*']  } ]) /* 该位置添加 .concat(utils.htmlPlugin()) ------------------- */ ].concat(utils.htmlPlugin())

登录后复制

引入第三方ui库

npm install element-ui bootstrap-vue --save

登录后复制

分别在不同的页面引入不同的ui index.js

import BootstrapVue from 'bootstrap-vue'Vue.use(BootstrapVue)

登录后复制

admin.js

import ElementUI from 'element-ui'import 'element-ui/lib/theme-chalk/index.css'Vue.use(ElementUI)

登录后复制

上面多页面的配置是参考网上的,而且网上的思路大都很相似,核心就是改多个entry,配置完成了之后,开发的时候也是发现不了问题的,然后大概就开发了一个月,开发完之后对官网进行性能分析时发现,webpack打包的vendor.js网络加载时间特别长,导致首屏的白屏时间非常长,最终通过-webpack-bundle-analyzer分析得到了结论

npm run build --report

登录后复制

实现vue多页面开发与打包步骤详解 

你会发现vendor.js包含了index.html和admin.html的共同部分,所以这个vendor包注定会很大很冗余

解决思路

既然是vendor过大引起加载速度慢,那就分离这个vendor就好了。我是这样想的,把各个页面中都使用到的第三方代码提取至vendor.js中,然后各个页面中用到的第三方代码再打包成各自的vendor-x.js,例如现有页面index.html、admin.html,则最终会打包出vendor.js、vendor-index.js、vendor-admin.js。

webpack.prod.conf.js 文件

new webpack.optimize.CommonsChunkPlugin({  name: 'vendor-admin',  chunks: ['vendor'],  minChunks: function (module, count) {  return (   module.resource &&   /.js$/.test(module.resource) &&   module.resource.indexOf(path.join(dirname, '../node_modules')) === 0 &&   module.resource.indexOf('element-ui') != -1  )  } }), new webpack.optimize.CommonsChunkPlugin({  name: 'vendor-index',  chunks: ['vendor'],  minChunks: function (module, count) {  return (   module.resource &&   /.js$/.test(module.resource) &&   module.resource.indexOf(path.join(dirname, '../node_modules')) === 0 &&   module.resource.indexOf('bootstrap-vue') != -1  )  } }),

登录后复制

再次分析,一切都很ok,vendor.js被分离成了vendor.js、vendor-index、vendor-admin.js

实现vue多页面开发与打包步骤详解 

本来以为解决了CommonsChunkPlugin的分离vendor.js的问题,就可以了,然后打包出来发现index.html和admin.html都少了一个引入(各自对应的那个vendor-xx.js)

实现vue多页面开发与打包步骤详解 

解决方案

这个问题其实就是HtmlWebpackPlugin的问题 把原来的 chunksSortMode: ‘dependency’改成自定义函数的配置,如下

util.js文件

chunksSortMode: function (chunk1, chunk2) {   var order1 = chunks.indexOf(chunk1.names[0])   var order2 = chunks.indexOf(chunk2.names[0])   return order1 - order2  },

登录后复制

最终实现

每个页面加载各自的chunk

每个页面有不同的参数

每个页面能共享公共chunk

浏览器缓存,性能更好

如果还嫌慢的话,开启gzip

感想

大功告成了,虽然配置看起来很简单,不过我当时开发的时候,思考了很久,所以假如你CommonsChunkPlugin和HtmlWebpackPlugin不熟悉或者只会用别人第三方的配置表,估计会踩大坑,比如说,CommonsChunkPlugin不指定chunks,默认是什么?minChunks大多数人只会写一个数值,然而自定义一个函数的写法其实才是最强大的,根据我个人的经验chunks结合minChunks自定义函数的写法,能解决几乎所有CommonsChunkPlugin灵异的事件。

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

echarts节点显示动态数据实现步骤

vue之.sync修饰符使用详解

以上就是实现vue多页面开发与打包步骤详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2766935.html

(0)
上一篇 2025年3月8日 11:28:21
下一篇 2025年3月8日 11:28:31

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Vue实现proxy代理步骤详解

    这次给大家带来Vue实现proxy代理步骤详解,Vue实现proxy代理的注意事项有哪些,下面就是实战案例,一起来看一下。 Vue 框架开发的时候,会遇到跨域的问题,可在config/index.js 里配置proxyTable内容,使用p…

    编程技术 2025年3月8日
    200
  • vue父组件往父组件内传递值步骤详解

    这次给大家带来vue父组件往父组件内传递值步骤详解,vue父组件往父组件内传递值的注意事项有哪些,下面就是实战案例,一起来看一下。 如下图所示: 当没有任何操作的时候父组件的值是 0 当点击加号以后父组件的值是 1 当点击减号以后父组件的值…

    2025年3月8日
    200
  • vue数据传递实现步骤详解

    这次给大家带来vue数据传递实现步骤详解,vue数据传递实现的注意事项有哪些,下面就是实战案例,一起来看一下。 组件(Component)是 Vue.js 最强大的功能。组件可以封装可重用的代码,通过传入对象的不同,实现组件的复用,但组件传…

    2025年3月8日 编程技术
    200
  • vue全局与局部组件使用步骤详解

    这次给大家带来vue全局与局部组件使用步骤详解,vue全局与局部组件使用的注意事项有哪些,下面就是实战案例,一起来看一下。 main.js入口文件的一些常用配置, 在入口文件上定义的public.vue为全局组件,在这里用的是pug模版 .…

    编程技术 2025年3月8日
    200
  • JS实现文件拖拽步骤详解

    这次给大家带来JS实现文件拖拽步骤详解,JS实现文件拖拽的注意事项有哪些,下面就是实战案例,一起来看一下。 本文实例为大家分享了javascript实现文件拖拽事件的具体代码,供大家参考,具体内容如下 1.效果图: 2.源码 #p1 { w…

    2025年3月8日
    200
  • Vue实现Observer步骤详解

    这次给大家带来Vue实现Observer步骤详解,Vue实现Observer的注意事项有哪些,下面就是实战案例,一起来看一下。 导语: 本文是对 Vue 官方文档深入响应式原理(https://cn.vuejs.org/v2/guide/r…

    2025年3月8日
    200
  • Angular实现服务端渲染步骤详解

    这次给大家带来Angular实现服务端渲染步骤详解,Angular实现服务端渲染的注意事项有哪些,下面就是实战案例,一起来看一下。 Angular Universal Angular在服务端渲染方面提供一套前后端同构解决方案,它就是Angu…

    2025年3月8日 编程技术
    200
  • koa2实现文件上传下载步骤详解

    这次给大家带来koa2实现文件上传下载步骤详解,koa2实现文件上传下载的注意事项有哪些,下面就是实战案例,一起来看一下。 前言 上传下载在 web 应用中还是比较常见的,无论是图片还是其他文件等。在 Koa 中,有很多中间件可以帮助我们快…

    编程技术 2025年3月8日
    200
  • vue根据参数方法来打包域名方法详解

    这次给大家带来vue根据参数方法来打包域名方法详解,vue根据参数方法来打包域名的注意事项有哪些,下面就是实战案例,一起来看一下。 项目开发中,前端在配置后端api域名时很困扰,常常出现: 本地开发环境: api-dev.demo.com …

    编程技术 2025年3月8日
    200
  • Vue项目引入icon步骤详解

    这次给大家带来Vue项目引入icon步骤详解,Vue项目引入icon的注意事项有哪些,下面就是实战案例,一起来看一下。 1.下载icon图标,推荐icomoon网站,里面有大量的矢量图标,也可以自定义,当然你也可以去阿里巴巴矢量图标库下载你…

    2025年3月8日 编程技术
    200

发表回复

登录后才能评论