Utilisé pour déterminer exactement quels fichiers (y compris node_modules ) sont nécessaires pour l'exécution de l'application.
Ceci est similaire à @ Vercel / NCC, sauf qu'il n'y a pas de regroupement effectué et donc pas de dépendance sur WebPack. Cela réalise les mêmes avantages en train de secouer des arbres sans déplacer aucun actif ou binaire.
npm i @vercel/nftFournissez la liste des fichiers source en entrée:
const { nodeFileTrace } = require ( '@vercel/nft' ) ;
const files = [ './src/main.js' , './src/second.js' ] ;
const { fileList } = await nodeFileTrace ( files ) ; La liste des fichiers inclura tous les modules et actifs node_modules qui peuvent être nécessaires par le code d'application.
Le chemin de base de la liste des fichiers - tous les fichiers seront fournis par rapport à cette base.
Par défaut, le process.cwd() est utilisé:
const { fileList } = await nodeFileTrace ( files , {
base : process . cwd ( ) ,
} ) ; Tous les fichiers / dossiers au-dessus de la base sont ignorés dans la liste et l'analyse.
Lors de l'application de l'analyse, certaines fonctions s'appuient sur la valeur process.cwd() , telles que path.resolve('./relative') ou même un process.cwd() invocation.
La définition de l'option processCwd permet de guider cette analyse vers le bon chemin pour s'assurer que les actifs sont correctement détectés.
const { fileList } = await nodeFileTrace ( files , {
processCwd : path . resolve ( __dirname ) ,
} ) ; Par défaut processCwd est le même que base .
Par défaut, le traçage des champs Node.js "Exports" et "Imports" est pris en charge, avec les conditions "node" , "require" , "import" et "default" tracées telles que définies.
Alternativement, la liste explicite des conditions peut être fournie:
const { fileList } = await nodeFileTrace ( files , {
conditions : [ 'node' , 'production' ] ,
} ) ; Seule l'exportation "node" doit être explicitement incluse (si nécessaire) lors de la spécification de la liste des conditions d'exportation exacte. Les conditions "require" , "import" et "default" seront toujours tracées telles que définies, quelles que soient les conditions personnalisées définies.
Lors du traçage des exportations, le champ "main" / index sera toujours tracé pour les versions Node.js sans support "exports" .
Cela peut être désactivé avec l'option exportsOnly :
const { fileList } = await nodeFileTrace ( files , {
exportsOnly : true ,
} ) ; Tout package avec "exports" ne fera alors tracer ses exportations que ses exportations, et la principale ne sera pas du tout incluse. Cela peut réduire la taille de sortie lors du ciblage de Node.js 12.17.0 ou plus récent.
Statut: expérimental. Peut changer à tout moment.
Définitions de chemin de résolution personnalisé à utiliser.
const { fileList } = await nodeFileTrace ( files , {
paths : {
'utils/' : '/path/to/utils/' ,
} ,
} ) ;Les répertoires de cartes de barre de fuite, la carte des chemins exacts ne sont que exactement.
Les fonctions FS suivantes peuvent être accrochées en les faisant passer comme options:
readFile(path): Promise<string>stat(path): Promise<FS.Stats>readlink(path): Promise<string>resolve(id: string, parent: string): Promise<string | string[]> Lorsque vous fournissez un crochet de résolution personnalisé, vous êtes responsable de retourner un ou plusieurs chemins absolus pour résoudre les fichiers en fonction de l'entrée id . Cependant, il se peut que vous souhaitiez seulement augmenter ou remplacer le comportement de résolution dans certains cas. Vous pouvez utiliser le résolveur sous-jacent de nft en l'important. La fonction resolve intégrée prévoit des arguments supplémentaires qui doivent être transmis à partir du crochet
resolve(id: string, parent: string, job: Job, isCjs: boolean): Promise<string | string[]>Voici un exemple montrant un ID résolu en un chemin sur mesure tandis que tous les autres chemins résolus par le résolveur intégré
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 résolution interne prend en charge la résolution des fichiers .ts par défaut par défaut.
De par sa nature de l'intégration dans les systèmes de construction existants, le compilateur TypeScript n'est pas inclus dans ce projet - mais la couche de transformation TypeScript nécessite une intégration distincte dans le crochet readFile .
Dans certains grands projets, la logique de traçage de fichiers peut traiter de nombreux fichiers en même temps. Dans ce cas, si vous ne limitez pas le nombre de fichiers simultanés IO, les problèmes OOM sont susceptibles de se produire.
Nous utilisons une valeur par défaut de 1024 concurrence pour équilibrer les performances et l'utilisation de la mémoire pour les opérations FS. Vous pouvez augmenter cette valeur à un nombre plus élevé pour une vitesse plus rapide, mais soyez conscient des problèmes de mémoire si la concurrence est trop élevée.
const { fileList } = await nodeFileTrace ( files , {
fileIOConcurrency : 2048 ,
} ) ; Les options d'analyse permettent de personnaliser la quantité d'analyse qui doit être effectuée pour déterminer exactement la liste des dépendances.
Par défaut, une analyse que possible est effectuée pour s'assurer qu'aucun fichier éventuellement nécessaire ne soit exclu de la trace.
Pour désactiver toutes les analyses, définissez analysis: false . Alternativement, les options d'analyse individuelles peuvent être personnalisées via:
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 ,
} ,
} ) ; Les ignores personnalisées peuvent être fournies pour sauter l'inclusion des fichiers (et par conséquent l'analyse du fichier pour les références à leur tour également).
const { fileList } = await nodeFileTrace ( files , {
ignore : [ './node_modules/pkg/file.js' ] ,
} ) ;Ignore acceptera également une fonction ou des globes.
Notez que le chemin fourni à ignorer est relatif à base .
Pour persister le cache de fichier entre les constructions, passez un objet cache vide:
const cache = Object . create ( null ) ;
const { fileList } = await nodeFileTrace ( [ 'index.ts' ] , { cache } ) ;
// later:
{
const { fileList } = await nodeFileTrace ( [ 'index.ts' ] , { cache } ) ;
}Notez que les invalidations du cache ne sont pas prises en charge, donc l'hypothèse est que le système de fichiers n'est pas modifié entre les exécutions.
Pour obtenir les raisons sous-jacentes de l'inclusion des fichiers individuels, un objet reasons est également fourni par la sortie:
const { fileList , reasons } = await nodeFileTrace ( files ) ; Les reasons de sortie seront alors un objet du formulaire suivant:
{
[ file : string ] : {
type : 'dependency' | 'asset' | 'sharedlib' ,
ignored : true | false ,
parents : string [ ]
}
} reasons comprennent également des fichiers qui ont été ignorés comme ignored: true , avec leur ignoreReason .
Chaque fichier est inclus car il est référencé par un autre fichier. La liste parents contiendra la liste de tous les fichiers qui ont provoqué l'inclusion de ce fichier.