昨日の記事を公開したところ、
↓のように、
ライブラリと型定義のimportとで分けている必要はあるのか?
という指摘をいただきました。
const { createConnection } = require("mysql"); // ライブラリのimport import { Connection, MysqlError } from "mysql"; // 型定義のimport
僕も実装をしている際に、以下のような書き方をしようとしましたが、
import * as mysql from "mysql";
トランスパイル後のjsを実行するとランタイムで以下のようなエラーが出てしまいました。
******/ts-mysql/src/index.ts:1 (function (exports, require, module, __filename, __dirname) { import * as mysql from 'mysql'; ^^^^^^ SyntaxError: Unexpected token import at createScript (vm.js:80:10) at Object.runInThisContext (vm.js:139:10) at Module._compile (module.js:607:28) at Module.m._compile (/Users/matsumura/dev/src/github.com/zuckeyM-17/ts-mysql/node_modules/ts-node/src/index.ts:400:23) at Module._extensions..js (module.js:654:10) at Object.require.extensions.(anonymous function) [as .ts] (/Users/matsumura/dev/src/github.com/zuckeyM-17/ts-mysql/node_modules/ts-node/src/index.ts:403:12) at Module.load (module.js:556:32) at tryModuleLoad (module.js:499:12) at Function.Module._load (module.js:491:3) at Function.Module.runMain (module.js:684:10)
tsconfig.json
結論としては、tsconfig.json
のcompilerOptions
中のmodule
の値をes2015
からcommonjs
に変更すると解決しました。
module
TypeScript
公式のcompilerOptions
のリファレンスにおいて、
module
の項には、
target === "ES3" or "ES5" ? "CommonJS" : "ES6"
という記載がされています
トランスパイル先がES5
やそれ以下の場合、CommonJS
を使いましょうということですね。
今回は、サーバサイドで動かすということで、Webpack
やBabel
などを利用せず、Node.js
として動かすという実装だったので、CommonJS
を指定する必要があったようです。
Node.jsとES2015のmoduleのインポートの方法の違い
module
にES2015
を利用するとそれでは普通に使える、import/export
の記法は、そのままスルーされる。 型定義のimport
句については、TypeScript
のトランスパイル時の静的解析に使われるだけなので、ランタイム時には影響がなかった。
ということでした。
つまり、サーバサイドで動かすとしても、Webpack
やBabel
をかませるなどすると、問題なく利用できるようです。
そちらを検討しても良いかもしれません。
まとめ
TypeScript
のみならず、JavaScript
においても、モジュール解決や、import/export
、が実行環境などによってややこしいです。
また、環境設定などは公式や人の記事を見て動けばそのまま使ってしまっていたり、一度固まればあまり振り返る機会がなかったりしていました。
日頃からtsconfig.json
や、webpack.config.js
などなどもやもやしながら使っている部分があるので、もう少ししっかり学習する必要があると感じました。
今回のブログをかけたのは、昨日のブログにたいして指摘いただけたからです。
もしこのブログでも気になる部分がありましたらコメントやTwitterで指摘いただけるとうれしいです。
おまけ
TypeScript
を簡単に実行するために、ts-node
という実行環境を利用しています。
npx ts-node 実行ファイル
とすると、TypeScript
を実行することができます。
しかしながら、この状態では、import
が利用できません。
そのため、import/export
を利用したい場合は、以下のようにproject
オプションを付ける必要があります。
# --project の引数は、tsconfig.jsonへのパス npx ts-node --project tsconfig.json 実行ファイル