web-dev-qa-db-ja.com

--experimental-modulesフラグを使用する場合のノード内の__dirnameの代替

ノードアプリケーションを実行するときにES6モジュールを使用するために、フラグ--experimental-modulesを使用します。

ただし、このフラグを使用すると、メタ変数__dirnameは使用できません。このモードと互換性のある__dirnameに保存されている同じ文字列を取得する別の方法はありますか?

34
Amygdaloideum

Node.js 10.12の時点では、複数のファイルを作成する必要がなく、プラットフォーム間でファイル名の特殊文字を処理する代替手段があります。

import { dirname } from 'path';
import { fileURLToPath } from 'url';

const __dirname = dirname(fileURLToPath(import.meta.url));
34
GOTO 0

import.metaを介してこれらの変数を公開することに関する提案がありましたが、今のところ、私が見つけたハック的な回避策が必要です here

// expose.js
module.exports = {__dirname};

// use.mjs
import expose from './expose.js';
const {__dirname} = expose;
19
robertklep

私が使用した:

_import path from 'path';

const __dirname = path.resolve(path.dirname(decodeURI(new URL(import.meta.url).pathname)));
_

decodeURIは重要でした。テストシステムのパス内でスペースなどを使用しました。

path.resolve()は相対URLを処理します。

5
BananaAcid
import path from 'path';
const __dirname = path.join(path.dirname(decodeURI(new URL(import.meta.url).pathname)));

このコードはWindowsでも動作します

2
user2962433

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); 
2
Mike Brant

パスがfile://で始まるため、この部分を削除するだけなので、このオプションを使用します。

const __filename = import.meta.url.slice(7);
const __dirname = import.meta.url.slice(7, import.meta.url.lastIndexOf("/"));
0
Navaru

このモジュールを作成しました es-dirname 現在のスクリプトのディレクトリ名を返します。

import dirname from 'es-dirname'

console.log(dirname())

CommonJsスクリプトとES Modulesの両方WindowsおよびLinux

スクリプトがこれまで私のプロジェクトで機能していたためエラーが発生した場合は、そこに問題を開きますが、他のいくつかのケースでは失敗する可能性があります。このため、実稼働環境では使用しないでください。 Node.jsチームが近い将来にそれを行うための堅牢な方法をリリースすると確信しているため、これは一時的なソリューションです。

0
vdegenne