Используется для определения точно, какие файлы (включая 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/' ,
} ,
} ) ;Тяжелыми ударами каталогов, точные пути карту только карту.
Следующие функции FS можно подключить, передавая их в виде параметров:
readFile(path): Promise<string>stat(path): Promise<FS.Stats>readlink(path): Promise<string>resolve(id: string, parent: string): Promise<string | string[]> При предоставлении пользовательской разрешении, вы несете ответственность за возврат одного или нескольких абсолютных путей для разрешенных файлов на основе ввода id . Однако это может быть тот случай, когда вы хотите только увеличить или переопределить поведение разрешения в определенных случаях. Вы можете использовать лежащий в основе nft Resolver, импортируя его. Функция «Строительное resolve ожидает дополнительных аргументов, которые необходимо пересылать с крючка
resolve(id: string, parent: string, job: Job, isCjs: boolean): Promise<string | string[]>Вот пример, показывающий, что один идентификатор разрешается на заказ, в то время как все другие пути разрешаются встроенными резоляциями
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 требует отдельной интеграции в крючок readFile .
В некоторых крупных проектах логика отслеживания файлов может одновременно обрабатывать много файлов. В этом случае, если вы не ограничиваете количество параллельных файлов, ввождение в IO, вероятно, возникнут проблемы.
Мы используем по умолчанию 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 будет содержать список всех файлов, которые привели к включению этого файла.