Webpack4 之 编译Typescript

{app.params.name}} {app.params.name}} {app.params.name}}

TypeScript 是 JavaScript 的超集,为其增加了类型系统,可以编译为普通的 JavaScript 代码。这篇文章里我们将时间 webpack 是如何跟 TypeScript 进行集成。

一如既往的创建项目的流程

mkdir webpack4-typescript-demo
cd webpack4-typescript-demo
npm init -y
npm install webpack webpack-cli --save-dev

构建项目,目录结构如下

├── package.json
├── src
│   └── index.tsx
└── webpack.config.js

基础安装

首先,执行以下命令,安装 TypeScript 编译器和需要的loader:

npm install --save-dev typescript ts-loader

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

├── package.json
├── src
│   └── index.tsx
├── tsconfig.json
└── webpack.config.js

设置一个基本的配置,来支持 JSX,并将 TypeScript 编译到 ES5
tsconfig.json内容如下

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


在 webpack 配置中处理 TypeScript
webpack.config.js

const path = require('path');

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

这会直接将 webpack 的入口起点指定为 ./index.tsx,然后通过 ts-loader _加载所有的 .ts 和 .tsx 文件,并且在当前目录输出_一个 bundle.js 文件。

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

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

{
    "compilerOptions": {
        "outDir": "./dist/",
        "noImplicitAny": true,
        "module": "es6",
        "sourceMap": true, // 添加这行
        "target": "es5",
        "jsx": "react",
        "allowJs": true
    }
}

然后配置webpack,告诉 webpack 提取这些 source map,并内联到最终的 bundle 中。
添加如下

devtool: 'inline-source-map',

代码
webpack.config.js

const path = require('path');

module.exports = {
  entry: './src/index.tsx',
  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')
  }
};

如何使用第三方库

当从 npm 安装第三方库时,一定要牢记同时安装这个库的类型声明文件。你可以从 TypeSearch[http://microsoft.github.io/TypeSearch/] 中找到并安装这些第三方库的类型声明文件。
举个例子,如果想安装 lodash 这个库的类型声明文件,我们可以运行下面的命令:

npm install --save-dev @types/lodash

动手写实例

当前项目目录结构如下

├── dist
│   └── index.html
├── package.json
├── src
│   └── index.tsx
├── tsconfig.json
└── webpack.config.js

添加dist/index.html

<!doctype html>
<html>

<head>
    <title>Webpack - TypeScript</title>
</head>

<body>
    <script src="./bundle.js"></script>
</body>

</html>

src/index.tsx内容如下

import * as _ from "lodash";

function component() {
    var element = document.createElement('div');
    element.innerHTML = _.padStart("Hello TypeScript!", 20, "-");
    return element;
}

document.body.appendChild(component());

运行

npm run build

dist目录会多一个dist文件
使用浏览器打开dist/index.html
会看到输出如下内容

---Hello TypeScript!

项目地址

https://github.com/durban89/webpack4-typescript-demo.git

 


版权声明

durban 创作并维护的 Gowhich 博客采用 创作共用保留署名-非商业-禁止演绎4.0国际许可证。

本文首发于 Gowhich 博客( https://www.gowhich.com ),版权所有,侵权必究。

本文永久链接: https://www.gowhich.com/blog/840

comments powered by Disqus