Digunakan untuk menentukan dengan tepat file mana (termasuk node_modules ) diperlukan untuk runtime aplikasi.
Ini mirip dengan @Vercel/NCC kecuali tidak ada bundling yang dilakukan dan oleh karena itu tidak ada ketergantungan pada Webpack. Ini mencapai manfaat getar pohon yang sama tanpa memindahkan aset atau biner apa pun.
npm i @vercel/nftBerikan daftar file sumber sebagai input:
const { nodeFileTrace } = require ( '@vercel/nft' ) ;
const files = [ './src/main.js' , './src/second.js' ] ;
const { fileList } = await nodeFileTrace ( files ) ; Daftar file akan mencakup semua modul dan aset node_modules yang mungkin diperlukan oleh kode aplikasi.
Jalur dasar untuk daftar file - semua file akan disediakan sebagai relatif terhadap basis ini.
Secara default process.cwd() digunakan:
const { fileList } = await nodeFileTrace ( files , {
base : process . cwd ( ) ,
} ) ; File/folder apa pun di atas base diabaikan dalam daftar dan analisis.
Saat menerapkan analisis fungsi -fungsi tertentu bergantung pada nilai process.cwd() , seperti path.resolve('./relative') atau bahkan doa process.cwd() langsung.
Mengatur opsi processCwd memungkinkan analisis ini dipandu ke jalur yang benar untuk memastikan bahwa aset terdeteksi dengan benar.
const { fileList } = await nodeFileTrace ( files , {
processCwd : path . resolve ( __dirname ) ,
} ) ; Secara default processCwd sama dengan base .
Secara default melacak bidang Node.js "Ekspor" dan "Impor" didukung, dengan "node" , "require" , "import" dan "default" yang dilacak sebagaimana didefinisikan.
Atau daftar kondisi eksplisit dapat disediakan:
const { fileList } = await nodeFileTrace ( files , {
conditions : [ 'node' , 'production' ] ,
} ) ; Hanya ekspor "node" yang harus dimasukkan secara eksplisit (jika diperlukan) saat menentukan daftar kondisi ekspor yang tepat. Kondisi "require" , "import" dan "default" akan selalu dilacak sebagaimana didefinisikan, tidak peduli apa pun kondisi khusus yang ditetapkan.
Saat melacak ekspor bidang "main" / indeks masih akan ditelusuri untuk versi Node.js tanpa dukungan "exports" .
Ini dapat dinonaktifkan dengan opsi exportsOnly :
const { fileList } = await nodeFileTrace ( files , {
exportsOnly : true ,
} ) ; Paket apa pun dengan "exports" kemudian hanya akan melacak ekspornya, dan utama tidak akan dimasukkan sama sekali. Ini dapat mengurangi ukuran output saat menargetkan node.js 12.17.0 atau lebih baru.
Status: Eksperimental. Dapat berubah kapan saja.
Definisi jalur resolusi khusus untuk digunakan.
const { fileList } = await nodeFileTrace ( files , {
paths : {
'utils/' : '/path/to/utils/' ,
} ,
} ) ;Trailing slash direktori peta, jalur yang tepat hanya peta tepat.
Fungsi FS berikut dapat dikaitkan dengan meneruskannya sebagai opsi:
readFile(path): Promise<string>stat(path): Promise<FS.Stats>readlink(path): Promise<string>resolve(id: string, parent: string): Promise<string | string[]> Saat memberikan kait tekad khusus, Anda bertanggung jawab untuk mengembalikan satu atau lebih jalur absolut ke file yang diselesaikan berdasarkan input id . Namun mungkin Anda hanya ingin menambah atau mengesampingkan perilaku tekad dalam kasus -kasus tertentu. Anda dapat menggunakan resolver yang mendasari nft dengan mengimpornya. Fungsi resolve Builtin mengharapkan argumen tambahan yang perlu diteruskan dari kait
resolve(id: string, parent: string, job: Job, isCjs: boolean): Promise<string | string[]>Berikut adalah contoh yang menunjukkan satu ID yang diselesaikan ke jalur yang dipesan lebih dahulu sementara semua jalur lain diselesaikan oleh resolver bawaan
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 ) ;
}
} ,
} ) ; Resolusi internal mendukung penyelesaian file .ts dalam jejak secara default.
Dengan sifat mengintegrasikan ke dalam sistem build yang ada, kompiler naskah tidak termasuk dalam proyek ini - melainkan lapisan transformasi naskah membutuhkan integrasi terpisah ke dalam kait readFile .
Dalam beberapa proyek besar, logika penelusuran file dapat memproses banyak file secara bersamaan. Dalam hal ini, jika Anda tidak membatasi jumlah file bersamaan IO, masalah OOM akan terjadi.
Kami menggunakan default 1024 concurrency untuk menyeimbangkan kinerja dan penggunaan memori untuk operasi FS. Anda dapat meningkatkan nilai ini ke angka yang lebih tinggi untuk kecepatan lebih cepat, tetapi waspadai masalah memori jika konkurensi terlalu tinggi.
const { fileList } = await nodeFileTrace ( files , {
fileIOConcurrency : 2048 ,
} ) ; Opsi analisis memungkinkan penyesuaian berapa banyak analisis yang harus dilakukan untuk menyelesaikan daftar ketergantungan.
Secara default sebanyak mungkin analisis dilakukan untuk memastikan tidak ada kemungkinan file yang diperlukan di luar jejak.
Untuk menonaktifkan semua analisis, set analysis: false . Atau, opsi analisis individu dapat disesuaikan melalui:
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 ,
} ,
} ) ; Ignores khusus dapat disediakan untuk melewatkan inklusi file (dan akibatnya analisis file untuk referensi pada gilirannya juga).
const { fileList } = await nodeFileTrace ( files , {
ignore : [ './node_modules/pkg/file.js' ] ,
} ) ;Abaikan juga akan menerima fungsi atau globs.
Perhatikan bahwa jalur yang disediakan untuk diabaikan adalah relatif terhadap base .
Untuk mempertahankan cache file di antara build, berikan objek cache kosong:
const cache = Object . create ( null ) ;
const { fileList } = await nodeFileTrace ( [ 'index.ts' ] , { cache } ) ;
// later:
{
const { fileList } = await nodeFileTrace ( [ 'index.ts' ] , { cache } ) ;
}Perhatikan bahwa cache tidak validasi tidak didukung sehingga asumsinya adalah bahwa sistem file tidak diubah antara berjalan.
Untuk mendapatkan alasan yang mendasari file individual dimasukkan, objek reasons juga disediakan oleh output:
const { fileList , reasons } = await nodeFileTrace ( files ) ; reasons output kemudian akan menjadi objek dari formulir berikut:
{
[ file : string ] : {
type : 'dependency' | 'asset' | 'sharedlib' ,
ignored : true | false ,
parents : string [ ]
}
} reasons juga termasuk file yang diabaikan seperti ignored: true , dengan ignoreReason mereka.
Setiap file disertakan karena dirujuk oleh file lain. Daftar parents akan berisi daftar semua file yang menyebabkan file ini dimasukkan.