范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

我是如何把vue项目启动时间从70s优化到7秒的

  可怕的启动时间
  公司的产品是一个比较大的后台管理系统,而且使用的是webpack3的vue模板项目,单次项目启动时间达到了70s左右
  启动个项目都够吃一碗豆腐脑了,可是没有豆腐脑怎么办,那就优化启动时间吧!
  考虑到升级webpack版本的风险还是比较大的,出了一点问题都得找我,想想还是先别冒险,稳妥为主,所以我选择了通过插件来优化构建时间。
  通过查阅资料,提升webpack的构建时间有以下几个方向: 多进程处理文件,同一时间处理多个文件 预编译资源模块,比如把长时间不变的库提取出来做预编译,构建的时候直接取编译结果就好 缓存,未修改的模块直接拿到处理结果,不必编译 减少构建搜索和处理的文件数量
  针对以上几种优化方向,给出以下几种优化方案。 多进程构建happypack
  happypack 的作用就是将文件解析任务分解成多个子进程并发执行。
  子进程处理完任务后再将结果发送给主进程。所以可以大大提升 Webpack 的项目构件速度。
  查看happypack的github,发现作者已经不再维护该插件,并且作者推荐使用webpack官方的多进程插件thread-loader,所以我放弃了happypacy,选择了thread-loader。 thread-loader
  thread-loader  是官方维护的多进程loader,功能类似于happypack,也是通过开启子任务来并行解析文件,从而提高构建速度。
  把这个loader放在其他loader前面。不过该loader是有限制的。示例: loader无法发出文件。 loader不能使用自定义加载器API。 loader无法访问网页包选项。
  每个worker都是一个单独的node.js进程,其开销约为600毫秒。还有进程间通信的开销。在小型项目中使用 thread-loader  可能并不能优化项目的构建速度,反而会拖慢构建速度,所以使用该loader时需要明确项目构建构成中真正耗时的过程。
  我的项目中我主要是用该loader用来解析vue和js文件,作用于 vue-loader  和 babel-loader  ,如下代码: const threadLoader = {   loader: "thread-loader",   options: {     workers: require("os").cpus().length - 1,   } }  module.exports = {   module:{   rules: [       {         test: /.vue$/,         use: [           threadLoader, // vue-loader前使用该loader           {             loader: "vue-loader",             options: vueLoaderConfig           }         ],       },       {         test: /.js$/,         use: [           threadLoader, // babel-loader前使用该loader           {             loader: "babel-loader",             options: {               cacheDirectory: true             }           }         ]       }     ]   } }  复制代码
  配置了 thread-loader  后,重新构建试试,如下图所示,大概缩短了10秒的构建时间,还不错。
  利用缓存提升二次构建的速度
  虽然使用了多进程构建项目使构建时间缩短了10秒,但是一分钟的构建时间依然让人无法接受,这种挤牙膏似的优化方式多少让人有点不爽,有没有比较爽的方法来进一步缩短构建时间呢?
  答案是有的,使用缓存。
  缓存,不难理解就是第一次构建的时候将构建的结果缓存起来,当第二构建时,查看对应缓存是否修改,如果没有修改,直接使用缓存,由此,我们可以想象,当项目的变化不大时,大部分缓存都是可复用的,拿构建的速度岂不是会有质的飞跃。 cache-loader
  说到缓存,当然百度一查,最先出现的就是 cache-loader  ,github搜索下官方文档,得到如下结果:
  该loader会缓存其他loader的处理结果,把该loader放到其他loader的前面,同时该loader保存和读取缓存文件也会有开销,所以建议在开销较大的loader前使用该loader。
  文档很简单,考虑到项目中的 vue-loader  , babel-loader  , css-loader  会有比较大的开销,所以为这些loader加上缓存,那么接下来就把 cache-loader  加到项目中吧: const cacheLoader = {   loader: "cache-loader" }  const threadLoader = {   loader: "thread-loader",   options: {     workers: require("os").cpus().length - 1,   } }  module.exports = {   module:{   rules: [       {         test: /.vue$/,         use: [           cacheLoader,           threadLoader, // vue-loader前使用该loader           {             loader: "vue-loader",             options: vueLoaderConfig           }         ],       },       {         test: /.js$/,         use: [           cacheLoader,           threadLoader, // babel-loader前使用该loader           {             loader: "babel-loader",             options: {               cacheDirectory: true             }           }         ]       }     ]   } }  复制代码
  在 util.js  文件中,该文件主要是生成css相关的webpack配置,找到 generateLoaders  函数,修改如下:   const cacheLoader = {     loader: "cache-loader"   }      function generateLoaders(loader, loaderOptions) {   // 在css-loader前增加cache-loader     const loaders = options.usePostCSS ? [cacheLoader, cssLoader, postcssLoader] : [cacheLoader, cssLoader]      if (loader) {       loaders.push({         loader: loader + "-loader",         options: Object.assign({}, loaderOptions, {           sourceMap: options.sourceMap         })       })     }      // Extract CSS when that option is specified     // (which is the case during production build)     if (options.extract) {       return ExtractTextPlugin.extract({         use: loaders,         fallback: "vue-style-loader",         // 添加这句配置解决element-ui的图标路径问题         publicPath: "../../"       })     } else {       return ["vue-style-loader"].concat(loaders)     }   } 复制代码
  如上配置完成后,再次启动项目,可以发现,现在的启动时间没什么变化,然后我们二次启动项目,可以发现现在的启动时间来到了30s左右,前面我们已经说过了, cache-loader  缓存只有在二次启动的时候才会生效。
  虽然项目启动时间优化了一半还多,但是我们的欲望是无限大的,30秒的时间离我们的预期还是有点差距的,继续优化! hard-source-webpack-plugin
  HardSourceWebpackPlugin  是一个webpack插件,为模块提供中间缓存步骤。为了查看结果,您需要使用此插件运行webpack两次:第一次构建将花费正常的时间。第二次建设将大大加快。
  话不多说,直接配置到项目中: const HardSourceWebpackPlugin = require("hard-source-webpack-plugin"); module.exports = {     //...     plugins: [         new HardSourceWebpackPlugin()     ] } 复制代码
  二次构建时,我们会发现构建时间来到了个位数,只有短短的7秒钟。
  在二次构建中,我发现了一个现象,构建的进度会从10% 一下跳到 80%,甚至是一瞬间就完成了中间构建过程。这正验证了该插件为模块提供中间缓存的说法。
  为模块提供中间缓存,我的理解是cache-loader缓存的是对应loader的处理结果 ,而这个插件甚至可以缓存整个项目全部的处理结果,直接引用最终输出的缓存文件,从而大大提高构建速度。 其他优化方法babel-loader开启缓存
  babel-loader  自带缓存功能,开启 cacheDirectory  配置项即可,官网的说法是,开启缓存会提高大约两倍的转换时间。 module.exports = {   module: {   rules: [       {         test: /.js$/,         use: [           ...           {             loader: "babel-loader",             options: {               cacheDirectory: true // 开启缓存             }           }         ]       }     ]   } }  复制代码uglifyjs-webpack-plugin开启多进程压缩
  uglifyjs-webpack-plugin  或是其他的代码压缩工具都提供了多进程压缩代码的功能,开启可加速代码压缩。 总结
  至此,我们完成了项目构建时间从70s到7s的优化过程,文中主要使用:
  工具
  作用
  优化效果
  thread-loader
  多进程解析文件
  70s -> 60s
  cache-loader
  缓存部分高开销的loader
  60s -> 30s
  hard-source-webpack-plugin
  缓存模块中间过程
  30s -> 7s 最后
  如果你觉得此文对你有一丁点帮助,点个赞。或者可以加入我的开发交流群:1025263163相互学习,我们会有专业的技术答疑解惑
  如果你觉得这篇文章对你有点用的话,麻烦请给我们的开源项目点点star: https://gitee.com/ZhongBangKeJi/CRMEB不胜感激 !

电商不死,中国不富这句话你听说过没?实体店的机会是否来到电商不死,中国不富这句话你听说过没?你看啊,最近马云都承受着巨大的一个压力,就是现在电商遇到了很大的瓶颈,你看今年的双11,是不是觉得,跟往年的双11完全不一样,为啥?这就是传统电战争白热化腾讯半年内起诉抖音168次,索赔金额天价在12月15日中国网络视听协会发布网络短视频内容审核标准细则(2021)对短视频内容一口气提出了100条内容准则之后,21日,腾讯视频起诉抖音,更向法院申请变更诉讼请求,将斗罗大陆日美韩巨头垄断存储芯片,几乎瓜分中国市场,国产闪存换道超车文BU审核子扬校正知秋国产芯片受制于人已经不是什么秘密,尤其是我国在存储芯片领域依赖进口的境况,更是令人痛心。中国存储芯片遭卡脖子作为集成电路市场中占比最大而且也是应用最为广泛的品亚马逊美国站将对补货限制IPI阈值进行更改看早报,知行情,觅商机!1亚马逊美国站将对补货限制IPI阈值进行更改亚马逊美国站发布公告称,从黑色星期五到网络星期一,亚马逊上的中小型卖家创造了超一半的销售额。随着圣诞和元旦的到来密切国际科技交流合作更好造福人类专访一带一路国际科学组织联盟(ANSO)主席白春礼新华社广州12月13日电题密切国际科技交流合作更好造福人类专访一带一路国际科学组织联盟(ANSO)主席白春礼新华社记者王攀马晓澄当今全球科技创新进入密集活跃期,新一轮科技革命和产业华为WATCH3系统升级自定义视频表盘同步手机本地音乐等IT之家8月11日消息华为WATCH3系列智能手表在6月份发布,是该系列的第三代产品。手表包含标准版以及Pro版,升级了健康管理功能,搭载鸿蒙HarmonyOS2系统。昨日,华为官猿派与北京物联网智能技术应用协会成功签约,开展战略合作今天上午(8月10日),猿派与北京物联网智能技术应用协会举行战略合作签约仪式,携手同行,共赢未来。北京物联网智能技术应用协会会长李佳,秘书长李平,猿派CEO张建胜,CMO邹光磊出席人工智能是骗局吗?能感觉到人工智能给日常生活带来的变化吗?当你认为人工智能是骗局的时候,说不定人工智能已经替代了你去做本应该由你来完成的工作!目前,人工智能是一门十分热门的学科,特别是最近几年,人工智能可以用火爆这个词来形容了。像机器视觉什么是布林指标?用布林指标选股需要重点关注哪些要素?谢邀请!BOLL布林线简单含义一般来说布林线是由上中线三条轨道线组合而成,如果结合开关参数就是由四条线组成,上下轨分别与价格平均线构成上限和下限,两个上下限分别被压力线和支撑线包含请查收特斯拉2020年的工作报告从2019年开始,特斯拉会在每年夏秋之际发布上一年的影响力报告。这里的影响力,并非是对品牌声量或者市场销量的吹捧,而是专指对地球自然环境社会产生的正向影响。按照我们一贯的认知,这类中国电信芯片短缺影响上半年5G建设财经网科技8月11日讯,据IT之家消息,中国电信副总经理刘桂清表示,上半年5G是投资大头,包括了3。5GHz和2。1GHz设备的投资。此外,投资进度滞后在一定程度上受全球芯片供应短
1500到2500价位段各手机推荐这个价位段可供选择的机型还是挺多的,有些旗舰机的配置也下放到了这个价位,下面我就给大家推荐几款。1realme真我GTneo2realme真我GTneo2采用了骁龙870处理器,6华为还有5G新机?5G麒麟9000L版Mate40EPro或3月3日开售前几天,有多位爆料博主曾曝光了华为新品发布会的时间,根据熊猫很禿然的爆料,华为将在3月举行新品发布会,届时,除华为Mate40EPro外,华为P50E华为MatePad10。4平板小红书持续打击虚假种草再起诉3家通告平台MCN机构已累计封禁81个品牌及线下机构2月25日,小红书对外宣布,正式对云媒易群量盛世麒麟等3家通告平台和MCN机构提起诉讼。小红书方面表示,这些机构从事代写代发虚假种草笔记的业务,帮助商家及博主进行虚假推广,对平台内前端经典面试题(60道前端面试题包含JSCSSReact浏览器等)简答题1什么是防抖和节流?有什么区别?如何实现?参考答案防抖触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间思路每次触发事件时都取消之前的延时调用马斯克兄弟出售特斯拉股票遭调查中新网2月25日电综合外媒报道,据知情人士透露,美国证券管理委员会(SEC)正在调查特斯拉首席执行官马斯克和其弟弟金巴尔出售的股票是否违反了交易规定。据报道,金巴尔2021年出售了OPPOPad刚发布,小米平板5Pro急速降价,网友买早了2021年8月10日,沉寂3年的小米平板终于回归,小米正式推出小米平板5系列,包含小米平板5小米平板5Pro小米平板5Pro5G三款机型,其中小米平板5Pro采用11英寸大屏骁龙8只需8块钱,改善机械键盘打字音过年的时候,新入手了一把akko的pc75b键盘,感受到了不一样的机械键盘,曾经的机械键盘,并不流行内部填充,更多的是体验手感。但是随着国产轴体和客制化的流行,人们对机械键盘的要求远程开关电脑必备技能,向日葵C1Pro小而强大远程办公的软件一搜一大堆,出于种种考虑,很多人会选择远程控制的方式实现远程办公。在开机状态下,远程控制实现起来比较简单,但让人为难的是,如何在需要远程时,保证电脑是开机状态?其实很c引用详解铺垫变量名实质上是一段连续存储空间的别名,是一个标号程序中通过变量来申请并命名内存空间通过变量的名字可以使用存储空间(能不能再名字的基础上在起个名字?)概念1)可以看做一个已定义变微信最烦人的限制,今天终于解除了喜大普奔!!微信终于支持发送原视频了!!相信很多人都和狐妹一样吐槽过微信的画质劣化过去,微信为了节约服务器流量,一直会对上传的视频进行压缩,哪怕是勾选了原图,好友收到的视频还是会被为什么小米6(664)要2499,而红米4x(464)只要1099呢?欢迎在点击右上角关注太平洋电脑网,更多有趣资讯等着您哦。这是一个比较常见的问题,同样的内存配置或者说差不多的内存配置为什么价格会相差那么多呢?或者说同一个品牌的手机并且配置也是差不