Webpack TypeScript

2023-05-18 12:01 更新

TypeScript 是 JavaScript 的超集,為其增加了類(lèi)型系統(tǒng),可以編譯為普通 JavaScript 代碼。這篇指南里我們將會(huì)學(xué)習(xí)是如何將 webpack 和 TypeScript 進(jìn)行集成。

基礎(chǔ)配置

首先,執(zhí)行以下命令安裝 TypeScript compiler 和 loader:

npm install --save-dev typescript ts-loader

現(xiàn)在,我們將修改目錄結(jié)構(gòu)和配置文件:

project

  webpack-demo
  |- package.json
  |- package-lock.json
+ |- tsconfig.json
  |- webpack.config.js
  |- /dist
    |- bundle.js
    |- index.html
  |- /src
    |- index.js
+   |- index.ts
  |- /node_modules

tsconfig.json

這里我們?cè)O(shè)置一個(gè)基本的配置來(lái)支持 JSX,并將 TypeScript 編譯到 ES5……

{
  "compilerOptions": {
    "outDir": "./dist/",
    "noImplicitAny": true,
    "module": "es6",
    "target": "es5",
    "jsx": "react",
    "allowJs": true,
    "moduleResolution": "node"
  }
}

查看 TypeScript 官方文檔 了解更多關(guān)于 tsconfig.json 的配置選項(xiàng)。

想要了解 webpack 配置的更多信息,請(qǐng)查看 配置 概念。

現(xiàn)在,配置 webpack 處理 TypeScript:

webpack.config.js

const path = require('path');

module.exports = {
  entry: './src/index.ts',
  module: {
    rules: [
      {
        test: /\.tsx?$/,
        use: 'ts-loader',
        exclude: /node_modules/,
      },
    ],
  },
  resolve: {
    extensions: ['.tsx', '.ts', '.js'],
  },
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist'),
  },
};

這會(huì)讓 webpack 直接從 ./index.ts 進(jìn)入,然后通過(guò) ts-loader 加載所有的 .ts 和 .tsx 文件,并且在當(dāng)前目錄輸出一個(gè) bundle.js 文件。

現(xiàn)在讓我們改變 lodash 在 ./index.ts 文件中的引入, 因?yàn)樵?nbsp;lodash 的定義中沒(méi)有默認(rèn)(default)的導(dǎo)出。

./index.ts

- import _ from 'lodash';
+ import * as _ from 'lodash';

  function component() {
    const element = document.createElement('div');

    element.innerHTML = _.join(['Hello', 'webpack'], ' ');

    return element;
  }

  document.body.appendChild(component());

Loader

ts-loader

在本指南中,我們使用 ts-loader,因?yàn)樗軌蚝芊奖愕貑⒂妙~外的 webpack 功能,例如將其他 web 資源導(dǎo)入到項(xiàng)目中。

請(qǐng)注意,如果您已經(jīng)在使用? babel-loader? 來(lái)轉(zhuǎn)譯您的代碼,您可以使用? @babel/preset-typescript? 來(lái)讓Babel處理您的JavaScript和TypeScript文件,而無(wú)需使用額外的加載器。請(qǐng)記住,與ts-loader相反,底層的 @babel/plugin-transform-typescript? 插件不會(huì)執(zhí)行任何類(lèi)型檢查。

Source Maps

想要了解 source map 的更多信息,請(qǐng)查看 開(kāi)發(fā) 指南。

想要啟用 source map,我們必須配置 TypeScript,以將內(nèi)聯(lián)的 source map 輸出到編譯后的 JavaScript 文件中。必須在 TypeScript 配置中添加下面這行:

tsconfig.json

  {
    "compilerOptions": {
      "outDir": "./dist/",
+     "sourceMap": true,
      "noImplicitAny": true,
      "module": "commonjs",
      "target": "es5",
      "jsx": "react",
      "allowJs": true,
      "moduleResolution": "node",
    }
  }

現(xiàn)在,我們需要告訴 webpack 提取這些 source map,并內(nèi)聯(lián)到最終的 bundle 中。

webpack.config.js

  const path = require('path');

  module.exports = {
    entry: './src/index.ts',
+   devtool: 'inline-source-map',
    module: {
      rules: [
        {
          test: /\.tsx?$/,
          use: 'ts-loader',
          exclude: /node_modules/,
        },
      ],
    },
    resolve: {
      extensions: [ '.tsx', '.ts', '.js' ],
    },
    output: {
      filename: 'bundle.js',
      path: path.resolve(__dirname, 'dist'),
    },
  };

查看 devtool 文檔以了解更多信息。

Client types

你可以在 TypeScript 代碼中使用 webpack 特定的特性,比如 import.meta.webpack。并且 webpack 也會(huì)為它們提供類(lèi)型支持,只需要添加一個(gè) TypeScript reference 聲明:

/// <reference types="webpack/module" />
console.log(import.meta.webpack); // 沒(méi)有上面的聲明的話(huà),TypeScript 會(huì)拋出一個(gè)錯(cuò)誤

使用第三方類(lèi)庫(kù)

在從 npm 安裝 third party library(第三方庫(kù)) 時(shí),一定要記得同時(shí)安裝此 library 的類(lèi)型聲明文件(typing definition)。你可以從 TypeSearch 中找到并安裝這些第三方庫(kù)的類(lèi)型聲明文件。

舉個(gè)例子,如果想安裝 lodash 類(lèi)型聲明文件,我們可以運(yùn)行下面的命令:

npm install --save-dev @types/lodash

想了解更多,可以查看 這篇文章。

導(dǎo)入其他資源

想要在 TypeScript 中使用非代碼資源(non-code asset),我們需要告訴 TypeScript 推斷導(dǎo)入資源的類(lèi)型。在項(xiàng)目里創(chuàng)建一個(gè) ?custom.d.ts? 文件,這個(gè)文件用來(lái)表示項(xiàng)目中 TypeScript 的自定義類(lèi)型聲明。我們?yōu)?nbsp;.svg 文件設(shè)置一個(gè)聲明:

custom.d.ts

declare module '*.svg' {
  const content: any;
  export default content;
}

H 這里,我們通過(guò)指定任何以 .svg 結(jié)尾的導(dǎo)入(import),將 SVG 聲明(declare) 為一個(gè)新的模塊(module),并將模塊的 content 定義為 any。我們可以通過(guò)將類(lèi)型定義為字符串,來(lái)更加顯式地將它聲明為一個(gè) url。同樣的概念適用于其他資源,包括 CSS, SCSS, JSON 等。

構(gòu)建性能

關(guān)于構(gòu)建工具,請(qǐng)查看 構(gòu)建性能 指南。


以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)