Webpackを使って、lodash
が全てをインポートしているように見えるので、私は isEqual をインポートしようとしています。私は成功せずに次のことをやろうとしました:
import { isEqual } from 'lodash'
import isEqual from 'lodash/lang'
import isEqual from 'lodash/lang/isEqual'
import { isEqual } from 'lodash/lang'
import { isEqual } from 'lodash/lang'
以下のようにlodash/パッケージ全体をインストールしなくても、lodash.isequal
を単一のモジュールとしてインストールできます。
npm install --save lodash.isequal
ECMAScript 5およびCommonJSモジュールを使用している場合は、次のようにインポートします。
var isEqual = require('lodash.isequal');
ES6モジュールを使用すると、これは次のようになります。
import isEqual from 'lodash.isequal';
そして、あなたはそれをあなたのコードの中で使うことができます:
const obj1 = {username: 'peter'};
const obj2 = {username: 'peter'};
const obj3 = {username: 'gregory'};
isEqual(obj1, obj2) // returns true
isEqual(obj1, obj3) // returns false
出典: Lodashのドキュメント
インポートした後は、コード内でisEqual
関数を使用できます。この方法でインポートした場合、_
という名前のオブジェクトの一部ではないため、don't_.isEqual
で直接参照し、isEqual
で直接参照してください。
代替方法:lodash-es
の使用
@ kimamula で指摘されているように、
WebPack 4および lodash-es 4.17.7以降では、このコードは機能します。
import { isEqual } from 'lodash-es';
これは、Webpack 4が sideEffects フラグをサポートし、lodash-es
4.17.7以降ではフラグ(false
に設定される)が含まれるためです。
スラッシュ付きのバージョンを使用しないのはなぜでしょうか?この質問に対する他の回答では、ドットの代わりにダッシュを使用することもできます。
import isEqual from 'lodash/isequal';
これも機能しますが、2つの小さな欠点があります。
npm install --save lodash
)全体をインストールする必要があります。記憶スペースは安く、CPUは速いです、従ってこれを気にしないかもしれませんisEqual
の最小コード例のバンドルサイズが平均28%大きいことを発見しました(webpack 2とwebpack 3を、Babelの有無にかかわらず、Uglifyの有無にかかわらず試してみました)。他のisEqual
関数ではなくlodash
を含めたいだけの場合(バンドルサイズを小さくするのに役立ちます)、ES6でこれを実行できます。
import isEqual from 'lodash/isEqual'
これは lodash
README で説明されているものとほとんど同じですが、そこではrequire()
構文を使用します。
var at = require('lodash/at');
Webpack 4とlodash-es 4.17.7以降では、このコードは機能します。
import { isEqual } from 'lodash-es';
これは、webpack 4が sideEffects
フラグ とlodash-es 4.17.7以降をサポートしているためです(これはfalse
に設定されています)。
編集
バージョン1.9.0以降、Parcelは"sideEffects": false
もサポートしています。rereforeimport { isEqual } from 'lodash-es';
もParcelとツリーシェイク可能です。
Webpackとは関係ありませんが、多くの人が現在TypeScriptに移行しているので、ここに追加します。
TypeScriptでimport isEqual from 'lodash/isEqual';
をコンパイラオプション(tsconfig.json)のesModuleInterop
フラグと共に使用して、lodashから単一の関数をインポートすることもできます。
例
{
"compilerOptions": {
"module": "commonjs",
"target": "es5",
"lib": ["es6", "dom"],
"moduleResolution": "node",
"esModuleInterop": true,
...
}
}
Lodashは README にいくつかのオプションをリストしています。
$ npm i --save lodash
$ npm i --save-dev babel-plugin-lodash @babel/cli @babel/preset-env
.babelrc
に追加してください{
"plugins": ["lodash"],
"presets": [["@babel/env", { "targets": { "node": 6 } }]]
}
import _ from 'lodash'
import { add } from 'lodash/fp'
const addOne = add(1)
_.map([1, 2, 3], addOne)
大体これに:
import _add from 'lodash/fp/add'
import _map from 'lodash/map'
const addOne = _add(1)
_map([1, 2, 3], addOne)
$ npm i --save lodash
$ npm i --save-dev lodash-webpack-plugin babel-core babel-loader babel-plugin-lodash babel-preset-env webpack
webpack.config.js
を設定します。var LodashModuleReplacementPlugin = require('lodash-webpack-plugin');
var webpack = require('webpack');
module.exports = {
'module': {
'rules': [{
'use': 'babel-loader',
'test': /\.js$/,
'exclude': /node_modules/,
'options': {
'plugins': ['lodash'],
'presets': [['env', { 'modules': false, 'targets': { 'node': 4 } }]]
}
}]
},
'plugins': [
new LodashModuleReplacementPlugin,
new webpack.optimize.UglifyJsPlugin
]
};
$ lodash modularize exports=es -o ./
import { isEqual } from 'lodash-es';
はライブラリ全体をインポートしています。私はロールアップを使用しています。これはデフォルトでツリーシェイクをするべきです。
私自身のモジュールを書いたときはいつでも、この名前付きimport構文はうまくいき、Rollupはうまくツリーシェイクするので、なぜそれがLodashでうまくいかないのかについて少し混乱しています。
これは実際に私のために働いた
import { isEqual } from 'lodash';