アプリケーションランタイムに必要なファイル( node_modulesを含む)を正確に決定するために使用されます。
これは、バンドリングが実行されないため、Webpackに依存していないことを除いて、 @Vercel/NCCに似ています。これは、資産やバイナリを移動することなく、同じツリーを揺るがす利益を達成します。
npm i @vercel/nft入力としてソースファイルのリストを提供します。
const { nodeFileTrace } = require ( '@vercel/nft' ) ;
const files = [ './src/main.js' , './src/second.js' ] ;
const { fileList } = await nodeFileTrace ( files ) ;ファイルのリストには、アプリケーションコードで必要なすべてのnode_modulesモジュールとアセットが含まれます。
ファイルリストのベースパス - すべてのファイルは、このベースに対して関連として提供されます。
デフォルトでは、 process.cwd()が使用されます。
const { fileList } = await nodeFileTrace ( files , {
base : process . cwd ( ) ,
} ) ; baseの上のファイル/フォルダーは、リストと分析では無視されます。
分析を適用する場合、特定の関数は、 path.resolve('./relative')または直接process.cwd()呼び出しなど、 process.cwd()値に依存しています。
processCwdオプションの設定により、この分析を適切なパスに導き、資産が正しく検出されるようにします。
const { fileList } = await nodeFileTrace ( files , {
processCwd : path . resolve ( __dirname ) ,
} ) ;デフォルトでは、 processCwd baseと同じです。
デフォルトでは、node.jsの「エクスポート」と「インポート」フィールドのトレースがサポートされており、 "node" 、 "require" 、 "import" 、 "default"条件が定義されたとおりにトレースされています。
あるいは、条件の明示的なリストを提供することができます。
const { fileList } = await nodeFileTrace ( files , {
conditions : [ 'node' , 'production' ] ,
} ) ;正確なエクスポート条件リストを指定するときは、 "node"エクスポートのみを明示的に含める必要があります(必要に応じて)。 "require" 、 "import" 、 "default"条件は、どのカスタム条件が設定されていても、定義されたとおりに常に追跡されます。
トレースがエクスポートすると、 "main" /インデックスフィールドは"exports"サポートなしでnode.jsバージョンのためにトレースされます。
これは、 exportsOnlyオプションで無効にすることができます。
const { fileList } = await nodeFileTrace ( files , {
exportsOnly : true ,
} ) ; "exports"のあるパッケージは、エクスポートのみを追跡するだけで、メインはまったく含まれません。これにより、node.js 12.17.0以降をターゲットにすると、出力サイズが削減されます。
ステータス:実験。いつでも変わる可能性があります。
使用するカスタム解像度パス定義。
const { fileList } = await nodeFileTrace ( files , {
paths : {
'utils/' : '/path/to/utils/' ,
} ,
} ) ;トレーリングスラッシュマップディレクトリ、正確なパスマップ正確なみ。
次のFS関数は、オプションとしてそれらを渡すことでフックすることができます。
readFile(path): Promise<string>stat(path): Promise<FS.Stats>readlink(path): Promise<string>resolve(id: string, parent: string): Promise<string | string[]>カスタム解決フックを提供する場合、 id入力に基づいてファイルを解決するために1つ以上の絶対パスを返す責任があります。ただし、特定のケースでの解決動作を増強またはオーバーライドするだけである場合があります。 nftの基礎となるリゾルバーをインポートすることで使用できます。ビルトインresolve関数は、フックから転送する必要がある追加の議論を期待しています
resolve(id: string, parent: string, job: Job, isCjs: boolean): Promise<string | string[]>これは、1つのIDがオーダーメイドのパスに解決されていることを示す例を示しますが、他のすべてのパスは組み込みのリゾルバーによって解決されます
const { nodeFileTrace , resolve } = require ( '@vercel/nft' ) ;
const files = [ './src/main.js' , './src/second.js' ] ;
const { fileList } = await nodeFileTrace ( files , {
resolve : async ( id , parent , job , isCjs ) => {
if ( id === './src/main.js' ) {
return '/path/to/some/resolved/main/file.js' ;
} else {
return resolve ( id , parent , job , isCjs ) ;
}
} ,
} ) ; 内部解像度は、デフォルトでTracesで.tsファイルの解決をサポートします。
既存のビルドシステムに統合する性質により、TypeScriptコンパイラはこのプロジェクトに含まれていません。むしろ、TypeScript変換レイヤーには、 readFileフックに個別の統合が必要です。
一部の大規模プロジェクトでは、ファイルトレースロジックが同時に多くのファイルを処理する場合があります。この場合、同時ファイルIOの数を制限しない場合、OOMの問題が発生する可能性があります。
1024の並行性のデフォルトを使用して、FS操作のパフォーマンスとメモリの使用バランスをとります。この値をより速い速度でより高い数に増やすことができますが、同時性が高すぎる場合はメモリの問題に注意してください。
const { fileList } = await nodeFileTrace ( files , {
fileIOConcurrency : 2048 ,
} ) ; 分析オプションを使用すると、依存関係リストを正確に解決するために実行する分析を実行する必要があります。
デフォルトでは、必要なファイルがトレースから除外されないようにするために、できるだけ多くの分析が行われます。
すべての分析を無効にするには、 analysis: false 。または、個々の分析オプションを次のようにカスタマイズできます。
const { fileList } = await nodeFileTrace ( files , {
// default
analysis : {
// whether to glob any analysis like __dirname + '/dir/' or require('x/' + y)
// that might output any file in a directory
emitGlobs : true ,
// whether __filename and __dirname style
// expressions should be analyzed as file references
computeFileReferences : true ,
// evaluate known bindings to assist with glob and file reference analysis
evaluatePureExpressions : true ,
} ,
} ) ; ファイルの包含をスキップするためにカスタム無視を提供することができます(そして、その結果、参照のためのファイルの分析も同様です)。
const { fileList } = await nodeFileTrace ( files , {
ignore : [ './node_modules/pkg/file.js' ] ,
} ) ;無視は関数またはグローブも受け入れます。
無視するために提供されるパスは、 baseに関連していることに注意してください。
ビルド間でファイルキャッシュを保持するには、空のcacheオブジェクトを渡します。
const cache = Object . create ( null ) ;
const { fileList } = await nodeFileTrace ( [ 'index.ts' ] , { cache } ) ;
// later:
{
const { fileList } = await nodeFileTrace ( [ 'index.ts' ] , { cache } ) ;
}キャッシュの無効化はサポートされていないため、ファイルシステムが実行間で変更されないという仮定があります。
個々のファイルを含める根本的な理由を取得するために、 reasonsも出力によって提供されます。
const { fileList , reasons } = await nodeFileTrace ( files ) ;その後、 reasonsが次の形式のオブジェクトになります。
{
[ file : string ] : {
type : 'dependency' | 'asset' | 'sharedlib' ,
ignored : true | false ,
parents : string [ ]
}
} reasons 、無視されたとignoreReason ignored: trueたファイルも含まれています。
すべてのファイルは、別のファイルによって参照されるために含まれています。 parentsリストには、このファイルを含めたすべてのファイルのリストが含まれます。