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

我是如何把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不胜感激 !

RPGMaker推出异世界创造者设定资源免费使用RPGMaker开发商GotchaGotchaGames近日推出了一个异世界创造者(IsekaiCreators)网站,其中包括一个奇幻世界的背景故事设定。该网站还提供许多游戏资源乒坛大冷门!世界第九03惨败00后,女单16强诞生国乒喜忧参半北京时间3月14日,2023乒乓球新加坡大满贯赛女单16强的争夺,最后一场结束的116决赛,爆出了一个超级大冷门,杜凯琹03不敌朱芊曦。杜凯琹是一名来中国香港的名将,世界排名第九位美中不足?巅峰意甲时期AC米兰中荷兰三剑客为何缺个世界杯?足球的世界,人才辈出,每个时期都有时代的球王,第一代球王属于贝利毫无疑问,球王的缔造者,三届世界杯冠军的荣誉加身,无可争议。到70年代的荷兰的克鲁伊夫,80年代的马拉多纳。到21世国际乒联更新排名樊振东孙颖莎继续排名世界第一中新网3月14日电北京时间14日,国际乒联更新今年第11周世界排名。男单方面,樊振东马龙王楚钦继续排名前三位。女单排名中,孙颖莎陈梦王艺迪王曼昱位列前四位。此外,国乒女双孙颖莎王曼中国男乒大捷,3030,世界第一樊振东梁靖崑4将4战4胜北京时间3月14日凌晨,2023年WTT新加坡大满贯捷报频传。男子单打116决赛,出战的4名中国选手取得4胜4胜的霸气战绩。其中,卫冕冠军世界第一樊振东,以30战胜葡萄牙选手蒂亚哥有线电视的9类免费项目近年来,我国的有线电视市场份额出现不断萎缩的趋势。大量的有线电视用户离网不仅有外部竞争对手的原因,同时也有内部对有线电视的管理和策略的问题,其中大家普遍抱怨的资费问题就是其中的核心为什么会得腰椎间盘突出?原来这些坏习惯才是罪魁祸首!腰椎间盘突出是现代人常见的一种脊柱疾病,它不仅影响我们的生活质量,还可能导致严重的健康问题。然而,很多人并不知道什么是腰椎间盘突出,更不知道如何避免它的发生。本文将深入探讨腰椎间盘接班洛里,TyC热刺可能将引进阿根廷国门大马丁,未来几周正式报价TyC消息,热刺正在商讨引进阿根廷国门大马丁,可能未来几周向维拉提出正式报价。随着洛里进入职业生涯后期,热刺希望在本赛季结束后引进他的替代者,他们之前关注的球员包括瓦伦西亚的马马达英国经济学家双循环成中国高质量发展利器外企看好2023火热开端引领未来发展中国日报网3月14日电英国经济学家科林斯皮克曼(ColinSpeakman)为中国日报撰文表示,面对极具挑战性的国际大环境,中国的双循环政策将助力其实现经济增长目标。中国可以通过庞华为P60发布时间官宣LG进军私有5G市场三星挖走台积电前高管1腾讯T13技术大佬黄希彤回应遭裁员05年入职腾讯,腾讯首个Web前端专家,职级T13,到今年1月还是腾讯前端级别最高专家。拥有如此履历的前端大牛黄希彤,在47岁这一年,被曝遭腾讯达艺宣布第三轮IDO上线时间继两轮火爆的IDO之后,达艺官宣第三轮IDO开启时间!第三轮IDO同样面向所有投资者,保证公平发售认购即赚。革命性的去中心化金融产品为用户提供收益,使达艺成为备受瞩目的热门项目。自
华为手机桌面图标,自己动手设计,玩出不同的花样手机上面安装的各个应用图标都是默认的。每天看着这些图标也有厌烦的时候,喜欢折腾手机,喜欢个性的人,会想着改变应用图标,让自己的手机桌面变得与众不同。其实,手机是支持自定义设置图标的新款手机发布后,为什么买的人变少了,主要是这3个原因,涨知识很多细心的网友,可能已经感觉到了,身边买新手机的人越来越少,大家使用的还是以前购买的手机,同时网上也有数据表明,在2021年的第4季度,国产手机的出货量下降了6,同时2022年的第wenno深扒!十个妈妈八个被骗!这四种检测,费钱又坑娃孩子的健康成长,一直是妈妈们最关心的问题。育儿的道路上,总是担心给孩子的不够,一些不良商家便抓住了这一软肋进行忽悠。一些听起来十分高大上的检测其实毫无意义,今天小编就给大家盘点下,8个月宝宝爱吃辅食,奶奶偷偷倒奶,孩子身高体重停止增长中国营养学会建议孩子在一岁之前以奶为主!所以孩子在一岁之前添加的食物叫辅食,所谓的辅食就是辅助的食物,孩子70左右的营养还是来源于母乳或者奶粉!主要是孩子的消化能力还比较弱,所以流春天记得给孩子吃这道莴笋下饭菜,钾含量高,助力孩子成长常言道春令莴笋似黄金,如今正值百花争艳百鸟歌唱的春季,莴笋悄悄地占据了蔬菜市场的C位,怎么能错过它呢?冬季漫长,白菜和萝卜是我们饮食上的主力军,凉拌腌制炖着吃,早就吃得够够的了。春陈三废妻子孕期胖25斤,长期贫血吸氧却坚持顺产,理由令人鼻酸引子陈三废的妻子离预产期越来越近,陈三废每天都会更新视频,跟粉丝做汇报。每天都在营销怀孕,真的好吗?陈三废的妻子陈澄,虽然已经生了2个孩子,但在怀孕期间,还是有很大反应。曾长期吸氧为儿女带孩子,享受的快乐才是人间最美的爱昨晚与小外孙子,在家属院的篮球场上打篮球,哄孩子的同时,我也顺便锻炼了自己,这实在是一个一举两得的好事。这种情景,每周都要有三四天。如果没有小外孙子拽着我玩,我是不可能自己去打篮球童话故事也要与时俱进,融合了奇幻与机械要素,更适合小孩子观看童话故事的过去说起现在观众们所熟悉的那些童话故事,无论是安徒生童话故事还是一千零一夜,事实上都源自于过去的一些口口相传的故事,而这些故事原本的受众并不是对少年儿童来说的,而是一个更孩子沉迷游戏,父母该怎么办,孩子沉迷游戏,这早已是家长们热聊的话题,游戏危害有多大,为什么有那么多的家长反对自家孩子玩游戏。有一个家长这样说道她孩子玩游戏性格变暴躁,内向,基本人性都没有了,一天二十四小时有二滨水休闲产业与文化产业的融合发展导语滨水休闲产业是大旅游产业的一部分,是旅游产业中休闲度假业态的重要内容,与文化产业体育产业休闲渔业度假地产等存在着许多业态融合,是一个综合性的多行业参与的有水域资源特色的旅游休闲维生素缺乏症一览表,看看自己缺什么,不妨了解一下,建议收藏维持机体正常功能所必需,需要量很少,不供给能量,但人体不可缺少,不能在体内合成或合成量太少,需要从食物中摄取,目前发现的维生素大约有14种,可分为脂溶性维生素和水溶性维生素。脂溶性