Nodeロードモジュールプロセス

2352 ワード

Nodeロードモジュールプロセス
概要
NodeはES 6モジュールの処理が面倒です.自分のCommunJSモジュールのフォーマットがあるので、ES 6モジュールのフォーマットとは互換性がありません.現在のソリューションは、両者を分離し、ES 6モジュールとCommunJSはそれぞれのロード方式を採用しています.
NodeはES 6モジュールに対して.mjs拡張子ファイル名を要求します.つまり、スクリプトファイルにimportまたはexportコマンドを使用すると、mjs拡張子名が必要となります.requireコマンドはロードできません.mjsファイルはエラーが発生します.importコマンドだけがロードできます.mjsファイル.逆に、mjsファイルでもrequireコマンドは使用できません.importを使用しなければなりません.
現在、この機能はまだテスト段階です.Node v 8.5.0または以上のバージョンをインストールするには、-experimental-modulesパラメータを使用して、この機能を開くことができます.
$ node --experimental-modules my-app.mjs
ブラウザのimportローディングルールと同じように、NodeのmjsファイルはURLパスをサポートします.
import'./foo?query=1';/パラメータを読み込みます.query=1上のコードには、スクリプトパスにパラメータが含まれていますか?query=1、NodeはURLルールで解読します.同じスクリプトはパラメータが異なると何度もロードされ、異なるキャッシュに保存されます.このため、ファイル名の中に「、%と、啱と、?」などの特殊文字は、これらの文字を変換した方がいいです.
現在、Nodeのimportコマンドはローカルモジュールのみのロードをサポートしています.リモートモジュールのロードはサポートされていません.
モジュール名にパスが含まれていない場合、importコマンドはnode_に行きます.modulesディレクトリはこのモジュールを探しています.
import "baz";
import "abc/123";
モジュール名にパスが含まれている場合、importコマンドはこの名前のスクリプトファイルをパスで探します.
import "file:///etc/config/app.json";
import "./foo";
import "./foo?search";
import "../bar";
import "/baz";
もしスクリプトファイルが拡張子の名前を省略したら、例えばimport'.foo's、Nodeは4つの拡張子の名前を順次試します.これらのスクリプトファイルが存在しないなら、Nodeはロードします.もし.foo/package.jsonが存在しないか、mainフィールドがないなら、順次ロードします./foo/index.mjs、.foo/index.js、.foo/index.json、.foo/index.node.上の4つのファイルがまだ存在しない場合、エラーが発生します.
最後に、Nodeのimportコマンドは非同期ローディングであり、この点はブラウザの処理方法と同じである.
注:記事はNodeロードを参照してください.