私のReactプロジェクト(w/Webpack))では、私のフォルダー構造は次のようになります。
├── myfile.js
├── Report
├── index.js
私の research に基づいて、Report
モジュールをmyfile.js
にインポートできるはずです。
import { Report } from './Report';
しかし、それはうまくいきません。エラーが発生しました:
インポートしようとしたエラー:「レポート」は「./レポート」からエクスポートされません。
ただし、これは可能です。
import { Report } from './Report/index';
私のReport/index.js
には次のエクスポートがあります:
// export default class Report extends Component { // this was a typo
export class Report extends Component {
// etc
}
これを解決するには、または少なくともトラブルシューティングするにはどうすればよいですか?
ちなみに、元々はデフォルトのエクスポート/インポートを使っていましたが、違いが出て欲しいので名前付きに変更しました。そうではありません。
更新します。申し訳ありませんが、この投稿は元々、誤ってexport default
がindex.js
に含まれていました。これは実際にファイルにあるものではなく、一部の回答者が間違った経路をたどった可能性があります。上で言ったように、インポートをimport Report
からimport { Report }
に変更したときに、それをexport
に変更しました。したがって、インポートとエクスポートはどちらの場合でも(名前付きまたはデフォルト)一致しているはずであり、どちらも機能していません。
解決策:開発用サーバーを再起動します。
[〜#〜]説明[〜#〜]
私はそれをある程度理解しました。つまり、開発サーバーを再起動するだけで済みました。
好奇心のための詳細。 Report
をフォルダーにする前は、myfile.js
と同じフォルダーにあるファイルでした。
├── myfile.js
├── Report.js
ローカルで実行中の開発用サーバーを使用していて、すべてが問題なく動作していました。
次に、新しいフォルダーReport
を作成し、Report.js
を使用してgit mv Report.js Report/index.js
をその中に移動しました。その間、開発用サーバーがまだ稼働していて、機能しなくなりました。
なぜそれが正確に機能しなかったのかはわかりませんが(私の投稿で抜粋したものとは異なるエラーメッセージを思い起こしているようです)、デフォルトのエクスポートに問題があると考え、変更に取り掛かりました。
もちろん、開発用サーバーはファイルに加えた変更を認識しましたが、空のファイルでも古いバージョンでも、削除されたReport.js
はまだ存在しているようです。 import { Report } from './Report';
を使用すると、古いReport.js
をフェッチするか、フェッチしようとして失敗しましたが、import { Report } from './Report/index';
を使用すると、どこに行くべきかが正確にわかっていて、期待どおりに機能しました。
再起動すると、サーバーはファンタスティックReport.js
を認識しなくなり、想定どおり、次にReport/index.js
を検索します。元のデフォルトのエクスポート/インポートを含め、すべてが正常に機能します。
実際にはクラスからオブジェクトをエクスポートしていないようです。つまり、次のような中括弧は必要ありません。
import { Report } from './Report';
オースティングレコが言ったように、クラスのレポートである1つのものだけをエクスポートするので、中かっこを削除する必要があります。
import Report from './Report';
ファイル名はindex.js
なので、次の2行は同等です。
import { Report } from './Report'; // by default, the module system will look for the index.js file inside a folder
import { Report } from './Report/index';
したがって、2番目のアプローチが機能した理由はありませんが、最初のアプローチは機能しませんでした
あなたの場合、default export
ではなくnamed export
を使用しているため、エクスポートされたモジュールを使用するには、これらの両方の方法が機能します。
import Report from './Report'
import Report from './Report/index';
[〜#〜]更新[〜#〜]
インポートしようとしたエラー:「レポート」は「./レポート」からエクスポートされません。
このエラーは、import
a named export
モジュールを試みていることを示していますが、モジュールシステムは、Report
という名前のnamed export
モジュールを見つけることができません。 default export
ではなくnamed export
を使用しているため、明らかです。
[〜#〜]更新[〜#〜]
これは実用的なデモです: https://codesandbox.io/s/m7vp982m2p これを参照として使用して、コードを振り返ると、コードが機能しない理由を理解できます。
Index.jsを使用するようにアプリを再構築したばかりの場合、機能させるためにノードを再起動する必要があります。