最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • TS 编译工具!从 ts-loader 到 Babel

    正文概述 掘金(荷包蛋卷)   2021-04-24   855

    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.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: 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默认配置transpileOnlytranspileObly + 类型检查进程
    ts-loader3200+6002200+awesome-typescript-loader3300+2400+2500+ (类型检查有疏漏)

    Babel

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

    编译能力类型检查插件
    tscts(x),js(x) --> es 3/5/6...Babelts(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

    1. 基于 Babel 的优秀的缓存和单文件散发架构,Babel + TypeScript 的组合套餐会提供了更快的编译。

    2. 而 类型检查 呢? 那只在当你准备好的时候进行。

    创建一个 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

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元