ts-loader
这是用于 webpack 的 TypeScript 加载器,将 TypeScript 编译成 JavaScript。
ts-loader 在内部是调用了 TypeScript 的官方编译器 — tsc。所以,ts-loader 和 tsc 是共享 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
有两种类型的 Options:TypeScript options(也称为 “编译器 options” )和 loader options。TypeScript 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.js clean-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.js clean-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.js clean-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: falsewebpack 5.27.2 compiled successfully in 3392 ms 复制代码 -
transpileOnly: truewebpack 5.27.2 compiled successfully in 2411 ms 复制代码 -
transpileOnly: true+ 自带插件CheckerPluginwebpack 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 为什么在编译过程中剥离 TypeScript?
-
基于
Babel的优秀的缓存和单文件散发架构,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.





















![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)