Webpack实现按需打包Lodash的几种方法详解


Posted in Javascript onMay 08, 2017

前言

在数据操作时,Lodash 就是我的弹药库,不管遇到多复杂的数据结构都能用一些函数轻松拆解。

ES6 中也新增了诸多新的对象函数,一些简单的项目中 ES6 就足够使用了,但还是会有例外的情况引用了少数的 Lodash 函数。一个完整的 Lodash 库,即使是压缩后,现最新版本也有 71k 的体积。不能为了吃一口饭而买下一个饭店啊。

针对这个问题,其实已经有很多可选方案了。

函数模块

Lodash 中的每个函数在 NPM 都有一个单独的发布模块。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/函数名的格式单独引入需要的函数模块。

var difference = require('lodash/difference')
// or ES6
import difference from 'lodash/difference'
difference([1, 2], [1, 3]) // [2]

使用插件优化

在简单场景下,以上两种方式足以解决问题。

而遇到复杂的数据对象时,我们不得不在一个文件中引入多个 Lodash 函数,这样就需要在文件中写多个require或import相关函数。

import remove from 'lodash/remove'
import uniq from 'lodash/uniq'
import invokeMap from 'lodash/invokeMap'
import sortBy from 'lodash/sortBy'
// more...

正写到关键处却因为引入一个函数要拉到文件头部去定义引用而打乱了思路,很不爽!

于是我机智的到 Github 去搜索了webpack和lodash两个关键词的组合,排在首位的 lodash-webpack-plugin 就是为了解决这个问题而生。

使用时需要以下模块,其实除了前两个剩下的一般都已安装了:

$ 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中,也可以单独定义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 函数的文件中只需要引用一次 lodash,即可调用任意函数而不会造成完全打包。

import _ from 'lodash'
_.add(1, 2) // 打包时只会引入这一个函数模块

注意:必须要使用 ES2015 的模块引用方式才有效。

以上即是我目前所知道的几种方式,如果哪位朋友有更好的方式(比如只需要全局引入一次),请一定分享与我!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JQuery 1.4 中的Ajax问题
Jan 23 Javascript
捕获键盘事件(且兼容各浏览器)
Jul 03 Javascript
jQuery简单实现banner图片切换
Jan 02 Javascript
JS获取URL中参数值(QueryString)的4种方法分享
Apr 12 Javascript
ExtJS中设置下拉列表框不可编辑的方法
May 07 Javascript
使用JavaScript和CSS实现文本隔行换色的方法
Nov 04 Javascript
老司机带你解读jQuery插件开发流程
May 16 Javascript
JS对象是否拥有某属性如何判断
Feb 03 Javascript
Jquery把获取到的input值转换成json
May 15 jQuery
详解使用angular的HttpClient搭配rxjs
Sep 01 Javascript
最新Javascript程序员面试试题和解题方法
Nov 23 Javascript
vue 输入电话号码自动按3-4-4分割功能的实现代码
Apr 30 Javascript
JS正则表达式验证中文字符
May 08 #Javascript
bootstrap table表格插件使用详解
May 08 #Javascript
将input框中输入内容显示在相应的div中【三种方法可选】
May 08 #Javascript
PHP实现记录代码运行时间封装类实例教程
May 08 #Javascript
jquery平滑滚动到顶部插件使用详解
May 08 #jQuery
H5上传本地图片并预览功能
May 08 #Javascript
jQuery实现select下拉框获取当前选中文本、值、索引
May 08 #jQuery
You might like
PHP Zip压缩 在线对文件进行压缩的函数
2010/05/26 PHP
关于file_get_contents返回为空或函数不可用的解决方案
2013/06/24 PHP
PHP array_key_exists检查键名或索引是否存在于数组中的实现方法
2016/06/13 PHP
PHP简单实现循环链表功能示例
2017/11/10 PHP
PHP中散列密码的安全性分析
2019/07/26 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
2020/02/10 PHP
Nigma vs Alliance BO5 第三场2.14
2021/03/10 DOTA
JS 判断undefined的实现代码
2009/11/26 Javascript
node.js中的favicon.ico请求问题处理
2014/12/15 Javascript
Javascript获取表单名称(name)的方法
2015/04/02 Javascript
JavaScript Math.round() 方法
2015/12/18 Javascript
基于Bootstrap里面的Button dropdown打造自定义select
2016/05/30 Javascript
Bootstrap弹出框modal上层的输入框不能获得焦点问题的解决方法
2016/12/13 Javascript
jquery实现转盘抽奖功能
2017/01/06 Javascript
详解nodejs实现本地上传图片并预览功能(express4.0+)
2017/06/28 NodeJs
详解关于react-redux中的connect用法介绍及原理解析
2017/09/11 Javascript
获取本机IP地址的实例(JavaScript / Node.js)
2017/11/24 Javascript
Vue 实现树形视图数据功能
2018/05/07 Javascript
微信小程序生成海报分享朋友圈的实现方法
2019/05/06 Javascript
JS+CSS+HTML实现“代码雨”类似黑客帝国文字下落效果
2020/03/17 Javascript
详解Vue中Axios封装API接口的思路及方法
2020/10/10 Javascript
利用JavaScript模拟京东按键输入功能
2020/12/01 Javascript
[08:40]Navi Vs Newbee
2018/06/07 DOTA
python实现自动更换ip的方法
2015/05/05 Python
python面向对象_详谈类的继承与方法的重载
2017/06/07 Python
Python实现的生成格雷码功能示例
2018/01/24 Python
VSCode下好用的Python插件及配置
2018/04/06 Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
2020/03/04 Python
在django admin详情表单显示中添加自定义控件的实现
2020/03/11 Python
利用pandas向一个csv文件追加写入数据的实现示例
2020/04/23 Python
澳大利亚墨水站Ink Station:墨水和碳粉打印机墨盒
2019/03/24 全球购物
商务考察邀请函范文
2014/01/21 职场文书
入党自我鉴定
2014/03/25 职场文书
作风建设年度心得体会
2014/10/29 职场文书
参观监狱警示教育心得体会
2016/01/15 职场文书
分析Python感知线程状态的解决方案之Event与信号量
2021/06/16 Python