ใช้เพื่อพิจารณาว่าไฟล์ใด (รวมถึง node_modules ) จำเป็นสำหรับแอปพลิเคชันรันไทม์
สิ่งนี้คล้ายกับ @vercel/NCC ยกเว้นว่าไม่มีการรวมกลุ่มและดังนั้นจึงไม่มีการพึ่งพา Webpack สิ่งนี้จะได้รับประโยชน์จากการเขย่าต้นไม้แบบเดียวกันโดยไม่ต้องย้ายสินทรัพย์หรือไบนารีใด ๆ
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 จะถูกละเว้นในรายการและการวิเคราะห์
เมื่อใช้การวิเคราะห์ฟังก์ชั่นบางอย่างขึ้นอยู่กับค่า process.cwd() เช่น path.resolve('./relative') หรือแม้กระทั่งกระบวนการโดยตรง 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" / ดัชนีจะยังคงติดตามสำหรับเวอร์ชัน Node.js โดยไม่ต้องสนับสนุน "exports"
สามารถปิดใช้งานได้ด้วยตัวเลือก exportsOnly :
const { fileList } = await nodeFileTrace ( files , {
exportsOnly : true ,
} ) ; แพ็คเกจใด ๆ ที่มี "exports" จะมีการติดตามการส่งออกเท่านั้นและจะไม่รวมหลักเลย สิ่งนี้สามารถลดขนาดเอาต์พุตเมื่อกำหนดเป้าหมาย node.js 12.17.0 หรือใหม่กว่า
สถานะ: การทดลอง อาจเปลี่ยนแปลงได้ตลอดเวลา
คำจำกัดความเส้นทางความละเอียดที่กำหนดเองที่จะใช้
const { fileList } = await nodeFileTrace ( files , {
paths : {
'utils/' : '/path/to/utils/' ,
} ,
} ) ;ตามท้าย Slashes Map Directory เส้นทางที่แน่นอนแผนที่แน่นอนเท่านั้น
ฟังก์ชั่น FS ต่อไปนี้สามารถเชื่อมต่อได้โดยส่งเป็นตัวเลือก:
readFile(path): Promise<string>stat(path): Promise<FS.Stats>readlink(path): Promise<string>resolve(id: string, parent: string): Promise<string | string[]> เมื่อจัดหาเบ็ดการแก้ไขที่กำหนดเองคุณจะต้องรับผิดชอบในการส่งคืนเส้นทางสัมบูรณ์อย่างน้อยหนึ่งเส้นทางไปยังไฟล์ที่ได้รับการแก้ไขตามอินพุต id อย่างไรก็ตามอาจเป็นกรณีที่คุณต้องการเพิ่มหรือแทนที่พฤติกรรมการแก้ไขในบางกรณี คุณสามารถใช้การแก้ไขพื้นฐานของ nft ได้โดยการนำเข้า ฟังก์ resolve ในตัวคาดว่าจะมีข้อโต้แย้งเพิ่มเติมที่จำเป็นต้องส่งต่อจากเบ็ด
resolve(id: string, parent: string, job: Job, isCjs: boolean): Promise<string | string[]>นี่คือตัวอย่างที่แสดง ID หนึ่ง ID ที่ได้รับการแก้ไขเป็นเส้นทาง bespoke ในขณะที่เส้นทางอื่น ๆ ทั้งหมดได้รับการแก้ไขโดยตัวแก้ไขในตัว
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 ) ;
}
} ,
} ) ; ความละเอียดภายในรองรับการแก้ไขไฟล์ .ts ในร่องรอยโดยค่าเริ่มต้น
ด้วยลักษณะของการรวมเข้ากับระบบบิลด์ที่มีอยู่แล้วคอมไพเลอร์ TypeScript จะไม่รวมอยู่ในโครงการนี้ - แทนที่จะเป็นเลเยอร์การแปลง TypeScript ต้องรวมการรวมเข้ากับ hook 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 ยังรวมถึงไฟล์ที่ถูกละเว้นว่า ignored: true ด้วย ignoreReason ของพวกเขา
ทุกไฟล์รวมอยู่เนื่องจากมีการอ้างอิงโดยไฟล์อื่น รายชื่อ parents จะมีรายการไฟล์ทั้งหมดที่ทำให้ไฟล์นี้รวมอยู่ด้วย