解决vue cli使用typescript后打包巨慢的问题


Posted in Javascript onSeptember 30, 2019

前言

最近新开了一个项目,虽然用的是 vue 技术栈,但是为了项目的健壮性,还是强上了 typescript, 于是引出了下面的问题。

问题

之前使用过 ts-loader 打包 react 项目,给我的感觉就是巨慢,开发环境下,每次保存后,需要等10秒钟左右才能构建完成,当时为了解决这个问题,把 ts-loader 替换成了 babel 的 typescript 插件,结果是非常的快,每次保存一秒中之内就能完成构建。这次在 vue 中使用 typescript,开发环境下还算快,但是构建生产包时,进程都能够被卡死,体验非常糟糕,接下来讲解如何替换 typescript 构建工具。

替换 ts-loader

修改 vue webpack 配置之前,我们需要知道 vue 是如何配置 ts-loader的,运行如下代码,输出 webpack 配置文件:

vue inspect > output.js

打开 output.js 搜索 ts-loader,可以看到如下配置:

/* config.module.rule('ts') */
{
  test: /\.ts$/,
  use: [
  /* config.module.rule('ts').use('cache-loader') */
  {
    loader: 'cache-loader',
    options: {
    cacheDirectory: '/Users/edz/Desktop/project/senguo/cashier-admin/node_modules/.cache/ts-loader',
    cacheIdentifier: 'aee3033a'
    }
  },
  /* config.module.rule('ts').use('babel-loader') */
  {
    loader: 'babel-loader'
  },
  /* config.module.rule('ts').use('ts-loader') */
  {
    loader: 'ts-loader',
    options: {
    transpileOnly: true,
    appendTsSuffixTo: [
      '\\.vue$'
    ],
    happyPackMode: false
    }
  }
  ]
},
/* config.module.rule('tsx') */
{
  test: /\.tsx$/,
  use: [
  /* config.module.rule('tsx').use('cache-loader') */
  {
    loader: 'cache-loader',
    options: {
    cacheDirectory: '/Users/edz/Desktop/project/senguo/cashier-admin/node_modules/.cache/ts-loader',
    cacheIdentifier: 'aee3033a'
    }
  },
  /* config.module.rule('tsx').use('babel-loader') */
  {
    loader: 'babel-loader'
  },
  /* config.module.rule('tsx').use('ts-loader') */
  {
    loader: 'ts-loader',
    options: {
    transpileOnly: true,
    happyPackMode: false,
    appendTsxSuffixTo: [
      '\\.vue$'
    ]
    }
  }
  ]
}

可以看到使用到了 ts-loader, 同时还使用到了 babel, 这倒是为我们后期的配置提供了不少方便。

首先删除 ts-loader 的配置,因为 vue webpack 的配置使用的是 webpack-chain,所以这里也需要用到这个工具才能进行修改,代码如下:

// vue.config.js

module.exports = {
  chainWebpack: config => {
    config.module.rule('ts').uses.delete('ts-loader')
    config.module.rule('tsx').uses.delete('ts-loader')
  }
}

接着安装 babel 的 typescript 插件

yarn add @babel/preset-typescript @babel/plugin-transform-typescript

然后修改 babel.config.js 如下:

module.exports = {
  presets: [
    '@vue/app',
    "@babel/preset-typescript"
  ],
  plugins: [
    "@babel/plugin-transform-typescript"
  ]
}

如果你在代码中使用到了 jsx, 那么可能还需要添加如下配置项,反正我是遇到了解析 jsx 出错的问题。

module.exports = {
  presets: [
    '@vue/app',
    ["@babel/preset-typescript", {
      "allExtensions": true,
      "isTSX": true
    }],
  ],
  plugins: [
    "@babel/plugin-transform-typescript"
  ]
}

最后再打包,嗯~ 比之前快多了!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
遍历jquery对象的代码分享
Nov 02 Javascript
js实现简洁的TAB滑动门效果代码
Sep 06 Javascript
Bootstrap Navbar Component实现响应式导航
Oct 08 Javascript
JS遍历对象属性的方法示例
Jan 10 Javascript
vuejs父子组件通信的问题
Jan 11 Javascript
js+html5实现复制文字按钮
Jul 15 Javascript
vue中引用阿里字体图标的方法
Feb 10 Javascript
详解vue.js下引入百度地图jsApi的两种方法
Jul 27 Javascript
JavaScript实现的拼图算法分析
Feb 13 Javascript
JavaScript判断对象和数组的两种方法
May 31 Javascript
聊聊vue 中的v-on参数问题
Jan 29 Vue.js
vue基于Teleport实现Modal组件
May 31 Vue.js
laravel实现中文和英语互相切换的例子
Sep 30 #Javascript
JavaScript键盘事件响应顺序详解
Sep 30 #Javascript
vue自动化路由的实现代码
Sep 30 #Javascript
js实现图片上传即时显示效果
Sep 30 #Javascript
vue实现select下拉显示隐藏功能
Sep 30 #Javascript
createObjectURL方法实现本地图片预览
Sep 30 #Javascript
微信小程序实现分享商品海报功能
Sep 30 #Javascript
You might like
基于empty函数的判断详解
2013/06/17 PHP
PHP面向对象程序设计组合模式与装饰模式详解
2016/12/02 PHP
php 类中的常量、静态属性、非静态属性的区别
2017/04/09 PHP
JavaScript设置首页和收藏页面的小例子
2013/11/11 Javascript
js实现字符串的16进制编码不加密
2014/04/25 Javascript
jQuery垂直多级导航菜单代码分享
2015/08/18 Javascript
javascript中SetInterval与setTimeout的定时器用法
2015/08/24 Javascript
浅谈JQuery+ajax+jsonp 跨域访问
2016/06/25 Javascript
浅谈react受控组件与非受控组件(小结)
2018/02/09 Javascript
json对象及数组键值的深度大小写转换问题详解
2018/03/30 Javascript
Vue运用transition实现过渡动画
2019/05/06 Javascript
echarts统计x轴区间的数值实例代码详解
2019/07/07 Javascript
bootstrap table插件动态加载表头
2019/07/19 Javascript
基于Web Audio API实现音频可视化效果
2020/06/12 Javascript
vue 实现根据data中的属性值来设置不同的样式
2020/08/04 Javascript
Vue触发input选取文件点击事件操作
2020/08/07 Javascript
[02:52]2014DOTA2西雅图国际邀请赛 CIS战队巡礼
2014/07/07 DOTA
[56:46]Liquid vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
有关wxpython pyqt内存占用问题分析
2014/06/09 Python
Python使用scrapy采集数据过程中放回下载过大页面的方法
2015/04/08 Python
学习python之编写简单乘法口诀表实现代码
2016/02/27 Python
实例讲解Python中global语句下全局变量的值的修改
2016/06/16 Python
详解Python pygame安装过程笔记
2017/06/05 Python
Python Pandas批量读取csv文件到dataframe的方法
2018/10/08 Python
使用python PIL库实现简单验证码的去噪方法步骤
2019/05/10 Python
Python实现的文轩网爬虫完整示例
2019/05/16 Python
浅谈python中统计计数的几种方法和Counter详解
2019/11/07 Python
Python-Flask:动态创建表的示例详解
2019/11/22 Python
Python实现鼠标自动在屏幕上随机移动功能
2020/03/14 Python
Django前后端分离csrf token获取方式
2020/12/25 Python
从一次项目重构说起CSS3自定义变量在项目的使用方法
2021/03/01 HTML / CSS
巴西体育用品商店:Lojão dos Esportes
2018/07/21 全球购物
音乐器材管理制度
2014/01/31 职场文书
2014年征兵标语
2014/06/20 职场文书
乡镇党建工作汇报材料
2014/08/14 职场文书
办公用品管理制度
2015/08/04 职场文书