解决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 相关文章推荐
select标签模拟/美化方法采用JS外挂式插件
Apr 01 Javascript
js 异步操作回调函数如何控制执行顺序
Dec 24 Javascript
node.js中的fs.chmod方法使用说明
Dec 18 Javascript
Jquery插件easyUi实现表单验证示例
Dec 15 Javascript
JavaScript动态创建div等元素实例讲解
Jan 06 Javascript
loading动画特效小结
Jan 22 Javascript
一次围绕setTimeout的前端面试经验分享
Jun 15 Javascript
vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法
Jan 25 Javascript
Vue项目pdf(base64)转图片遇到的问题及解决方法
Oct 19 Javascript
vue实现简单全选和反选功能
Sep 15 Javascript
js实现购物车商品数量加减
Sep 21 Javascript
原生JS实现弹幕效果的简单操作指南
Nov 10 Javascript
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
收音机频率指针指示不准确和灵敏度低问题
2021/03/02 无线电
php实现汉字验证码和算式验证码的方法
2015/03/07 PHP
PHP开发框架laravel安装与配置教程
2015/03/13 PHP
Zend Framework框架Smarty扩展实现方法
2016/03/22 PHP
PHP中Laravel 关联查询返回错误id的解决方法
2017/04/01 PHP
PHP简单实现防止SQL注入的方法
2018/03/13 PHP
PHP APP微信提现接口代码
2018/09/30 PHP
用javascript自动显示最后更新时间
2007/03/15 Javascript
Javascript中的var_dump函数实现代码
2009/09/07 Javascript
13 个JavaScript 性能提升技巧分享
2012/07/26 Javascript
jquery获得页面元素的坐标值实现思路及代码
2013/04/15 Javascript
html文件中jquery与velocity变量中的$冲突的解决方法
2013/11/01 Javascript
javascript 常用验证函数总结
2016/06/28 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
2016/09/09 Javascript
关于页面刷新vuex数据消失问题解决方案
2017/07/03 Javascript
JavaScript 严格模式(use strict)用法实例分析
2020/03/04 Javascript
vue使用exif获取图片经纬度的示例代码
2020/12/11 Vue.js
Python中返回字典键的值的values()方法使用
2015/05/22 Python
设计模式中的原型模式在Python程序中的应用示例
2016/03/02 Python
Python 使用requests模块发送GET和POST请求的实现代码
2016/09/21 Python
Python list列表中删除多个重复元素操作示例
2019/02/27 Python
使用 Python 清理收藏夹里已失效的网站
2019/12/03 Python
Python实现企业微信机器人每天定时发消息实例
2020/02/25 Python
pandas apply使用多列计算生成新的列实现示例
2021/02/24 Python
css3个性化字体_动力节点Java学院整理
2017/07/12 HTML / CSS
CSS3田字格列表的样式编写方法
2018/11/22 HTML / CSS
HTML5 script元素async、defer异步加载使用介绍
2013/08/23 HTML / CSS
柏林通行证:Berlin Pass
2018/04/11 全球购物
Lentiamo比利时:便宜的隐形眼镜
2020/02/14 全球购物
.net开发工程师面试题
2014/02/25 面试题
《槐乡五月》教学反思
2014/04/25 职场文书
法英专业大学生职业生涯规划范文:衡外情,量己力!
2014/09/23 职场文书
教师党员个人剖析材料
2014/09/29 职场文书
年会邀请函的格式及范文五篇
2019/11/02 职场文书
总结高并发下Nginx性能如何优化
2021/11/01 Servers
悬疑名作《朋友游戏》动画无字ED宣传片 新角色公开
2022/04/13 日漫