~/blog/how-to-require-absolute-paths-in-node.js
Published on

Node.jsで絶対パスでモジュールを読み込むには?

1815文字4分で読めます–––
閲覧数
Authors
  • avatar
    Name
    Shou Arisaka nyapp.buzz/shou
    short bio
    Z世代の情報技術者。Next.jsで自作SNSを個人開発中。

Node.jsで絶対パスでモジュールを読み込む方法についてです。Node.jsでは相対パスでモジュール、外部ファイルを読み込むことはできますが、絶対パスで読み込むためには少し工夫をする必要があります。

先日までは以下のようなフォーマットで外部モジュールをrequireしていました。これでうまく行っているように見えていました。しかし。

var noderc = require( path.relative( __dirname , process.env.NODE_RC_FILE ) );

実は上記コードでは不完全で、参照パスが同階層のディレクトリにあった場合、エラーになります。

module.js:550
    throw err;
    ^

Error: Cannot find module 'noderc.js'
    at Function.Module._resolveFilename (module.js:548:15)
    at Function.Module._load (module.js:475:25)
    at Module.require (module.js:597:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (/mnt/c/pg/node/tmp.js:10:14)
    at Module._compile (module.js:653:30)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)

なぜか。同階層に参照パスがある場合、./noderc.jsといったパスではなくnoderc.jsというパスとして値が返されます。

わかりやすく言うとこういうことですね。

var noderc = require( "noderc.js" ); # => ERROR
var noderc = require( "../node/noderc.js" ); # => OK
var noderc = require( "./noderc.js" ); # => OK

なので以下を書いてみました。パスが"noderc.js"みたいなものであるとき、"./noderc.js"へ変換するものです。

global.require_absolute = function( filepath ){

    if ( ! /^\./.test( path.relative( __dirname , filepath ) ) ){
        global.noderc = require( `./${ path.relative( __dirname , filepath ) }` );
    } else {
        global.noderc = require( path.relative( __dirname , filepath ) );
    }

}

そして使用例。

require_absolute( "/mnt/c/pg/node/noderc.js" ) ;

require_absolute( process.env.NODE_RC_FILE ) ;

nodejsのrequireに関しては深い議論がされているようです。このトピックだけで2000スター。

Better local require() paths for Node.js

追記

すみません間違えてました。以下のほうが汎用性が高いです。

global.to_relative = function( filepath ){

    if ( ! /^\./.test( path.relative( __dirname , filepath ) ) ){
        return `./${ path.relative( __dirname , filepath ) }` ;
    } else {
        return path.relative( __dirname , filepath ) ;
    }

}

var noderc = require( to_relative( process.env.NODE_RC_FILE ) ) ;
avatar

Shou Arisaka

情報技術者 / Z世代プログラマー / SaaSアプリやSNSを開発
今すぐ話そう!

15歳でWordPressサイトを立ち上げ、ウェブ領域に足を踏み入れる。翌年にはRuby on Railsを用いたマイクロサービス開発に着手し、現在はデジタル庁を支えたNext.jsによるHP作成やSaaS開発のプロジェクトに携わりながら、React.js・Node.js・TypeScriptによるモダンなウェブアプリの個人開発を趣味でも行う。
フロントエンドからバックエンドまで一貫したアジャイルなフルスタック開発を得意とし、ウェブマーケティングや広告デザインも必要に応じて担当、広告運用・SEO対策・データ分析まで行う低コストかつ高品質な顧客体験の提供が好評。
国内外から200万人を超える人々に支えられ、9周年を迎えるITブログ「yuipro」の開発者、デザイナーでありライター。現在ベータ段階の自作SNS「nyapp.buzz」を日本一の国産SNSとするべく奮闘中。

Created with Fabric.js 5.2.4 何かご質問がありますか?