Rollup-plugin-typescript2: async / await構文を含むプラグインでは機能しません

作成日 2018年08月14日  ·  15コメント  ·  ソース: ezolenko/rollup-plugin-typescript2

何が起こり、なぜそれが間違っているのか

このプラグインは、 object-hashの問題tscache.tsによって引き起こされるasync / await構文を含むプラグインでは機能しません。 現在、非同期関数を検出する方法がないため、これをオブジェクトハッシュで修正するのは難しいと思います。 では、オブジェクトハッシュなしの代替手段はありますか?

環境

バージョン

  • タイプスクリプト:2.8.3
  • ロールアップ:2.1.1
  • rollup-plugin-typescript2: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ええ、まだ多くのロールアッププラグインのインターフェースに非同期がありません。

オブジェクトをハッシュするより良い方法を知っていますか? 起動時に渡されるロールアップ構成オブジェクトに部分的に基づいて(したがって、使用されるすべてのプラグインのソースを含む)キャッシュキーを作成する必要があります。

ところで、明確にするために-問題はロールアップ設定自体の非同期のものに適用されます。 コードはソーステキストに基づいてハッシュされるため、トランスパイルされるコードの非同期は問題ではありません。

うーん、まあ、プラグインをnameプロパティにマップするカスタムリプレースメントを使用して構成全体をJSON.stringifyした結果にsha1を適用できます。これは、かなり必要だと確信しています。
たとえば、次のロールアップ構成:

{
  // ...
  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キャッシュ戦略を使用していると仮定していました。 @ezolenkoが少し前に実装したことを覚えています。 それでもロールアップ構成からキャッシュキーを計算しようとする場合、その動作を調べる必要があります

これがオブジェクトハッシュの結果にどのように影響するかはわかりませんが、 objecthashブランチのobjectHashIgnoreUnknownHackオプションは機能します。

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を通常の関数にしてpromiseを返します。

ここの人々のためにアップデートを追加すると思いましたが、ここの根本的な原因は最終的にhttps://github.com/puleos/object-hash/pull/90(https://github.com/puleos/と非常によく似ています)で修正されましたobject-hash / pull / 68上記参照)およびここ#203。 非同期プラグインをサポートするためにobjectHashIgnoreUnknownHackを使用する必要はなく、キャッシュの問題もありません-v0.26.0としてリリースされました🎉😄

このページは役に立ちましたか?
0 / 5 - 0 評価