Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Node.js ESMの対応 #1355

Closed
2 of 3 tasks
azu opened this issue Dec 21, 2021 · 8 comments · Fixed by #1465
Closed
2 of 3 tasks

Node.js ESMの対応 #1355

azu opened this issue Dec 21, 2021 · 8 comments · Fixed by #1465
Assignees

Comments

@azu
Copy link
Collaborator

azu commented Dec 21, 2021

概要

Node.jsのLTSはESMをネイティブサポートしているので、Node.jsでCLIアプリの章をESMベースに書き直したい。
しかし、現状のNode.js ESMは色々中途半端な部分があって完全に切り替えるかが迷いどころ。

"node": "^12.20.0 || ^14.13.1 || >=16.0.0"

refs Pure ESM package

#1337 ES2022の対応と合わせてやりたいので、大体2022年6月ぐらいまでに完了させたいイメージ。

Node.jsでのESMの現状

今Node ESMを扱う問題は

  • CommonJSとESMどっちで書くか迷う
  • 使ってるライブラリがPure ESMのみかどうか(CJSからimport()が必要、ESMの場合も type:module かmjsが必要で一手間)
  • いろいろなイディオムを覚える必要あり(__dirname とか、resolveとか普通に使えて欲しいものも、今はイディオムがいる)
  • Node ESMを扱えないツールが多い(CJS + TSで書かないとフラストレーションがある)

今Node ESMを扱うべき理由は

  • 将来的にCJSじゃなくてESMになるのは明白
  • Pure ESMなモジュールを扱うには、ESMで書いた方が楽
  • ESMなCDN、Deno、Webとの相性が良い

直接Node.jsでJavaScriptを書くならESMでなんとかなるけど、
他のツールを使おうとすると結構ハマり所があると言うのが所感。

CLIの章をESMにする場合に決めないといけないこと

  • CommonJS の扱いをどうするか
    • CommonJS(require/exports)自体は無くならないので、どっかで触れる必要がある。
    • XHRの時みたいにコラムサイズで収まるかは不明
  • 利用してるパッケージのESM対応調査

ESMからCJSとESMは特に問題なくimportできるinteropがNode.jsにはあるはずなので、パッケージ自体が対応してるかはあんまり気にしなくていいけど一応(mochaだけは対応が必須ではあるけど、対応してたので問題ないはず)

その他 関連する変更

  • Node.js LTS 16へのアップデート
  • npm 7へのアップデート(新規作成のみなのでほぼ影響ない? このリポジトリ自体を更新する感じ)
  • node: prefix module New in Node.js: node: protocol imports
@azu
Copy link
Collaborator Author

azu commented Dec 21, 2021

大まかな方針としては、次のやり方が考えられそう

  1. ESMで書き直して、ESMをベースにしてCJSについては補足程度にする
    • CJSは補足程度で済むのかが怪しい。現状はデファクトであることには変わらない
    • 全体的に書き直し
  2. CJSで書いて、最後にESMに直してみましょうみたいリファクタリングをする方向で追加する
    • 利用してるパッケージは幸いCJS or dual moduleなのでコードの変更のみでいいはず
    • 最後に1セクション追加するようなイメージ
  3. ベースはCJSのままにして、現在のNode.js("node": "^12.20.0 || ^14.13.1 || >=16.0.0")ではESMも扱えるよと補足する
    • 一番変更が少ないような方針

@lacolaco どうするのがよさそうですかね?

@azu azu mentioned this issue Dec 21, 2021
17 tasks
@lacolaco
Copy link
Collaborator

理想的には1かなーと思いますが現実問題CJSの話がどれくらい必要になるか確かめてみて次第ですかね 年末に調べてみますが、CJSが捨てられるのはまだ先だろうし3を選んでもいい時期でもありそうです

@yumetodo
Copy link
Contributor

例えばnode-fech v3はESMになりましたがそれに依存するgaxiosは当面移行する気なさそうですね。
googleapis/gaxios#445
googleapis/gaxios#429

@azu
Copy link
Collaborator Author

azu commented Jan 15, 2022

Marked ReDoSの脆弱性修正が入ったので、今のバージョンだとnpm install時に警告出ちゃうようになるかなー
#1375 #1376

@azu
Copy link
Collaborator Author

azu commented Jan 15, 2022

ベースはCJSのままにして、現在のNode.js("node": "^12.20.0 || ^14.13.1 || >=16.0.0")ではESMも扱えるよと補足する

一旦、3で進めるかなー

@azu
Copy link
Collaborator Author

azu commented May 31, 2022

Node.js 16のLTSが今年の後半だから、npm 8の対応はやっておかないといけないのか。
Node ESMに関しては特に変わらないけど。
https://nodejs.org/en/about/releases/

@azu
Copy link
Collaborator Author

azu commented Aug 18, 2022

https://deploy-preview-1457--js-primer.netlify.app/use-case/nodecli/argument-parse/#commonjs-module

このユースケースで今後登場するモジュールはすべてCommonJSモジュールです。 Node.jsではES Moduleもサポートされる予定ですが、現在はまだ安定した機能としてサポートされていません。

これを書き換える必要はある。

@azu
Copy link
Collaborator Author

azu commented Aug 18, 2022

1 の方針でやる。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants