用于确切确定应用程序运行时需要确切确定哪些文件(包括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上方的任何文件/文件夹。
应用分析时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输入返回一个或多个绝对路径以解决文件。但是,您可能只想在某些情况下增加或覆盖解决行为。您可以通过导入nft的基础解析器。内置的resolve函数期望需要从钩子转发的其他参数
resolve(id: string, parent: string, job: Job, isCjs: boolean): Promise<string | string[]>这是一个示例,显示一个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 ) ;
}
} ,
} ) ; 默认情况下,内部分辨率支持在跟踪中解析.ts文件。
通过将打字稿编译器集成到现有的构建系统中的性质,该项目不包括在此项目中 - 而不是打字稿转换层需要将整合到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列表将包含所有导致此文件的文件的列表。