今日1.9.2から1.10.2にアップデートしましたが、 require('underscore');
を使用するとミックスインが機能しなくなりました
これはTypeError: _.camelcase is not a function
失敗します:
const _ = require('underscore');
const underscoreString = require('underscore.string');
_.mixin(underscoreString.exports());
console.log(_.camelcase('foo-bar'));
しかし、これは機能します:
import _ from 'underscore';
const underscoreString = require('underscore.string');
_.mixin(underscoreString.exports());
console.log(_.camelcase('foo-bar'));
@dmaicher、これがあなたを噛んでいると聞いて申し訳ありません。 ただし、Underscore1.10.2およびunderscore.string3.3.5ではこれを再現できません。 セットアップについて何か特別なことはありますか?
迅速な返信ありがとうございます:blush:
[email protected]
を使用していますが、ブラウザにバンドルされているコードで問題が発生します。 CLIでノードを使用してコードを実行すると、問題がないように見えます:confused:
最小限の再現機能は次のとおりです: https :
ここにあなたの問題があります:
そのインポートパスunderscore/modules/index-all.js
、WebPackがpackage.json
のmodule
フィールドから取得している必要があります。
一方、CommonJSインポートを使用している場合、 main
フィールドを使用する必要があります。 module
は、それらをサポートするツールへのESインポート用であり、 main
は他のすべてのユーザー用です。 これは、コードがimport
が、 require()
では機能しない理由を説明しています。
どうやら、最近のWebPackはデフォルトでESモジュールを想定していますが、CommonJSインポートのフォールバックがあります。 ESモジュールを想定しないように、またはmodule
フィールドを無視するように、何らかの方法で構成する必要があると思います。 または、ESモジュールに切り替えたい場合もあります。
これはアンダースコアの問題ではなくWebPackの問題であるため、これを終了します。 ただし、コメントを続けてください。
@jgonggrijpチェックしてくれてありがとう:+1:
webpack設定で解決するためのエイリアスを追加することで修正できました:
'underscore': 'underscore/underscore.js',
しかし、これは私には少し奇妙に思えます。 私が指定する使用する多くの他のパッケージ"main"
と"module"
自分の内側にpackage.json
と彼らのためにそれがうまく動作します。
Webpackは、最初に見つかったフィールドを['browser', 'module', 'main']
順序で取得します
https://webpack.js.org/configuration/resolve/#resolvemainfieldsを参照して
アンダースコアでのみ失敗するのに、他のパッケージでは機能しているように見えるのはなぜか知りたいです:blush:
これらの他のパッケージに名前を付けていただければ幸いです。 とにかく、 module
とmain
は互換性があることを意図していないので、WebPackがそれらをそのように扱うことは保証されていません。
https://github.com/rollup/rollup/wiki/pkg.module
リンクしたドキュメントは、 resolve.mainFields
を['main']
に設定するという、おそらく少し醜い解決策を示唆しています。 繰り返しになりますが、CommonJSインポートを使用しているので、WebPackはそもそもmodule
を考慮すべきではないと思います。
関連するwebpackの問題: https :
はい、それはあなたの問題です。 module
に解決するときにWebPackがCommonJSをエミュレートする方法にも問題があるようですが。 次のようなことをしているようです。
// converting modules/index-all.js to ES3
var underscoreESModule = {
'default': _,
map: _.map,
filter: _.filter,
// ...
};
// in your code that imports underscore
var _ = underscoreESModule;
後者の行は、これを実行している場合に意味があります。
import * as _ from 'underscore';
しかし、実際に行っていることはこれと同等です。
import _ from 'underscore';
それをWebPackでES3に変換する正しい方法は次のとおりです。
var _ = underscoreESModule['default'];
これは、他の人がwebpack / webpack#5756で遭遇している問題でもあります。
BrowserifyやRollupなどの他のビルドツールは、これをよりインテリジェントに処理します。 ただ言って...