Closed5

TypeScriptのts-nodeでのコマンドライン実行からnpmパッケージを使ってみる

suzuki-navisuzuki-navi

npmのパッケージはなんでもいいが、試しにこれを使ってみる。

https://github.com/chalk/chalk

$ npm install ts-node chalk

package.json

{
  "dependencies": {
    "chalk": "^5.3.0",
    "ts-node": "^10.9.1"
  }
}

main.ts

import chalk from 'chalk';

console.log(chalk.blue('Hello world!'));
$ npx ts-node main.ts

以下のようなエラーが出る。

Error [ERR_REQUIRE_ESM]: require() of ES Module /home/ec2-user/foo/node_modules/chalk/source/index.js from /home/ec2-user/foo/main.ts not supported.
suzuki-navisuzuki-navi

tsconfig.json を作成し、以下の内容にする。

{
  "compilerOptions": {
    "module": "esnext",
  },
}
/home/ec2-user/foo/node_modules/ts-node/src/index.ts:859
    return new TSError(diagnosticText, diagnosticCodes, diagnostics);
           ^
TSError: ⨯ Unable to compile TypeScript:
main.ts:1:19 - error TS2792: Cannot find module 'chalk'. Did you mean to set the 'moduleResolution' option to 'nodenext', or to add aliases to the 'paths' option?

1 import chalk from 'chalk';
suzuki-navisuzuki-navi

言われた通り tsconfig.json"moduleResolution": "nodenext" を追記する。

{
  "compilerOptions": {
    "module": "esnext",
    "moduleResolution": "nodenext"
  },
}

別のエラーになる。

(node:43) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)
/home/ec2-user/foo/main.ts:1
import chalk from 'chalk';
^^^^^^

SyntaxError: Cannot use import statement outside a module
suzuki-navisuzuki-navi

package.json"type": "module" を追記する。

{
  "type": "module",
  "dependencies": {
    "chalk": "^5.3.0",
    "ts-node": "^10.9.1"
  }
}

別のエラーになる。

TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for /home/ec2-user/foo/main.ts
suzuki-navisuzuki-navi

実行コマンドを npx ts-node main.ts ではなく node --loader ts-node/esm main.ts にしたら、できた。

$ node --loader ts-node/esm main.ts
(node:30) ExperimentalWarning: Custom ESM Loaders is an experimental feature and might change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
Hello world!

ちなみに npx ts-node --esm main.ts では解決しなかった。なぜだろう。

このスクラップは2023/07/09にクローズされました