ts-loader

这是用于 webpackTypeScript 加载器,将 TypeScript 编译成 JavaScript

ts-loader 在内部是调用了 TypeScript 的官方编译器 – tsc。所以,ts-loadertsc 是共享 tsconfig.json

安装

yarn add ts-loader --dev

or

npm install ts-loader --save-dev

如果还没有安装 TypeScript,你需要先安装一下:

yarn add typescript --dev

or

npm install typescript --save-dev

开始

正常使用 webpack 即可。

Options

有两种类型的 OptionsTypeScript options(也称为 “编译器 options” )和 loader optionsTypeScript options 应该通过 tsconfig.json 文件设置。loader options 可以通过 webpack 配置中的 options 属性指定:

module.exports = {...module: {rules: [{test: /\.tsx?$/,use: [{loader: 'ts-loader',options: {transpileOnly: true // 只做语言转换,而不做类型检查}}]}]}
}

transpileOnly 快速构建一个项目。

  • transpileOnly: false
    语言转换 + 类型检查 = 3290 ms

    > webpack --mode production --config ./build/webpack.config.jsclean-webpack-plugin: options.output.path not defined. Plugin disabled...
    asset index.html 327 bytes [emitted]
    asset app.js 89 bytes [emitted] [minimized] (name: main)
    ./src/index.ts 102 bytes [built] [code generated]
    webpack 5.27.2 compiled successfully in 3290 ms
    
  • transpileOnly: true
    only 语言转换 = 598 ms

    > webpack --mode production --config ./build/webpack.config.jsclean-webpack-plugin: options.output.path not defined. Plugin disabled...
    asset index.html 327 bytes [compared for emit]
    asset app.js 89 bytes [compared for emit] [minimized] (name: main)
    ./src/index.ts 102 bytes [built] [code generated]
    webpack 5.27.2 compiled successfully in 598 ms
    
  • transpileOnly: true + fork-ts-checker-webpack-plugin
    transpileOnly: true 配合插件 fork-ts-checker-webpack-plugin,可以补全类型检查的功能。

    npm i fork-ts-checker-webpack-plugin -D
    
    const ForkTsCheckerWebpackPlugin = require("fork-ts-checker-webpack-plugin");
    module.exports = {...plugins:[...new ForkTsCheckerWebpackPlugin()]
    }
    

    这时,你的项目中有类型错误,编译就会报错。

    编译通过耗时:2289 ms。

    > webpack --mode production --config ./build/webpack.config.jsclean-webpack-plugin: options.output.path not defined. Plugin disabled...
    asset index.html 327 bytes [compared for emit]
    asset app.js 89 bytes [emitted] [minimized] (name: main)
    ./src/index.ts 102 bytes [built] [code generated]
    webpack 5.27.2 compiled successfully in 2289 ms
    

awesome-typescript-loader

awesome-typescript-loader 的创建主要是为了加快项目中的编译速度。

ts-loader的主要区别:

  • 更适合与 Babel 集成,使用 Babel 的转义和缓存。
  • 不需要安装独立的插件,就可以把类型检查放在独立进程中。

安装

npm install awesome-typescript-loader --save-dev
module.exports = {...module: {rules: [{test: /\.tsx?$/,use: [{loader: 'awesome-typesscript-loader',options: {transpileOnly: false}}]}]}
}

跑一下

  • transpileOnly: false

    webpack 5.27.2 compiled successfully in 3392 ms
    
  • transpileOnly: true

    webpack 5.27.2 compiled successfully in 2411 ms
  • transpileOnly: true + 自带插件 CheckerPlugin

    webpack 5.27.2 compiled successfully in 2529 ms
    

ts-loader 与 awesome-typescript-loader 编译时间对比

loader 默认配置 transpileOnly transpileObly + 类型检查进程
ts-loader 3200+ 600 2200+
awesome-typescript-loader 3300+ 2400+ 2500+ (类型检查有疏漏)

Babel

为什么有了 Typescript,还需要 Babel?看一下对比:

编译能力 类型检查 插件
tsc ts(x),js(x) --> es 3/5/6…
Babel ts(x),js(x) --> es 3/5/6… 丰富
  • Babel 7 之前,是不支持 TS 的

    编译流程是这样的:TS > TS 编译器 > JS > Babel > JS (再次)

  • Babel 7

    实现了“只有一个 Javascript 编译器” 的梦想!通过允许 Babel 作为唯一的编译器来工作,就再也没必要利用一些复杂的 Webpack 魔法来管理、配置或者合并两个编译器。

Babel 是如何处理 TypeScript 的?

它移除了 TypeScript

是的,它将 TypeScript 全部转换为常规 JavaScript,然后再一如既往的操作。

因为 Babel 的优秀的缓存和单文件散发架构,Babel + TypeScript 的组合套餐会提供了更快的编译。这是 Babel 在编译过程中剥离 TypeScript 的第一个优势。

类型检查 呢?那只在当你准备好的时候进行。这是 Babel 在编译过程中剥离 TypeScript 的第二个优势。

创建一个 babel 工程

// package.json
{...// 指定输出文件 dist,指定扩展名 "ts,tsx""scripts": {"build": "babel src --out-dir dist --extensions \".ts,.tsx\""},..."devDependencies": {"@babel/cli": "^7.13.16","@babel/core": "^7.13.16","@babel/plugin-proposal-class-properties": "^7.13.0",  // 支持类属性"@babel/plugin-proposal-object-rest-spread": "^7.13.8", // 支持剩余扩展操作符"@babel/preset-env": "^7.13.15","@babel/preset-typescript": "^7.13.0" // 编译 ts 文件}
}
// .babellrc
{"presets": ["@babel/preset-env", "@babel/preset-typescript"],"plugins": ["@babel/plugin-proposal-class-properties","@babel/plugin-proposal-object-rest-spread"]
}
// src/index.ts
// 类的属性、剩余扩展操作符,正好对应两个插件
class A {a: number = 1;
}let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4, c: 5 };
let obj = { x, y, ...z };
npm run build> babel src --out-dir dist --extensions ".ts,.tsx"Successfully compiled 1 file with Babel (632ms).

结合 TypeScript

此时,只具备编译功能,再安装 Typescript 补全类型检查功能。

npm i typescript -D
tsc --init
// tsconfig.json
{..."compilerOptions":{"noEmit":true // 不输出文件,只做类型检查}
}

配置一下脚本

// package.json
{..."script":{..."check-type": "tsc --watch"}
}

我们需要新开一个 terminal,跑 npm run check-type,就 ok 。

有四种语法,有两种语法,Babel 无法编译

  • 常量枚举

    const enum A {X,
    }
    
  • 历史遗留风格的 import/export 语法
    import foo = require(...)export = foo

  • namespace 命名空间:
    从 v7.6.0 起,支持 TypeScript 命名空间的编译。

  • 类型断言
    支持 as 方式

如何选择 TypeScript 编译工具

  • 如果没有使用 Babel,首选 TypeScript 自带编译器(配合 ts-loader 使用)
  • 如果项目中有 Babel,安装 @babel/preset-typescript,配合 tsc 做类型检查。
  • 两种编译器不要混用。

End.

TS 编译工具!从 ts-loader 到 Babel相关推荐

  1. 【TS】1552- 浅谈TS运行时类型检查

    What-什么是运行时类型检查? 编译时类型检查(静态类型检查): 在编译阶段对变量类型进行静态检查,编译后的代码不保留任何类型标注信息,对实际代码运行没有影响 运行时类型检查(动态类型检查): 在代 ...

  2. 干货! 快速上手typescript的学习笔记 (对比JS的新特性,环境搭建,webpack配置,ts编译配置)

    前提需要有js的基础 文章目录 TypeScript 产生背景 什么是TypeScript? TypeScript增加了什么 TypeScript开发环境搭建 基本类型 编译文件配置 tsconfig ...

  3. 前端工资涨不上去?可能是你没掌握构建工具:关于 Webpack、Babel、esbuild、Vite、Rollup、Parcel、SWC......的那些事

    每个前端都应该掌握构建工具 大概从 2019 年到现在的这三年多的时间里,构建工具几乎已经成为前端发展最快的一个部分. 构建工具,属于前端工程化领域.而前端工程化,是每一个高级前端开发人员都必须要去深 ...

  4. NEO智能合约反编译工具

    2019独角兽企业重金招聘Python工程师标准>>> 0x00 前言 下拉最后看演示效果.项目地址 本来这应该是一个很和谐的感恩节假期,本来我可以很悠闲的写完所有作业然后随便看点论 ...

  5. TS学习(二) :安装ts与ts配置

    一.安装TypeScript npm i -g typescript 二.安装完成后 创建ts 使用ts语法 可能遇到的报错问题 在啥都没配置的默认情况下,TS会做出下面几种假设: 假设当前的执行环境 ...

  6. Java 反编译工具的使用与对比分析

    前言 Java 反编译,一听可能觉得高深莫测,其实反编译并不是什么特别高级的操作,Java 对于 Class 字节码文件的生成有着严格的要求,如果你非常熟悉 Java 虚拟机规范,了解 Class 字 ...

  7. 【TS】 windows : TS DEMUX

    [H.264]H.264 解析 工具.web解析 [H.264]SPS 计算帧率 [openh264]SPS的 timing_info_present_flag 解析TS 同时, 解析H.264 ,获 ...

  8. 反编译工具jad简单用法

    反编译工具jad简单用法 下载地址: [url]http://58.251.57.206/down1?cid=B99584EFA6154A13E5C0B273C3876BD4CC8CE672& ...

  9. CMake编译工具与项目构建

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 文章导读 本文从C/C++代码的编译过程入手,弄清楚Make与Ma ...

最新文章

  1. IOS中实现设备摇动检测
  2. 清单革命:为什么不仅是工具革命?
  3. nginx 源码调试
  4. c语言中删除有序数组中重复元素,去除有序列表中的重复元素
  5. Excel的html转换成unicode,EXCEL表格中把汉字转换成unicode编码
  6. 在固态硬盘上安装win7后没有声音
  7. php判断是字符串类型,php使用strpos判断字符串中数字类型子字符串出错的解决方法 原创...
  8. java基于ssm的房屋租赁管理系统
  9. 【一起来刷Python题】——09.解决熄灯问题
  10. LeetCode第一题:两数之和(Java)
  11. github:master提交项目到远程仓库出现“There isn’t anything to compare.”
  12. Android 配置引入arr报错解决
  13. 京东出王炸,地下物流要来了!以后快递直接从管道送到家
  14. 聚丙烯酸负载小鼠血清白蛋白(MSA)/大鼠血清白蛋白(RSA)/小麦麦清白蛋白;PAA-MSA/RSA
  15. 真机调试鸿蒙HarmonyOS应用步骤(超详细!!!)
  16. ipad1电池激活(长时间不用,电量过低,无法开机和充电)
  17. 微信小程序带清除按钮和搜索记录的实时搜索页面
  18. 深入理解 font-size
  19. Introduction to Linear Optimization 2.2 极点,顶角与基可行解
  20. 被动信息收集-DNS篇

热门文章

  1. LABVIEW_课堂笔记 随机(十二)变量
  2. java使用md5以及jar包下载
  3. 小i机器人今年利润或破亿 计划明年上市
  4. 软件无线电技术简介及特点应用
  5. Python的安装及环境配置
  6. 中国医科大学网络教育计算机应用基础试题,作业与试题选集1906 中国医科大学《计算机应用基础 》复习题.docx...
  7. 真正内心强大的人是什么样子???
  8. Assertion failed: cond.is_weights() cond.weights().count() == 1 “If condition must be a initia
  9. matlab示波器图形保存,MATLAB中示波器数据的绘图与保存
  10. CRF进行实体的识别