用Webpacker来实现React + TypeScript

在本文中,我们将介绍如何在Rails上通过Webpacker启用TypeScript,并构建React + TypeScript开发环境。

环境

Rails5.1.4、Webpacker 3.0.2、TypeScript 2.6.1。

操作步骤

安装Webpacker

gem 'webpacker', '~> 3.0'
$ bundle install 
$ bundle exec rails webpacker:install
$ bundle exec rails webpacker:install:react

安裝TypeScript相關的套件

$ yarn add ts-loader typescript @types/react @types/react-dom
    • ts-loader => Webpacker でデフォルトで採用されている TypeScript 用の loader。(loaderの設定は、node_modules/@rails/webpacker/package/loaders/typescript.js に記述されている。)

 

    • typescript => typescript 本体。

 

    @types/react, @types/react-dom => react, react-dom の型定義ファイル。

创建tsconfig.json文件

在tsconfig.json中定义TypeScript的编译器选项。
在项目根目录下运行以下命令,将创建tsconfig.json。

$ node_modules/typescript/bin/tsc --init

作为最低设定,我们启用以下选项。

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "jsx": "react",
    "sourceMap": true,
    "strict": true,
    "noImplicitAny": true
  }
}
    • tsconfig.json の詳細についてはこちらを参照してください。

 

    compilerOptionsの詳細については、こちらを参照してください。

使Webpacker能够处理.tsx文件。

在 config/webpacker.yml 文件的 extensions 中添加扩展名 [.tsx]。

  # 省略
  extensions:
    - .coffee
    - .erb
    - .js
    - .jsx
    - .ts
    - .tsx # 追加

自己的备忘录:webpack的resolve.extensions选项用于自动解析在模块导入时指定的扩展名。查看源代码以确认Webpacker如何解释这个设置。

设置已经完成!

我們立即使用 `webpacker:install:react` 任務自動生成的 `hello_react.js` 檔案,用 TypeScript 進行重寫。

import * as React from "react"
import * as ReactDOM from "react-dom"

interface HelloProps {
  name: string;
}

const Hello: React.SFC<HelloProps> = (props) => (
  <div>Hello {props.name}!</div>;
)

Hello.defaultProps = {
  name: "David",
}

document.addEventListener("DOMContentLoaded", () => {
  ReactDOM.render(
    <Hello name="React" />,
    document.body.appendChild(document.createElement("div")),
  )
})

当在 View 中执行<%= javascript_pack_tag “hello_react” %>时,可以查看结果。

也许光凭这句话并不能很好地传达出 TypeScript 的强大之处… 但是,如果你正在开发相当规模的应用程序,仅仅定义 props 的类型就能带来相当多的好处。

尝试更改TypeScript的加载程序

这次我们使用了 ts-loader 作为 TypeScript 的加载器,但当然,TypeScript 的加载器不仅仅是 ts-loader。
试一下,我们来切换到 awesome-typescript-loader。

(有关 at-loader 和 ts-loader 的区别,请参考此处。)

设置非常简单,只需要在Webpacker的配置文件中,覆盖node_modules/@rails/webpacker/package/loaders/typescript.js文件的设置。

const environment = require('./environment')

// 追加
environment.loaders.set('typescript', {
  test: /\.tsx?$/,
  use: 'awesome-typescript-loader'
})
// 追加ここまで

module.exports = environment.toWebpackConfig()

总结

Webpacker是一个非常棒的产品,让你可以轻松地使用TypeScript编写React(当然也包括Vue和Angular)应用程序,而无需担心繁琐的配置。

不管是想尝试 TypeScript 的人(当然,还包括想制作大规模单页应用的人!),首先可以尝试在 Rails 上小规模开始,这样会很好。

请参考