path.resoveとpath.joinは何をしていますか?

49031 ワード

前言
vueプロジェクトの配置でよく見られるpath.resove、path.join、_彼らは一体何ですか?公式表現は:__dirnameは、現在のモジュールのディレクトリ名(すなわち、実行中のjsファイルがあるディレクトリ)を表しています.
Node.jsモジュールシステムでは、各ファイルは独立したモジュールと見なされます.path.resolve()は、経路または経路フラグメントのシーケンスを絶対パスとして解析する.path.join()は、与えられたすべてのパスを一緒に接続し(プラットフォーム固有のセパレータをデリミタとして使用する)、その後、生成されたパスを規範化する.
ええ、ちょっと抽象的です.これらをよりよく理解するために、以下のコードを走りました.
前提条件
以下のコードは、以下のディレクトリ構造と実行経路に基づいています.パスの実行に注意してください.これはjsファイルの所在経路と実行経路を区別するためであり、両者の区別はresolive方法をよりよく理解するのに役立つ.
ディレクトリ構造:
myTest         
├─ test1       
│  └─ test.js  
└─ test2       
実行経路:E:\myTest\test2Part 1これらは何ですか?直接出力してみます
const path = require('path');
console.log("__dirname ==> ", __dirname)         //     js        ==> E:\myTest\test1
console.log("resolve   ==> ", path.resolve(''))  //         ==> E:\myTest\test2
console.log("join      ==> ", path.join(''))     //  .       ==> .
Part 2は次にreolveとjoinを比較します.
const path = require('path');
console.log("resolve   ==> ", path.resolve('a/b','c','d')) // E:\myTest\test2\a\b\c\d 
console.log("join      ==> ", path.join('a/b','c','d'))    // a\b\c\d
//           ,         (           ,    \       /)
Part 3再添加料は、Part 2のコードに基づいて、経路セグメントdにそれぞれ/./..//を加えて試してみる.
console.log("   /") 
console.log("resolve   ==> ", path.resolve('a/b','c','/d'))  // E:\d
console.log("join      ==> ", path.join('a/b','c','/d'))     // a\b\c\d

console.log("   ./") 
console.log("resolve   ==> ", path.resolve('a/b','c','./d')) // E:\myTest\test2\a\b\c\d
console.log("join      ==> ", path.join('a/b','c','./d'))    // a\b\c\d

console.log("   ../") 
console.log("resolve   ==> ", path.resolve('a/b','c','../d')) // E:\myTest\test2\a\b\d
console.log("join      ==> ", path.join('a/b','c','../d'))    // a\b\d
./../__dirnameで始まるパスセグメントを含み、それぞれはルートディレクトリ(/)、カレントディレクトリ(./)、上位ディレクトリ(...).用法と命令行の中でcdを使うと何ですか?
Part 4に__dirnameを組み合わせて食べてPart 3に基づいて__dirnameを加えて第一パラメータとします.
console.log("   /") 
console.log("resolve   ==> ", path.resolve(__dirname, 'a/b','c','/d')) // E:\d
console.log("join      ==> ", path.join(__dirname, 'a/b','c','/d'))    // E:\myTest\test1\a\b\c\d

console.log("   ./") 
console.log("resolve   ==> ", path.resolve(__dirname, 'a/b','c','./d')) // E:\myTest\test1\a\b\c\d
console.log("join      ==> ", path.join(__dirname, 'a/b','c','./d'))    // E:\myTest\test1\a\b\c\d

console.log("   ../") 
console.log("resolve   ==> ", path.resolve(__dirname, 'a/b','c','../d')) // E:\myTest\test1\a\b\d
console.log("join      ==> ", path.join(__dirname, 'a/b','c','../d'))    // E:\myTest\test1\a\b\d
Part 5は、ディスクを有するパスセグメントを追加して試しても、Part 3に基づいています.今回は__dirnameを追加せずに、ディスクを有するパスセグメントを追加します.
console.log("   /") 
console.log("resolve   ==> ", path.resolve('F:/', 'a/b','c','/d')) // F:\d
console.log("join      ==> ", path.join('F:/', 'a/b','c','/d'))    // F:\a\b\c\d

console.log("   ./") 
console.log("resolve   ==> ", path.resolve('F:/', 'a/b','c','./d')) // F:\a\b\c\d
console.log("join      ==> ", path.join('F:/', 'a/b','c','./d'))    // F:\a\b\c\d

console.log("   ../") 
console.log("resolve   ==> ", path.resolve('F:/', 'a/b','c','../d')) // F:\a\b\d
console.log("join      ==> ", path.join('F:/', 'a/b','c','../d'))    // F:\a\b\d
上記の運転結果から、ポイントが見えます.パスに基づいて、パッチ後の絶対パスを返します.ただし、パスセグメントにディスクが含まれている場合は、そのディスクに準じる.
emm...ちょっと故障しているようですが、__dirnameとディスク付きのパスセグメントを同時に使用したら?それともトップパラメータとしてではないですか?もう一つ走ってみます.
Part 6は、__dirnameとディスクを有するパスセグメントとを同時に使用してトップパラメータとして使用しない場合
console.log("resolve   ==> ", path.resolve(__dirname, 'F:/', 'a/b','c'))		// F:\a\b\c
console.log("resolve   ==> ", path.resolve('F:/', __dirname, 'a/b','c'))		// E:\myTest\test1\a\b\c
console.log("resolve   ==> ", path.resolve('x/y', 'F:/', __dirname, 'a/b','c'))	// E:\myTest\test1\a\b\c
はい、分かりました.より正確な表現を変更します.
パスのセグメントは、完全な絶対パスを返すまで、右から左へ順にスティッチングします.もし入ってきたパスの断片にディスクが付いていないなら、運行時のパスを持ってきます.
path.join
パスの一部分は右から左へ順番につづり合わせて、スティッチングされたパスの一部分を返します.
締め括りをつける
両者の共通点:
  • パスは標準化されます.
  • は、右から左へのスティッチングパスのセグメント
  • である.
    両者の違い:
  • Resoliveは絶対パスに戻ります.joinはパスフラグメントだけをつなぎ合わせます.
  • /シンボルは、resoveにルートディレクトリを表し、joinにはこの効果がありません.
    完全なテストコードを添付します.走ってみてください.
    const path = require('path');
    
    //      ?       
    console.log("----------------------------------") 
    console.log("__dirname ==> ", __dirname)         //     js        ==> E:\myTest\test1
    console.log("resolve   ==> ", path.resolve(''))  //         ==> E:\myTest\test2
    console.log("join      ==> ", path.join(''))     //  .       ==> .
    console.log("----------------------------------") 
    
    //          resolve   join
    console.log("resolve   ==> ", path.resolve('a/b','c','d')) // E:\myTest\test2\a\b\c\d 
    console.log("join      ==> ", path.join('a/b','c','d'))    // a\b\c\d
    //             ,         (           ,    \       /)
    console.log("----------------------------------")          
    
    //      ----
    //       /  ./  ../   ,    :   (/),     (./),     (../)
    //           cd **
    console.log("============      ============") 
    console.log("   /:") 
    console.log("resolve   ==> ", path.resolve('a/b','c','/d'))  // E:\d
    console.log("join      ==> ", path.join('a/b','c','/d'))     // a\b\c\d
    console.log("----------------------------------") 
    console.log("   ./:") 
    console.log("resolve   ==> ", path.resolve('a/b','c','./d')) // E:\myTest\test2\a\b\c\d
    console.log("join      ==> ", path.join('a/b','c','./d'))    // a\b\c\d
    console.log("----------------------------------") 
    console.log("   ../:") 
    console.log("resolve   ==> ", path.resolve('a/b','c','../d')) // E:\myTest\test2\a\b\d
    console.log("join      ==> ", path.join('a/b','c','../d'))    // a\b\d
    console.log("==================================") 
    
    //    __dirname    
    console.log("=========    __dirname =========") 
    console.log("   /:") 
    console.log("resolve   ==> ", path.resolve(__dirname, 'a/b','c','/d')) // E:\d
    console.log("join      ==> ", path.join(__dirname, 'a/b','c','/d'))    // E:\myTest\test1\a\b\c\d
    console.log("----------------------------------") 
    console.log("   ./:") 
    console.log("resolve   ==> ", path.resolve(__dirname, 'a/b','c','./d')) // E:\myTest\test1\a\b\c\d
    console.log("join      ==> ", path.join(__dirname, 'a/b','c','./d'))    // E:\myTest\test1\a\b\c\d
    console.log("----------------------------------") 
    console.log("   ../:") 
    console.log("resolve   ==> ", path.resolve(__dirname, 'a/b','c','../d')) // E:\myTest\test1\a\b\d
    console.log("join      ==> ", path.join(__dirname, 'a/b','c','../d'))    // E:\myTest\test1\a\b\d
    console.log("----------------------------------") 
    
    //    __dirname ,              ==>       __dirname   
    console.log("==========        ==========") 
    console.log("   /:") 
    console.log("resolve   ==> ", path.resolve('F:/', 'a/b','c','/d')) // F:\d
    console.log("join      ==> ", path.join('F:/', 'a/b','c','/d'))    // F:\a\b\c\d
    console.log("----------------------------------") 
    console.log("   ./:") 
    console.log("resolve   ==> ", path.resolve('F:/', 'a/b','c','./d')) // F:\a\b\c\d
    console.log("join      ==> ", path.join('F:/', 'a/b','c','./d'))    // F:\a\b\c\d
    console.log("----------------------------------") 
    console.log("   ../:") 
    console.log("resolve   ==> ", path.resolve('F:/', 'a/b','c','../d')) // F:\a\b\d
    console.log("join      ==> ", path.join('F:/', 'a/b','c','../d'))    // F:\a\b\d
    console.log("----------------------------------") 
    
    //       __dirname   ,             
    console.log("==========         ==========") 
    console.log("resolve   ==> ", path.resolve(__dirname, 'F:/', 'a/b','c'))		//F:\a\b\c
    console.log("resolve   ==> ", path.resolve('F:/', __dirname, 'a/b','c'))		//E:\myTest\test1\a\b\c
    console.log("resolve   ==> ", path.resolve('x/y', 'F:/', __dirname, 'a/b','c'))	//E:\myTest\test1\a\b\c