解决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 相关文章推荐
Javascript 遮罩层和加载效果代码
Aug 01 Javascript
JSON格式化输出
Nov 10 Javascript
使用PBFunc在Powerbuilder中支付宝当面付款功能
Oct 01 Javascript
jQuery控制控件文本的长度的操作方法
Dec 05 Javascript
vue-router单页面路由
Jun 17 Javascript
老生常谈JavaScript面向对象基础与this指向问题
Oct 16 Javascript
jquery实现点击a链接,跳转之后,该a链接处显示背景色的方法
Jan 18 jQuery
vue动画之点击按钮往上渐渐显示出来的实例
Sep 29 Javascript
微信小程序实现预览图片功能
Oct 22 Javascript
React父子组件间的传值的方法
Nov 13 Javascript
vue+axios实现post文件下载
Sep 25 Javascript
Vite和Vue CLI的优劣
Jan 30 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
PHP生成随机密码类分享
2014/06/25 PHP
ThinkPHP空模块和空操作详解
2014/06/30 PHP
php+mysql开发的最简单在线题库(在线做题系统)完整案例
2019/03/30 PHP
laravel5.1框架model类查询的实现方法
2019/10/08 PHP
css图片自适应大小
2007/11/28 Javascript
JavaScript实现x秒后自动跳转到一个页面
2013/01/03 Javascript
JavaScript如何从listbox里同时删除多个项目
2013/10/12 Javascript
jQuery中end()方法用法实例
2015/01/08 Javascript
JavaScript中实现单体模式分享
2015/01/29 Javascript
JS实现鼠标滑过折叠与展开菜单效果代码
2015/09/06 Javascript
使用jQuery制作基础的Web图片轮播效果
2016/04/22 Javascript
Angular2学习教程之TemplateRef和ViewContainerRef详解
2017/05/25 Javascript
vue+element UI实现树形表格带复选框的示例代码
2019/04/16 Javascript
js定义类的方法示例【ES5与ES6】
2019/07/30 Javascript
[02:34]DOTA2英雄基础教程 幽鬼
2014/01/02 DOTA
跟老齐学Python之变量和参数
2014/10/10 Python
Python判断变量是否为Json格式的字符串示例
2017/05/03 Python
python实现百度语音识别api
2018/04/10 Python
PyQt5 pyqt多线程操作入门
2018/05/05 Python
python读取word文档,插入mysql数据库的示例代码
2018/11/07 Python
python 重命名轴索引的方法
2018/11/10 Python
pyqt 多窗口之间的相互调用方法
2019/06/19 Python
python实现beta分布概率密度函数的方法
2019/07/08 Python
python实现对图片进行旋转,放缩,裁剪的功能
2019/08/07 Python
查看端口并杀进程python脚本代码
2019/12/17 Python
python 计算概率密度、累计分布、逆函数的例子
2020/02/25 Python
HTML5 Canvas 实现K线图的示例代码
2019/12/23 HTML / CSS
Smashbox官网:美国知名彩妆品牌
2017/01/05 全球购物
Linux常见面试题
2016/10/04 面试题
干部作风建设心得体会
2014/10/22 职场文书
2014年度个人工作总结
2014/11/07 职场文书
班级元旦晚会开幕词
2015/01/29 职场文书
Python 如何将integer转化为罗马数(3999以内)
2021/06/05 Python
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
2021/08/07 HTML / CSS
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/06 PostgreSQL
Python使用永中文档转换服务
2022/05/06 Python