generated at
ESM on Deta
DetaESM を使いたい with TypeScript

現状
公式には非対応
いいね↑ボタンをぜひ https://github.com/orgs/deta/discussions/286
ルートの /package.json を "type": "module" にすると Bad Gateway Error
サブフォルダの package.json に {"type": "module"} を入れて CJSな /index.js から await import もだめ
動きそうに思えるが、なぜか node_modules 分が解決できない

workaround
rollup で ESMの部分だけ CJS にバンドルしてやる
@rollup/plugin-node-resolve modulesOnly を指定すると CJS のモジュールは require で解決するようにできる
これで index.js のでかさをある程度抑えられる
ただし Top-level await が依存関係のどこかにいると死ぬ
まあ rollup がエラー吐くのでわかりやすいでしょう
rollup.config.js
rollup.config.js
const typescript = require("@rollup/plugin-typescript") const { nodeResolve } = require("@rollup/plugin-node-resolve") module.exports = { input: "./src/index.ts", output: { file: "index.js", format: "cjs", }, plugins: [ nodeResolve({ modulesOnly: true, // only bundles ESM modules }), typescript(), ] }
ところで 1ファイルにベタっとまとめるのと各モジュールに分けるのってどっちのほうがランタイムで早いんだろうね?
あと webpack と rollup ランタイムでどっちのほうが早いのかとかいろいろ気になる
esbuildで済むならそれが最善な気もするけど modulesOnly とかできなさそう (偏見) だし…
ちなみにこの状況で TypeScript の node16/nodenext module モードを使うには
TypeScript のソースのルート (例えば src/ ) に package.json を置いて
{"type": "module"} だけ書いておくとよい
ローカル開発で普通にtscで動かす場合は tsc の outDir にも同様の package.json を置く必要があるので注意
もしくは *.mts を使うのも良いかもしれないが