Rollup-plugin-typescript2: Не работает с плагином, содержащим синтаксис async / await

Созданный на 14 авг. 2018  ·  15Комментарии  ·  Источник: ezolenko/rollup-plugin-typescript2

Что происходит и почему это не так

Этот плагин не работает с плагином, который содержит синтаксис async / await, вызванный проблемой хэша объекта и tscache.ts . Я думаю, что это сложно исправить объектный хэш, потому что сейчас нет способа обнаружить асинхронную функцию. Так есть ли альтернатива без объектного хеша?

Среда

Версии

  • машинописный текст: 2.8.3
  • накопительный пакет: 2.1.1
  • скопированный плагин-машинописный текст2: 0.14.0

rollup.config.js

import svgr from '@svgr/rollup';
import typescript from 'rollup-plugin-typescript2';

export default {
  ...
  plugins: [
    replace({ 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV) }),
    svgr(),
    typescript({
      useTsconfigDeclarationDir: true,
    })
  ],
  ...
};

tsconfig.json

Не имеет значения.

package.json

Не имеет значения.

вывод плагина с детализацией 3

[!] (rpt2 plugin) Error: Unknown object type "asyncfunction"
src/components/atoms/Icon/index.ts
Error: Unknown object type "asyncfunction"
    at Object._object (/Users/vwxyutarooo/Projects/kouzoh/mercari-web-jp-component/node_modules/rollup-plugin-typescript2/node_modules/object-hash/index.js:218:17)
    at Object._function (/Users/vwxyutarooo/Projects/kouzoh/mercari-web-jp-component/node_modules/rollup-plugin-typescript2/node_modules/object-hash/index.js:319:14)
    at Object.dispatch (/Users/vwxyutarooo/Projects/kouzoh/mercari-web-jp-component/node_modules/rollup-plugin-typescript2/node_modules/object-hash/index.js:185:30)
    at /Users/vwxyutarooo/Projects/kouzoh/mercari-web-jp-component/node_modules/rollup-plugin-typescript2/node_modules/object-hash/index.js:246:18
    at Array.forEach (<anonymous>)
    at Object._object (/Users/vwxyutarooo/Projects/kouzoh/mercari-web-jp-component/node_modules/rollup-plugin-typescript2/node_modules/object-hash/index.js:242:21)
    at Object.dispatch (/Users/vwxyutarooo/Projects/kouzoh/mercari-web-jp-component/node_modules/rollup-plugin-typescript2/node_modules/object-hash/index.js:185:30)
    at /Users/vwxyutarooo/Projects/kouzoh/mercari-web-jp-component/node_modules/rollup-plugin-typescript2/node_modules/object-hash/index.js:260:23
    at Array.forEach (<anonymous>)
    at Object._array (/Users/vwxyutarooo/Projects/kouzoh/mercari-web-jp-component/node_modules/rollup-plugin-typescript2/node_modules/object-hash/index.js:259:20)

Самый полезный комментарий

Должен признаться, я удивлен, что до сих пор это не было большой проблемой, поскольку асинхронные функции сейчас чрезвычайно распространены 😀. Вот почему я думаю, что простое игнорирование этого приведет к большому количеству проблем с кешем. PR, который я отправил для объектного хэша некоторое время назад, был следствием этой самой проблемы, и я бы посоветовал вам удалить зависимость от объектного хэша. Я почти уверен, что PR, представленный некоторое время назад, будет работать нормально, поскольку он соответствует тому же значению, что и в сообщении об ошибке, и прошел оба модульных теста и решил проблемы в этом плагине, поэтому не стесняйтесь полагаться на PR. а не пакет NPM здесь.

@vwxyutarooo , немедленный обходной путь - установить clean: true в конфигурации, чтобы полностью обойти кеш. В качестве альтернативы (извините за плагин) я создал https://github.com/wessberg/rollup-plugin-ts, который также будет работать нормально

Все 15 Комментарий

Я добавил обходной путь, чтобы игнорировать все, что объектный хэш не может обработать (см. Ветку objecthash, параметр objectHashIgnoreUnknownHack ). Это может потенциально сделать кеш устаревшим, поэтому не является хорошим долгосрочным решением.

@wessberg

Должен признаться, я удивлен, что до сих пор это не было большой проблемой, поскольку асинхронные функции сейчас чрезвычайно распространены 😀. Вот почему я думаю, что простое игнорирование этого приведет к большому количеству проблем с кешем. PR, который я отправил для объектного хэша некоторое время назад, был следствием этой самой проблемы, и я бы посоветовал вам удалить зависимость от объектного хэша. Я почти уверен, что PR, представленный некоторое время назад, будет работать нормально, поскольку он соответствует тому же значению, что и в сообщении об ошибке, и прошел оба модульных теста и решил проблемы в этом плагине, поэтому не стесняйтесь полагаться на PR. а не пакет NPM здесь.

@vwxyutarooo , немедленный обходной путь - установить clean: true в конфигурации, чтобы полностью обойти кеш. В качестве альтернативы (извините за плагин) я создал https://github.com/wessberg/rollup-plugin-ts, который также будет работать нормально

@wessberg Да, я полагаю, что не многие подключаемые модули Rollup пока имеют асинхронный интерфейс в своем интерфейсе.

Вы знаете лучший способ хеширования объектов? Мне нужно создать ключ кеша, частично основанный на объекте конфигурации объединения (и, следовательно, содержащий источник всех используемых плагинов), который передается при запуске.

Кстати, чтобы уточнить - проблема относится к асинхронным материалам в самой конфигурации накопления. Асинхронность в транслируемом коде не является проблемой, потому что код хешируется на основе исходного текста.

Хм, ну, вы можете применить sha1 к результату JSON.stringify, заполнив всю конфигурацию с помощью настраиваемого заменителя, который сопоставляет плагины с их свойством name которое, я уверен, необходимо.
Например, следующая конфигурация накопительного пакета:

{
  // ...
  treeshake: true,
  plugins: [
    myPlugin1(),
    myPlugin2()
  ],
  // ...
}

Может быть преобразовано в следующее представление JSON:

{
  "treeshake": true,
  "plugins": [
    "name-of-my-plugin-1",
    "name-of-my-plugin-2"
  ]
}

А затем вы можете применить sha1 и получить строку base64 или что-то в этом роде, которое вы могли бы использовать в качестве ключа кеша?

Я думал в этом направлении, но разве это не уберет еще больше вещей из рассмотрения для кеширования? Я подозреваю, что object-hash было сделано специально, потому что JSON.stringify отбрасывает все, что не является свойством простого значения, массивом или словарем - в спецификации json нет ничего другого.

Полагаю, я мог бы включить хэш package-lock,json и эквивалент пряжи, если бы был надежный способ их найти. (для смягчения эффекта от варианта objectHashIgnoreUnknownHack )

Спасибо, ребята, обсуждающие эту проблему. На самом деле опция clean: true не обходит процесс кеширования, поэтому он не работает даже некоторое время. Однако, как сказал @ezolenko , ignoreUnknown может решить эту проблему. Я все равно буду ждать 0.16.2!

@vwxyutarooo , я предполагал, что clean: true использует стратегию кеширования noop. Вот что я помню, когда-то реализовал

Я не знаю , как это повлияло на объект-результат хеширования, Однако objectHashIgnoreUnknownHack опцион на objecthash ветви работает для меня.

Я немного переработал кеш, поэтому clean: true даже не будет вызывать объектный хеш и объединить все в мастер. Я выпущу через несколько дней

Сейчас в 0.17.0

Для другого обходного пути, не использующего хак objectHashIgnoreUnknownHack , я столкнулся с этой проблемой, используя rollup-plugin-require-context , и следующий фрагмент, похоже, работает:

import requireContextORIGINAL from 'rollup-plugin-require-context'

const requireContext = (options) => {
  const plugin = requireContextORIGINAL(options)
  return {
    name: plugin.name,
    transform(code, id) {
      return plugin.transform(code, id)
    }
  }
}

А именно, сделать transform нормальной функцией, возвращающей обещание.

Думал, что я добавлю здесь обновление для людей, что основная причина здесь была наконец исправлена ​​в https://github.com/puleos/object-hash/pull/90 (очень похоже на https://github.com/puleos/ object-hash / pull / 68, упомянутый выше) и здесь, в # 203. Нет необходимости использовать objectHashIgnoreUnknownHack для поддержки асинхронных плагинов и больше никаких проблем с кешем - только что была выпущена как v0.26.0 🎉 😄

Была ли эта страница полезной?
0 / 5 - 0 рейтинги