ノードアプリケーションを実行するときにES6モジュールを使用するために、フラグ--experimental-modules
を使用します。
ただし、このフラグを使用すると、メタ変数__dirname
は使用できません。このモードと互換性のある__dirname
に保存されている同じ文字列を取得する別の方法はありますか?
Node.js 10.12の時点では、複数のファイルを作成する必要がなく、プラットフォーム間でファイル名の特殊文字を処理する代替手段があります。
import { dirname } from 'path';
import { fileURLToPath } from 'url';
const __dirname = dirname(fileURLToPath(import.meta.url));
import.meta
を介してこれらの変数を公開することに関する提案がありましたが、今のところ、私が見つけたハック的な回避策が必要です here :
// expose.js
module.exports = {__dirname};
// use.mjs
import expose from './expose.js';
const {__dirname} = expose;
私が使用した:
_import path from 'path';
const __dirname = path.resolve(path.dirname(decodeURI(new URL(import.meta.url).pathname)));
_
decodeURI
は重要でした。テストシステムのパス内でスペースなどを使用しました。
path.resolve()
は相対URLを処理します。
import path from 'path';
const __dirname = path.join(path.dirname(decodeURI(new URL(import.meta.url).pathname)));
このコードはWindowsでも動作します
Node 10.12 + ...
モジュールから作業していると仮定すると、このソリューションは機能するはずです。また、__ filenameのサポートも提供します。
import path from 'path';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
良いことは、CommonJSモジュールのrequire()をサポートするコードが2行しかないことです。そのために追加します:
import { createRequireFromPath } from 'module';
const require = createRequireFromPath(__filename);
パスがfile://
で始まるため、この部分を削除するだけなので、このオプションを使用します。
const __filename = import.meta.url.slice(7);
const __dirname = import.meta.url.slice(7, import.meta.url.lastIndexOf("/"));
このモジュールを作成しました es-dirname 現在のスクリプトのディレクトリ名を返します。
import dirname from 'es-dirname'
console.log(dirname())
CommonJsスクリプトとES Modulesの両方WindowsおよびLinux。
スクリプトがこれまで私のプロジェクトで機能していたためエラーが発生した場合は、そこに問題を開きますが、他のいくつかのケースでは失敗する可能性があります。このため、実稼働環境では使用しないでください。 Node.jsチームが近い将来にそれを行うための堅牢な方法をリリースすると確信しているため、これは一時的なソリューションです。