Webpack實(shí)現(xiàn)按需打包Lodash的幾種方法詳解
前言
在數(shù)據(jù)操作時,Lodash 就是我的彈藥庫,不管遇到多復(fù)雜的數(shù)據(jù)結(jié)構(gòu)都能用一些函數(shù)輕松拆解。
ES6 中也新增了諸多新的對象函數(shù),一些簡單的項(xiàng)目中 ES6 就足夠使用了,但還是會有例外的情況引用了少數(shù)的 Lodash 函數(shù)。一個完整的 Lodash 庫,即使是壓縮后,現(xiàn)最新版本也有 71k 的體積。不能為了吃一口飯而買下一個飯店啊。
針對這個問題,其實(shí)已經(jīng)有很多可選方案了。
函數(shù)模塊
Lodash 中的每個函數(shù)在 NPM 都有一個單獨(dú)的發(fā)布模塊。NPM: results for ‘lodash'
假如你只需要使用_.isEqual,那么你只需要安裝lodash.isequal
模塊,然后按以下方式引用。
var isEqual = require('lodash.isequal') // or ES6 import isEqual from 'lodash.isequal' isEqual([1, 2, 3], [1, 2, 3]) // true
全路徑引用
在你完整安裝 Lodash 后,可以按lodash/函數(shù)名的格式單獨(dú)引入需要的函數(shù)模塊。
var difference = require('lodash/difference') // or ES6 import difference from 'lodash/difference' difference([1, 2], [1, 3]) // [2]
使用插件優(yōu)化
在簡單場景下,以上兩種方式足以解決問題。
而遇到復(fù)雜的數(shù)據(jù)對象時,我們不得不在一個文件中引入多個 Lodash 函數(shù),這樣就需要在文件中寫多個require或import相關(guān)函數(shù)。
import remove from 'lodash/remove' import uniq from 'lodash/uniq' import invokeMap from 'lodash/invokeMap' import sortBy from 'lodash/sortBy' // more...
正寫到關(guān)鍵處卻因?yàn)橐胍粋€函數(shù)要拉到文件頭部去定義引用而打亂了思路,很不爽!
于是我機(jī)智的到 Github 去搜索了webpack和lodash兩個關(guān)鍵詞的組合,排在首位的 lodash-webpack-plugin 就是為了解決這個問題而生。
使用時需要以下模塊,其實(shí)除了前兩個剩下的一般都已安裝了:
$ npm i -S lodash-webpack-plugin babel-plugin-lodash babel-core babel-loader babel-preset-es2015 webpack
配置:
webpack.config.js var LodashModuleReplacementPlugin = require('lodash-webpack-plugin'); var webpack = require('webpack'); module.exports = { module: { loaders: [{ loader: 'babel', test: /\.js$/, exclude: /node_modules/, query: { plugins: ['transform-runtime', 'lodash'], presets: ['es2015'] } }] }, plugins: [ new LodashModuleReplacementPlugin, new webpack.optimize.OccurrenceOrderPlugin, new webpack.optimize.UglifyJsPlugin ] }
其中babel-plugin-lodash的配置,也就是plugins: ['lodash']
,并不是一定要在loaders中,也可以單獨(dú)定義babel。
webpack.config.js var LodashModuleReplacementPlugin = require('lodash-webpack-plugin'); var webpack = require('webpack'); module.exports = { module: { loaders: [{ loader: 'babel', test: /\.js$/, exclude: /node_modules/ }] }, babel: { presets: ['es2015'], plugins: ['transform-runtime', 'lodash'] }, plugins: [ new LodashModuleReplacementPlugin, new webpack.optimize.OccurrenceOrderPlugin, new webpack.optimize.UglifyJsPlugin ] }
又或者是.babelrc文件中。
以上工作完成了,在每個你需要使用 lodash 函數(shù)的文件中只需要引用一次 lodash,即可調(diào)用任意函數(shù)而不會造成完全打包。
import _ from 'lodash' _.add(1, 2) // 打包時只會引入這一個函數(shù)模塊
注意:必須要使用 ES2015 的模塊引用方式才有效。
以上即是我目前所知道的幾種方式,如果哪位朋友有更好的方式(比如只需要全局引入一次),請一定分享與我!
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
微信小程序自定義頭部導(dǎo)航欄和導(dǎo)航欄背景圖片 navigationStyle問題
這篇文章主要介紹了微信小程序 自定義頭部導(dǎo)航欄和導(dǎo)航欄背景圖片 navigationStyle功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-07-07js 獲取網(wǎng)絡(luò)圖片的高度和寬度的實(shí)現(xiàn)方法(變通了下)
簡單地說就是把圖片放入一個自動伸縮的DIV中,然后獲取DIV的寬和高!這個不錯的變通,大家可以參考下。2009-10-10解決layer 關(guān)閉當(dāng)前彈窗 關(guān)閉遮罩層 input值獲取不到的問題
今天小編就為大家分享一篇解決layer 關(guān)閉當(dāng)前彈窗 關(guān)閉遮罩層 input值獲取不到的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09整理關(guān)于Bootstrap導(dǎo)航的慕課筆記
這篇文章主要為大家整理了關(guān)于Bootstrap導(dǎo)航的慕課筆記,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03基于JavaScript實(shí)現(xiàn)窗口拖動效果
這篇文章主要介紹了基于JavaScript實(shí)現(xiàn)窗口拖動效果的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01JavaScript實(shí)戰(zhàn)(原生range和自定義特效)簡單實(shí)例
下面小編就為大家?guī)硪黄狫avaScript實(shí)戰(zhàn)(原生range和自定義特效)簡單實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-08-08js位運(yùn)算在實(shí)際中使用的實(shí)例教程
我們可能很少在編程中用位運(yùn)算,如果沒深入學(xué)習(xí),可能也很難理解,下面這篇文章主要給大家介紹了關(guān)于js位運(yùn)算在實(shí)際中使用的相關(guān)資料,需要的朋友可以參考下2022-03-03