TypeScript

本指南继续沿用 _起步_ 中的代码示例。

TypeScript 是 JavaScript 的超集,为其增加了类型系统,可以编译为普通 JavaScript 代码。这篇指南里我们将会学习是如何将 webpack 和 TypeScript 进行集成。

基础配置

首先,执行以下命令安装 TypeScript compiler 和 loader:

  1. npm install --save-dev typescript ts-loader

现在,我们将修改目录结构和配置文件:

project

  1. webpack-demo
  2. |- package.json
  3. + |- tsconfig.json
  4. |- webpack.config.js
  5. |- /dist
  6. |- bundle.js
  7. |- index.html
  8. |- /src
  9. |- index.js
  10. + |- index.ts
  11. |- /node_modules

tsconfig.json

这里我们设置一个基本的配置,来支持 JSX,并将 TypeScript 编译到 ES5……

  1. {
  2. "compilerOptions": {
  3. "outDir": "./dist/",
  4. "noImplicitAny": true,
  5. "module": "es6",
  6. "target": "es5",
  7. "jsx": "react",
  8. "allowJs": true
  9. }
  10. }

查看 TypeScript 官方文档 了解更多关于 tsconfig.json 的配置选项。

想要了解 webpack 配置的更多信息,请查看 配置 概念。

现在,配置 webpack 处理 TypeScript:

webpack.config.js

  1. const path = require('path');
  2. module.exports = {
  3. entry: './src/index.ts',
  4. module: {
  5. rules: [
  6. {
  7. test: /\.tsx?$/,
  8. use: 'ts-loader',
  9. exclude: /node_modules/
  10. }
  11. ]
  12. },
  13. resolve: {
  14. extensions: [ '.tsx', '.ts', '.js' ]
  15. },
  16. output: {
  17. filename: 'bundle.js',
  18. path: path.resolve(__dirname, 'dist')
  19. }
  20. };

这会让 webpack 直接从 ./index.ts _进入_,然后通过 ts-loader _加载所有的 .ts.tsx 文件,并且在当前目录输出_一个 bundle.js 文件。

loader

ts-loader

在本指南中,我们使用 ts-loader,因为它能够很方便地启用额外的 webpack 功能,例如将其他 web 资源导入到项目中。

source map

想要了解 source map 的更多信息,请查看 开发 指南。

想要启用 source map,我们必须配置 TypeScript,以将内联的 source map 输出到编译后的 JavaScript 文件中。必须在 TypeScript 配置中添加下面这行:

tsconfig.json

  1. {
  2. "compilerOptions": {
  3. "outDir": "./dist/",
  4. + "sourceMap": true,
  5. "noImplicitAny": true,
  6. "module": "commonjs",
  7. "target": "es5",
  8. "jsx": "react",
  9. "allowJs": true
  10. }
  11. }

现在,我们需要告诉 webpack 提取这些 source map,并内联到最终的 bundle 中。

webpack.config.js

  1. const path = require('path');
  2. module.exports = {
  3. entry: './src/index.ts',
  4. + devtool: 'inline-source-map',
  5. module: {
  6. rules: [
  7. {
  8. test: /\.tsx?$/,
  9. use: 'ts-loader',
  10. exclude: /node_modules/
  11. }
  12. ]
  13. },
  14. resolve: {
  15. extensions: [ '.tsx', '.ts', '.js' ]
  16. },
  17. output: {
  18. filename: 'bundle.js',
  19. path: path.resolve(__dirname, 'dist')
  20. }
  21. };

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

使用 third party library

在从 npm 安装 third party library(第三方库) 时,一定要记得同时安装此 library 的类型声明文件(typing definition)。你可以从 TypeSearch 中找到并安装这些第三方库的类型声明文件。

举个例子,如果想安装 lodash 类型声明文件,我们可以运行下面的命令:

  1. npm install --save-dev @types/lodash

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

导入其他资源

想要在 TypeScript 中使用非代码资源(non-code asset),我们需要告诉 TypeScript 推断导入资源的类型。在项目里创建一个 custom.d.ts 文件,这个文件用来表示项目中 TypeScript 的自定义类型声明。我们为 .svg 文件设置一个声明:

custom.d.ts

  1. declare module "*.svg" {
  2. const content: any;
  3. export default content;
  4. }

这里,我们通过指定任何以 .svg 结尾的导入(import),将 SVG 声明(declare) 为一个新的模块(module),并将模块的 content 定义为 any。我们可以通过将类型定义为字符串,来更加显式地将它声明为一个 url。同样的概念适用于其他资源,包括 CSS, SCSS, JSON 等。

构建性能

这可能会降低构建性能。

关于构建工具,请查看 构建性能 指南。


贡献人员

byzyk byzyk kkamali kkamali morsdyce morsdyce mtrivera mtrivera