コンテンツにスキップ
svelte-vitals
日本語
Esc
移動開く⌘Jプレビュー
このページの内容

performance/namespace-import · namespace import

ツリーシェイクを効かせるため、import * as ではなく名前付き import を使いましょう。

重大度: info · カテゴリ: performance

チェック内容

node_modules のパッケージ(bare specifier)に対する値の import * as X from '<package>' を検出します。型のみの import(import type * as T)と、bare でない specifier(相対パス、$lib$app$env#…)は対象外です。

なぜ重要か

namespace import(import * as X)がツリーシェイク可能なのは、X へのアクセスが常に静的(X.foo())な場合だけです。X を関数に渡したり動的にインデックスアクセス(X[key])したりすると、バンドラはすべてのエクスポートが参照されうると仮定し、モジュール全体を残します。

named import なら確実にツリーシェイクでき、依存の使用範囲も明示的になります。ツリーシェイクに対応したバンドラであれば threed3 のようなパッケージでも実際に軽くできますが、保証されるのはシェイク可能であることであって、どの構成でも必ず出力が小さくなることではありません。

修正方法

<script>
  // import * as _ from 'lodash'; の代わりに
  import debounce from 'lodash/debounce';

  // import * as THREE from 'three'; の代わりに
  import { Scene, WebGLRenderer } from 'three';
</script>

モードによる違い

ありません。このルールが読むのは同じ .svelte / .ts のソースファイルなので、CLI、Vite プラグインのビルド、ライブダッシュボードの静的ベースラインのいずれでも結果は同一で、レンダリング済み HTML の解析で再評価されることもありません。--route で実行範囲を絞ると、このルールは動きません。コンポーネントスコープのルールには、検出を紐づけるルートが無いためです。

無効化

個別に抑制するには、対象行の直前に <!-- svelte-vitals-disable-next-line performance/namespace-import --> を置きます。ルールごと無効化するには、次のように設定します。

export default {
  rules: {
    'performance/namespace-import': 'off'
  }
};