前言

之前写过一篇旧React项目安装并使用TypeScript的文章:在React旧项目中安装并使用TypeScript的实践

博客里使用awesome-typescript-loader对Typescript代码进行检测和转换。

而这几天又修改了一下自己的脚手架,使用@babel/preset-typescript来处理Typescript。

回顾awesome-typescript-loader方案

谈@babel/preset-typescript的优越性之前,还是先说下awesome-typescript-loader方案是如何对TypeScript进行处理的。

首先我们需要知道TypeScript是一个将TypeScript转换为指定版本JS代码的编译器,而Babel同样是一个将新版本JS新语法转换为低版本JS代码的编译器。

所以我们之前的方案每次修改了一点代码,都会将TS代码传递给TypeScript转换为JS,然后再将这份JS代码传递给Babel转换为低版本JS代码。

因此我们需要配置两个编译器,并且每次做了一点更改,都会经过两次编译。

@babel/preset-typescript方案

介绍这个方案之前,我需要列出我参考的一篇译文:[译] TypeScript 和 Babel:一场美丽的婚姻

这里提到这是 TypeScript 和 Babel 团队长达一年的官方合作成果,所以至少我们不用担心这是个野生方案会烂尾。

核心提炼一下:@babel/preset-typescript和@babel/preset-react类似,是将特殊的语法转换为JS。

但是有点区别的是,@babel/preset-typescript是直接移除TypeScript,转为JS,这使得它的编译速度飞快。

并且只需要管理Babel一个编译器就行了,因为我将脚手架中的typescript库卸载后,依然可以完美运行。

而且重要的是你写的TypeScript不会再进行类型检测,使得你改动代码后中断运行的页面。

所以,检测呢?

我写TypeScript就是用来搞类型检测的啊,你安装了TypeScript,写了TS代码然后再用@babel/preset-typescript移除不是多此一举吗?

不,并不是多此一举。

还记得前面那篇译文吗?

它的方案是使用ESLint,用@typescript-eslint配置ESLint来达到检测的目的。

而我们的方案呢?

我们是高贵的VSCode玩家,咱们自带TS检测,所以这一步咱们可以略过。

一些缺陷

上方译文中提到了此方案的以下四个缺陷:

  1. Namespace语法不推荐,改用标准的 ES6 module(import/export)。
  2. 不支持x 语法转换类型,改用x as newtype。
  3. const 枚举
  4. 历史遗留风格的 import/export 语法。比如:import foo = require(...) 和 export = foo。

第1条和第4条不用,而且已经过时了。

第2条缺陷改一下语法就好了,这个语法会直接提示语法报错,很好改,问题不大。

第3条缺陷已经没有了,亲测可用。

替换步骤

要使用@babel/preset-typescript,务必确保你是Babel7+。

如果不是Babel7+用户,可以考虑运行下面的两条命令升级:

npm install babel-upgrade -g

babel-upgrade --write

然后我们安装:

npm i --save @babel/preset-typescript

然后将之前在webpack中配置解析tsx的部分去掉,改为:

module: {
rules: [
//...
{
test: /\.tsx?$/,
exclude: /node_modules/,
loader: 'babel-loader',
options: {
presets: [
'@babel/preset-env',
'@babel/preset-react',
'@babel/preset-typescript'
]
}
}
//...
]
}

Ant Design的按需加载

必须要把这个东西单独拎出来说,太坑了。

之前的方案咱们使用的是ts-import-plugin来处理的。

所以下意识我觉得这个地方会很麻烦,网上搜各种方案。

然而必然是没有答案的,要么就是ts-import-plugin,要么就是和create-react-app结合在一起的那种。

实际上咱们只需要升级一下babel-plugin-import到最新就可以了。

我之前就是因为babel-plugin-import版本太低,导致只对js文件有效,对ts文件无效。

然后配置一下babel-plugin-import即可:

module: {
rules: [
//...
{
test: /\.tsx?$/,
exclude: /node_modules/,
loader: 'babel-loader',
options: {
presets: [
'@babel/preset-env',
'@babel/preset-react',
'@babel/preset-typescript'
],
plugins: [
['import', { libraryName: 'antd', style: 'css' }], // `style: true` 会加载 less 文件
],
}
}
//...
]
}

总结

这次升级花的最多时间就在ant-design的按需加载上,其它的东西其实都很好配置,无非是知识点零散些罢了。

说实话很感谢那篇译文,但是读起来还是觉得有点生硬。

所以另外一个花时间的点,就是如何有条理地把为什么升级阐述清楚。

这里再附上参考项目:脚手架项目

使用@babel/preset-typescript取代awesome-typescript-loader和ts-loader的更多相关文章

  1. typescript精简版1:用ts表示常见数据类型

    一:工程准备: 1.全局安装typescript npm i typescript -g // 或 yarn global add typescript vscode 配置 在命令行执行 tsc -- ...

  2. 001——Typescript 介绍 、Typescript 安 装、Typescript 开发工具

    一. Typescript 介绍 1. TypeScript 是由微软开发的一款开源的编程语言. 4. TypeScript 是 Javascript 的超级,遵循最新的 ES6.Es5 规范.Typ ...

  3. TypeScript 1.7 & TypeScript 1.8

    TypeScript 1.7 & TypeScript 1.8 1 1 https://zh.wikipedia.org/wiki/TypeScript TypeScript是一种由微软开发的 ...

  4. nodejs + typescript + koa + eslint + typescript eslint + prettier + webstorm

    ESLint 安装 yarn add -D eslint 生成配置文件 yarn eslint --init cli 选项 How would you like to use ESLint? To c ...

  5. [TypeScript] Loading Compiled TypeScript Files in Browser with SystemJS

    TypeScript outputs JavaScript, but what are you supposed to do with it? This lesson shows how to tak ...

  6. Node.js + TypeScript + ESM +HotReload ( TypeScript 类型的 Node.js 项目从 CommJS 转为 ESM 的步骤)

    当前 Node.js 版本:v16.14.0 当前 TypeScript 版本:^4.6.3 步骤 安装必要的依赖 yarn add -D typescript ts-node @tsconfig/n ...

  7. [TypeScript] Stopping a TypeScript Build When Errors Are Found

    TypeScript will always compile even if there are ridiculous errors in your project. This lesson show ...

  8. JavaScript 和 TypeScript 交叉口 —— 类型定义文件(*.d.ts)

    在 <从 JavaScript 到 TypeScript 系列> 文章我们已经学习了 TypeScript 相关的知识. TypeScript 的核心在于静态类型,我们在编写 TS 的时候 ...

  9. 玩转TypeScript(2) --简单TypeScript类型

    通过TypeScript的Module和Class,TypeScript提供了相对于javaScript更加清晰的代码构造,相较于javaScript的.js满天飞的代码,用TypeScript,你可 ...

  10. [TypeScript] Use the TypeScript "unknown" type to avoid runtime errors

    The "any" type can be very useful, especially when adding types to an existing JavaScript ...

随机推荐

  1. Python3.7.1学习(二)使用schedule模块定时执行任务

    python中有一个轻量级的定时任务调度的库:schedule.他可以完成每分钟,每小时,每天,周几,特定日期的定时任务.因此十分方便我们执行一些轻量级的定时任务. 1 安装  1.1在cmd中输入p ...

  2. Springboot 系列(十六)你真的了解 Swagger 文档吗?

    前言 目前来说,在 Java 领域使用 Springboot 构建微服务是比较流行的,在构建微服务时,我们大多数会选择暴漏一个 REST API 以供调用.又或者公司采用前后端分离的开发模式,让前端和 ...

  3. Matplotlib入门简介

    Matplotlib是一个用Python实现的绘图库.现在很多机器学习,深度学习教学资料中都用它来绘制函数图形.在学习算法过程中,Matplotlib是一个非常趁手的工具. 一般概念 图形(figur ...

  4. Python 编程语言要掌握的技能之一:善用变量来改善代码质量

    如何为变量起名 在计算机科学领域,有一句著名的格言(俏皮话): There are only two hard things in Computer Science: cache invalidati ...

  5. 2019-10-10:渗透测试,基础学习,mysql语法基础,笔记

    mysql常用命令mysql -u用户名 -p,登录方式也称为,二进制方式exit 退出mysql 查看mysql版本select version(); 查看mysql所有数据库show dateba ...

  6. String字符串为什么不可变的深入理解

    String是被final修饰的,是不可变对象,那么这句什么意思呢.在学习scala时候var,val时候,就想到这个问题,所以记录下 看案例: package com.cxy; import sun ...

  7. RPM命令执行失败:bash: rpm: 未找到命令...

    出现错误截图如下: 这是由于误操作导致rpm文件缺失导致 将另一台完好的服务器上RPM文件及缺失文件上传至异常服务器上即可修复 异常服务器A:192.168.1.230 完好服务器B: 任意 服务器B ...

  8. AI手写输入法 - pytorch从入门到入道(二)

    本章承接上一篇的手写数字识别,利用训练好的模型,结合pyqt画板,实现简易手写输入法,为"hello world"例子增添乐趣. pyqt是开发图形界面的框架,可以百度查找相关资料 ...

  9. Redis系列(四):Redis持久化和主从复制原理

    一.持久化 所谓的持久化就是把内存中的数据写到磁盘中去,防止服务宕机后内存数据丢失.Redis4.0之前提供了两种持久化方式:RDB(默认) 和AOF,Redis4.x之后新增了一种混合持久化(本文所 ...

  10. java中sleep()和wait()区别

    1,sleep方法是Thread类的静态方法,wait()是Object超类的成员方法 2,sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时 ...