Se utiliza para determinar exactamente qué archivos (incluido node_modules ) son necesarios para el tiempo de ejecución de la aplicación.
Esto es similar a @Vercel/NCC, excepto que no se realiza una agrupación y, por lo tanto, no hay dependencia de Webpack. Esto logra los mismos beneficios para sacudir árboles sin mover ningún activo o binarios.
npm i @vercel/nftProporcione la lista de archivos de origen como entrada:
const { nodeFileTrace } = require ( '@vercel/nft' ) ;
const files = [ './src/main.js' , './src/second.js' ] ;
const { fileList } = await nodeFileTrace ( files ) ; La lista de archivos incluirá todos los módulos y activos node_modules que el código de aplicación puede necesitar.
La ruta base para la lista de archivos: todos los archivos se proporcionarán como relativos a esta base.
Por defecto, se utiliza el process.cwd() :
const { fileList } = await nodeFileTrace ( files , {
base : process . cwd ( ) ,
} ) ; Cualquier archivo/carpetas por encima de la base se ignora en el listado y el análisis.
Al aplicar el análisis, ciertas funciones confían en el valor process.cwd() , como path.resolve('./relative') o incluso una invocación directa process.cwd() .
Establecer la opción processCwd permite que este análisis se guíe a la ruta correcta para garantizar que los activos se detecten correctamente.
const { fileList } = await nodeFileTrace ( files , {
processCwd : path . resolve ( __dirname ) ,
} ) ; Por defecto, processCwd es el mismo que base .
Por defecto, el rastreo de los campos de "exportaciones" e "importaciones" nodo.js es compatible con el "node" , "require" , las condiciones "import" y "default" trazadas como se define.
Alternativamente, se puede proporcionar la lista explícita de condiciones:
const { fileList } = await nodeFileTrace ( files , {
conditions : [ 'node' , 'production' ] ,
} ) ; Solo la exportación del "node" debe incluirse explícitamente (si es necesario) al especificar la lista de condición de exportación exacta. Las condiciones "require" , "import" y "default" siempre se rastrearán como se define, sin importar qué condiciones personalizadas estén establecidas.
Al rastrear las exportaciones, el campo "main" / índice aún se rastreará para las versiones Node.js sin soporte de "exports" .
Esto se puede deshabilitar con la opción exportsOnly :
const { fileList } = await nodeFileTrace ( files , {
exportsOnly : true ,
} ) ; Cualquier paquete con "exports" solo tendrá sus exportaciones rastreadas, y el principal no se incluirá en absoluto. Esto puede reducir el tamaño de salida al dirigir el nodo.js 12.17.0 o más nuevo.
Estado: experimental. Puede cambiar en cualquier momento.
Definiciones de ruta de resolución personalizada para usar.
const { fileList } = await nodeFileTrace ( files , {
paths : {
'utils/' : '/path/to/utils/' ,
} ,
} ) ;Directorios de mapas de barras de arrastre, rutas exactas mapa exactamente exacto.
Las siguientes funciones FS se pueden conectar pasando como opciones:
readFile(path): Promise<string>stat(path): Promise<FS.Stats>readlink(path): Promise<string>resolve(id: string, parent: string): Promise<string | string[]> Al proporcionar un gancho de resolución personalizado, usted es responsable de devolver una o más rutas absolutas a archivos resueltos en función de la entrada id . Sin embargo, puede ser el caso de que solo desee aumentar o anular el comportamiento de resolución en ciertos casos. Puede usar el resolución subyacente de nft importándolo. La función resolve de Builtin espera argumentos adicionales que deben enviarse desde el gancho
resolve(id: string, parent: string, job: Job, isCjs: boolean): Promise<string | string[]>Aquí hay un ejemplo que muestra una identificación que se resuelve a una ruta a medida mientras el resolución incorporado resuelve todas las demás rutas.
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 ) ;
}
} ,
} ) ; La resolución interna admite la resolución de archivos .ts en trazas de forma predeterminada.
Por su naturaleza de integrarse en los sistemas de compilación existentes, el compilador TypeScript no está incluido en este proyecto, sino que la capa de transformación de TypeScript requiere una integración separada en el gancho readFile .
En algunos proyectos grandes, la lógica de rastreo de archivos puede procesar muchos archivos al mismo tiempo. En este caso, si no limita el número de archivos concurrentes IO, es probable que ocurran problemas de OOM.
Utilizamos un valor predeterminado de 1024 concurrencia para equilibrar el rendimiento y el uso de la memoria para las operaciones FS. Puede aumentar este valor a un número más alto a una velocidad más rápida, pero tenga en cuenta los problemas de memoria si la concurrencia es demasiado alta.
const { fileList } = await nodeFileTrace ( files , {
fileIOConcurrency : 2048 ,
} ) ; Las opciones de análisis permiten personalizar cuánto análisis se debe realizar para resolver exactamente la lista de dependencias.
Por defecto, se realiza el mayor análisis posible para asegurarse de que no se necesiten archivos fuera de la traza.
Para deshabilitar todo el análisis, establecer analysis: false . Alternativamente, las opciones de análisis individuales se pueden personalizar a través de:
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 ,
} ,
} ) ; Custom Ignores se puede proporcionar para omitir la inclusión del archivo (y en consecuencia el análisis del archivo para referencias a su vez).
const { fileList } = await nodeFileTrace ( files , {
ignore : [ './node_modules/pkg/file.js' ] ,
} ) ;Ignore también aceptará una función o globos.
Tenga en cuenta que la ruta proporcionada para ignorar es relativa a base .
Para persistir el caché de archivo entre compilaciones, pase un objeto cache vacío:
const cache = Object . create ( null ) ;
const { fileList } = await nodeFileTrace ( [ 'index.ts' ] , { cache } ) ;
// later:
{
const { fileList } = await nodeFileTrace ( [ 'index.ts' ] , { cache } ) ;
}Tenga en cuenta que las invalidaciones de caché no son compatibles, por lo que la suposición es que el sistema de archivos no se cambia entre las ejecuciones.
Para obtener las razones subyacentes para que se incluyan archivos individuales, la salida también proporciona un reasons por las que el objeto:
const { fileList , reasons } = await nodeFileTrace ( files ) ; La salida reasons será un objeto de la siguiente forma:
{
[ file : string ] : {
type : 'dependency' | 'asset' | 'sharedlib' ,
ignored : true | false ,
parents : string [ ]
}
} reasons también incluyen archivos que fueron ignorados como ignored: true , con su ignoreReason .
Cada archivo está incluido porque se hace referencia a otro archivo. La lista parents contendrá la lista de todos los archivos que causaron que este archivo se incluyera.