web-dev-qa-db-ja.com

別のプラグインがrequirejsを使用しているときにプラグイン内のrequirejsを再定義しないようにする方法

今ここに私はまだきちんと解決した小さい漬物があります。

私はWordpressプラグインを作成しました、そしてそれはjavascriptモジュールをロードするためにrequirejsを使います。時折私がユーザーから非常にあいまいなエラー報告を得るまでは、すべて問題ありません。結局のところ、他のテーマやプラグインがrequirejsを使うという明るい考えを持っていたとき、あなたは悪名高い "ミスマッチ匿名define()モジュール(problem)[ http://www.requirejsを得ます。 org/docs/errors.html#ミスマッチ] requirejs自体の2つのインスタンスが原因です。

これを回避する方法はありますか?

1
kontur

しばらく検索した後に方法があるように見えます。

まず第一に、これは requirejsオプティマイザー を使うこと、つまり、モジュールを単一の縮小ファイルにプリコンパイルすることを意味します。

次に、 オプティマイザオプション には、本質的にallrequireの前にnamespaceオプションがあります。definemoduleの呼び出しで、サイト上に存在する他のrequirejと干渉しなくなりました。

そのため、次のbuild.jsファイルで$ node r.js -o build.jsを呼び出します。

({
    paths: {
        'modulename': 'path/to/modulefile',
        'modulename': 'path/to/modulefile',
        'modulename': 'path/to/modulefile',
        'requireLib': 'path/to/requirejs'
    },
    name: "js/main",
    out: "js/bundle.js",
    include: "requireLib",
    namespace: "mynamespace",
})

js/main.jsで定義されたモジュールを縮小形式でjs/bundle.jsに変換し、その縮小ファイル内のすべてのrequiredモジュールおよびすべてのrequire()呼び出しは、出力ファイルのmynamespace.require()呼び出しになります。

オプティマイザがinclude自体を実際にバンドルに含めるためには、requirejsオプションが重要です。オプティマイザが内部で混乱しないように、単に「require」以外の名前(つまり「requireLib」)を呼び出す必要があります。

最後に、 このファイル には、利用可能なすべてのオプティマイザbuild.jsオプションがあります。

requirejsを使っているプラ​​グインやテーマの作者はこれを知っておくべきだと思うことは狂気です、そして実際、ほとんどの開発者は他のプラグインとの互換性のない組み合わせにぶつかるまでそうではないと思いますまたはテーマ。ただし、これはWordpressプロジェクトでrequirejsを使用しても問題が発生しないことを確認するための方法です。

0
kontur

$ wp_scripts($ wp_scripts-> registered)でエンキューされたスクリプトを見てみることもできますが、命名は異なる可能性があります(「requirejsですが、loadstuffjsと呼びましょう」という理由で)。完璧です。

また、あなたのプラグインは他のプラグインの前にロードされているかもしれず、あなたが何も制御することなく問題が引き起こされるかもしれません。

あるいは、require requiresをオプション(しかし有効)にして、この問題に遭遇したらそれを無効にするべきであると人々に言う(理由は "other" requirejsがロードされてうまく動作するからです)。また、私はあなたがこれらの問題を抱えているプラ​​グイン/テーマのリストを取得し、非互換性についてユーザーに通知し、それらがあなたの "互換モード"を有効にしたいかどうかを尋ねます(別名あなたのプラグインを通してrequirejsをロードしない)。

1
janh