We Are JavaScripters!【執筆初心者歓迎】 Advent Calendar 2018 2日目の記事です。
jsの記事はさして読んで嬉しい記事をかけないのですが、初心者歓迎とのことなので書かせていただきます!
今回はReact/Flow製アプリをbcherny/flow-to-typescript
を使ってReact/TypeScriptに変換できるのか試して見ました。
FlowからTSへ移行する際のモチペーションや進める上でのTIPS等はPIXTAさんのFlow から TypeScript に移行しましたが詳しいので、こちらを参照される事をオススメしますw
今回は上記記事にも出てくるbcherny/flow-to-typescript
を実際に使って見たらどんなもんかと思い、試してみたログになります。
やったことは
です。
githubで「react flow」などのキーワードで検索をして程よい規模のリポジトリを見つけたので下記を変換することに決定。
ToDoアプリケーションですね。Forkして作業リポジトリを作る
https://github.com/sizer/mobx-flow-example
とりあえずREADME.md
に書いてあるままに
flow2ts.js
const f2ts = require('flow-to-typescript')
const fs = require('fs')
let path = 'src/index.js'
let file = fs.readFileSync(path, 'utf-8')
f2ts.compile(file, path).then(ts =>
fs.writeFileSync('src/index.ts', ts)
)
実行。
> const f2ts = require('flow-to-typescript')
{ Error: Cannot find module 'flow-to-typescript'
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:587:15)
at Function.Module._load (internal/modules/cjs/loader.js:513:25)
at Module.require (internal/modules/cjs/loader.js:643:17)
at require (internal/modules/cjs/helpers.js:22:18) code: 'MODULE_NOT_FOUND' }
動かない、まじか笑
Continued development / support #1
どうやら開発が止まっているようですねw
(この辺でPIXTAさんの記事を知りましたw)
こちらもForkして動くところまで持って行きました。
@bable/babylon
を使っていたので、現在利用されている@babel/parser
に移行しました。
flow2ts.js
const flow2typescript = require('./flow-to-typescript/dist/src')
const fs = require('fs')
const glob = require('glob')
const path = require('path')
const convertJS2TS = path => path.replace('\.js', '\.ts').replace('src', 'ts')
const compile2TS = (file) => (
flow2typescript.compile(
fs.readFileSync(file, 'utf-8'),
file,
).then(ts => {
fs.promises.mkdir(path.dirname(convertJS2TS(file)), { recursive: true })
return ts
}).then(ts => {
fs.writeFileSync(convertJS2TS(file), ts)
})
)
let pattern = 'src/**/*.js*'
glob(pattern, (_, files) => { files.forEach(file => compile2TS(file)) } )
Forkした方のブランチを相対パス指定することで解決。
無事、.js -> .ts変換できました。
こんな感じでビルドして行きます。
これ、ハマりました。
公式にも書いてあるのですが、
In order to use JSX you must do two things.
- Name your files with a .tsx extension
- Enable the jsx option
TypeScriptはJSXを変換する際は、拡張子が.tsxじゃないといけないのですね、、、
tsconfig.json
に"jsx": "react"
って書いたらイケるのかと思いきや、壊れた.jsファイルとしばらく格闘することになりました :sob:
こちらはやむなく手動で.js->.jsxに変換。
ここまでやってアプリ自体は動くところまできました。
yarn run build
で dist/index.html
にアプリが吐き出される事を確認。
検証がてらやってみましたが、業務でやる内容ではないなーという気はしましたw
手間がかかる割に、成果物の質が低いのでw
PIXTAさんの記事にも書いてありますが、.jsと.ts共存できる環境作って、徐々にFlow製のアプリをTypeScriptに変換するのが吉かな、という印象でした。
以上です。パケットの無駄遣い失礼w