📝 Типы ресурсов

Как описано в документации по ресурсам, Parcel представляет каждый входной файл в качестве Asset. Типы ресурсов представлены как классы, наследующие от базового класса Asset, и реализующие требуемый интерфейс для синтаксического анализа, анализа зависимостей, преобразования и генерации кода.

Поскольку Parcel обрабатывает ресурсы параллельно по нескольким процессорным ядрам, преобразования, которые могут выполнять типы ресурсов, ограничены теми из них, которые работают с одним файлом одновременно. Для преобразований нескольких файлов, может использоваться пользовательский Упаковщик.

Интерфейс ресурса


const {Asset} = require('parcel-bundler');

class MyAsset extends Asset {
  type = 'foo'; // устанавливаем основной тип вывода.

  async parse(code) {
    // разбор кода в AST.
    return ast;
  }

  async pretransform() {
    // преобразовать до сбора зависимостей. (опционально)
  }

  collectDependencies() {
    // анализ зависимостей.
    this.addDependency('my-dep');
  }

  async transform() {
    // преобразовать после сбора зависимостей. (опционально) 
  }

  async generate() {
    // генерация кода, при необходимости вы можете возвращать несколько расширений.
    // результаты передаются соответствующим упаковщикам для генерации готовых бандлов.
    return [
      {
        type: 'foo',
        value: 'my stuff here' // основной вывод
      },
      {
        type: 'js',
        value: 'some javascript', //альтернативное исполнение для размещения в JS-бандле, если необходимо
        sourceMap
      }
    ];
  }

  async postProcess(generated) {
    // Процесс после завершения генерации всего кода
    // Может использоваться для объединения типов ресурсов
  }
}

Регистрация типа ресурса

Вы можете зарегистрировать свой тип ресурса, используя метод addAssetType. Он принимает расширение файла для регистрации и путь к модулю типа ресурса. Это путь, а не фактический объект, чтобы он мог передаваться рабочим процессам.

const Bundler = require('parcel-bundler');

let bundler = new Bundler('input.js');
bundler.addAssetType('.ext', require.resolve('./MyAsset'));