モジュールとパッケージ

順不同に色々。

パッケージ:

  1. パッケージ名は名前空間付きにできて @foo/bar のように書ける。従来のフラットな名前 foo もある。
  2. パッケージ名は原則物理的ディレクトリ名だが、./package.json で指定した名前が正式名。
  3. パッケージのエントリーポイントファイルとか、パッケージをロードするという概念がある。これを実現するために、パッケージ → ファイルのマッピングが定義される。
  4. 物理的には、ファイルとディレクトリだが、package.json などの設定ファイルが抽象化された(仮想的)構造を定義する。仮想的構造は、主に名前マッピングで実現できる名前ツリー構造。
  5. ディレクトリとファイルが物理、パッケージとスクリプト・モジュールが仮想。
  6. 提供者と利用者のあいだで、同一の仮想構造を共有できることが課題、問題意識。

注意すべきpackage.json のフィールド

  1. types, typings(エイリアス)はTypeScriptに型情報を伝えるため。
  2. type はJavaScriptモジュール方式を指定する。値は ("module" | "commonjs")

TypeScript :

  1. コンパイルオプションにmoduleオプションがあり、デフォルトかつ推奨は commonjs 。
  2. import foo = require('foo') という折衷構文が使える。
  3. export = foo も使える。
  4. export {名前のリスト} がファイルのどの場所でも使える。
  5. as でモジュールのリネームできる。
  6. import * as foo from './foo'; エクスポートされたエンティティをすべてを、fooの下にぶら下げる。
  7. export * from './foo'; ですべてを再エクスポート(フォワーディング)
  8. export { someVar } from './foo'; 選択的な再エクスポート
  9. export { someVar as aDifferentName } from './foo'; 選択してリネームして再エクスポート
  10. import someName from "someModule" デフォルトエクスポートされたエンティティをインポート

インポートのアサーション(追加情報):

import json from "./foo.json" assert { type: "json" };

ダイナミックインポートの場合

import("foo.json", { assert: { type: "json" } });

仮想的モジュール名を物理的ファイルシステム上での解決する方法はまだ確実に把握してない。