当前位置: 首页 > news >正文

工程优化暨babel升级小记

小记背景

随着业务代码的增多,项目代码的编译时长也在增多,遂针对这个痛点在dev下做些优化

第一部分:优化dev编译时间

这里优化的主要思路是在dev环境下,单独出来一个dll配置文件,将项目中的部分依赖包写入配置文件,最终生成一个在dev环境下专用的dll文件,这样处理的目的是减少开发时的编译时间(ps:经测试可以提升50%左右的编译效率),具体修改如下:

  • 独立dev的dll配置

拷贝一份当前的dll.config.js文件,并重命名为开发环境专用dll-dev.config.js,并进行如下修改:

// dll-dev.config.js
module.exports = {
  entry: {
    vendor: [
      'moment',
      'nprogress',
      'cookie_js',
      'echarts',
      'jsbarcode',
      'lodash',
      'lodash-decorators',
      'isomorphic-fetch',
      'antd',
      'react',
      'react-dom',
      'react-router',
      'react-router-redux',
      'redux',
      'redux-fetch-elegant',
      'redux-logger',
      'redux-thunk'
      ...
    ]
  }
}
  • 修改开发环境配置文件webpack.dev.config.js

  • 增加一条package.json命令,用于单独生成dev环境下的dll文件
"scripts": {
  "dll-dev": "./node_modules/.bin/webpack --config dll-dev.config.js",
}

dev环境下执行这条新的命令行生成dll文件以及对应的json映射文件,以便省去dev下一些import进来的包文件编译,从而减少工程的整体编译时长

npm run dll-dev

第二部分:工程升级到babel@7+

升级package依赖包 & 去除冗余

and

这里删除了'babel-preset-stage-2',因为为了避免概念模糊不清以及防止出现由于提案的删除或变更而导致不可预见问题,故而babel@7+中删除了阶段预设。

其他依赖包从v@6+升级到v@7+,并采用babel@7+中的最新官方包名称。
用于antd按需加载的babel-plugin-import也需要跟着babel进行升级到1.11.0,因为配置语法和资源的目录名称都改变了(详见babel.config.js)。

修改babel配置文件

在babel@7+中,增加了一个新的配置文件babel.config.js,这样可以让配置文件变得更加灵活,更适合babel所采用的monorepo管理,比如可以将配置集中在所有包中、也可以为每一个包单独创建配置,我们这里采用这个配置文件,因为需要在config里写一些判断逻辑,以实现dev和pro的更深层次隔离

ps:详细的配置官方说明详见6.x vs 7.x

新的babel配置文件如下:

// babel.config.js
module.exports = function (api) {
  api.cache(true)
  const presets = [
    '@babel/preset-env',
    '@babel/react'
  ]
  const plugins = [
    ['@babel/plugin-transform-runtime', {
      'helpers': false,
      'regenerator': true
    }],
    ['@babel/plugin-proposal-class-properties', { 'loose': true }],
    ['import', {
      'libraryName': 'antd',
      'libraryDirectory': 'lib',
      'style': 'css'
    }, 'ant']
  ]
  return {
    presets,
    plugins
  }
}

编译测试对比

使用同一台电脑及开发环境进行测试比较

升级前执行编译耗时如下:

升级后执行编译耗时如下:

升级前进行修改保存耗时如下:

升级后进行修改保存耗时如下:

相关文章:

  • poj 3280【区间dp】
  • iOS 9以上系统 信任的企业级开发者证书
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • volatile
  • 自定义主题
  • python爬微信公众号前10篇历史文章(1)-思路概览
  • windows server 2008R2 域控迁移到 windows server 2012域控
  • 自学web前端课程大纲分享,适合所有人学习
  • 每个 node 应用可能存在的 timing-attack 安全漏洞
  • 自己做的js甘特图插件
  • 流式计算与计算抽象化------《Designing Data-Intensive Applications》读书笔记15
  • codis proxy处理流程
  • 【异周话题 第 20 期】三年后,人工智能将彻底改变前端开发?
  • IOS评论框不贴底(ios12新bug)
  • iOS点击获取短信验证码按钮
  • Android优雅地处理按钮重复点击
  • Git同步原始仓库到Fork仓库中
  • golang中接口赋值与方法集
  • Intervention/image 图片处理扩展包的安装和使用
  • iOS小技巧之UIImagePickerController实现头像选择
  • Java IO学习笔记一
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • passportjs 源码分析
  • PHP 的 SAPI 是个什么东西
  • python 学习笔记 - Queue Pipes,进程间通讯
  • React Native移动开发实战-3-实现页面间的数据传递
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Transformer-XL: Unleashing the Potential of Attention Models
  • Vim Clutch | 面向脚踏板编程……
  • Vue官网教程学习过程中值得记录的一些事情
  • webpack4 一点通
  • 多线程事务回滚
  • 服务器之间,相同帐号,实现免密钥登录
  • 规范化安全开发 KOA 手脚架
  • 基于遗传算法的优化问题求解
  • 力扣(LeetCode)357
  • 前端工程化(Gulp、Webpack)-webpack
  • 深度学习入门:10门免费线上课程推荐
  • 提醒我喝水chrome插件开发指南
  • 听说你叫Java(二)–Servlet请求
  • ​iOS安全加固方法及实现
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • # Panda3d 碰撞检测系统介绍
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (HAL库版)freeRTOS移植STMF103
  • (zhuan) 一些RL的文献(及笔记)
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】