Closed20

CommonJSとESM

tkrytkry
tkrytkry

CommonJSとESM

歴史的経緯からNode.jsはデフォルトでCommonJSを使っている
BabelはESM -> CommonJSに変換してくれる

構文の違い

  • CommonJS
    • require、module.exportsの構文で同期的実行
  • ESM
    • import、exportの構文で非同期
    • ファイルの先頭にホイスティングされる
    • JS標準

気になった用語

  • IIFE
    • 即時関数
  • AMD
    • Asynchronous Module Definition
  • UMD
    • Universal Module Definition
tkrytkry
tkrytkry

CommonJSでもデフォルトエクスポートと名前付きエクスポートがある
混在することもできる

// math.js
module.exports = add; // デフォルト
module.exports.subtract = subtract; // 名前付き
const math = require('./math');

const add = math;
const subtract = math.subtract;
// ...
tkrytkry

無名関数でラップしてスコープを限定する
requireしたmoduleは、キャッシュが使用されるので一度だけ評価される

tkrytkry
tkrytkry

モジュール

モジュールが一度だけ評価される(複数回importしても同じものとして扱う)のは「モジュールを 構成(configure) できるため実際に非常に便利です。」

import.meta

オブジェクト import.meta は現在のモジュールに関する情報を含んでいます。

tkrytkry

bare module

ブラウザでは、import は相対URLか絶対URLどちらかの取得が必須です。

tkrytkry

サマリ

  • デフォルトでは遅延
  • 非同期はインラインスクリプトで動作する
  • 外部スクリプトは CORS ヘッダを必要とする
  • 重複した外部スクリプトは無視される
tkrytkry

インポートし過ぎることを気にしないでください
例えば、巨大なコードライブラリから import * as library を行い、いくつかのメソッドのみを使用する場合、未使用のものは最適化されたバンドルには 含まれません。

へーそうなんだ

tkrytkry

名前付きexportのほうが明示的で良い気がする
再export時にも、default exportはちょっと手間が必要

tkrytkry

export * from './user.js' は名前付けエクスポートのみを再エクスポートし、デフォルトは含まれていません

tkrytkry

モジュールの取得/評価のみでインポートはしない:
import "mod"

なるほど、ただモジュールを実行するための↑の場合もあるのか

tkrytkry

import() は一見すると関数呼び出しに見えますが、たまたま括弧を使用している特別な構文です

マニアックだなぁ

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