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 相关文章推荐
JavaScript 拖拉缩放效果
Dec 10 Javascript
web网页按比例显示图片实现原理及js代码
Aug 09 Javascript
js 阻止子元素响应父元素的onmouseout事件具体实现
Dec 23 Javascript
JQuery性能优化的几点建议
May 14 Javascript
Json实现异步请求提交评论无需跳转其他页面
Oct 11 Javascript
鼠标悬浮显示二级菜单效果的jquery实现
Oct 29 Javascript
JavaScript使ifram跨域相互访问及与PHP通信的实例
Mar 03 Javascript
jquery实现垂直和水平菜单导航栏
Aug 27 Javascript
Bootstrap模态框使用详解
Feb 15 Javascript
用 js 的 selection range 操作选择区域内容和图片
Apr 18 Javascript
jquery+ajaxform+springboot控件实现数据更新功能
Jan 22 jQuery
微信小程序在text文本实现多种字体样式
Nov 08 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
抓取YAHOO股票报价的类
2009/05/15 PHP
php面向对象 字段的声明与使用
2012/06/14 PHP
深入密码加salt原理的分析
2013/06/06 PHP
php检测apache mod_rewrite模块是否安装的方法
2015/03/14 PHP
浅谈PHP接收POST数据方式
2015/06/05 PHP
zend framework重定向方法小结
2016/05/28 PHP
IE8 引入跨站数据获取功能说明
2008/07/22 Javascript
ExtJs Excel导出并下载IIS服务器端遇到的问题
2011/09/16 Javascript
js检验密码强度(低中高)附图
2014/06/05 Javascript
JavaScript判断变量是否为数组的方法(Array)
2016/02/24 Javascript
Node.js DES加密的简单实现
2016/07/07 Javascript
浅谈js控制li标签排序问题 js调用php函数的方法
2016/10/16 Javascript
移动端滑动插件Swipe教程
2016/10/16 Javascript
jQuery得到多个值只能用取Class ,不能用取ID的方法
2016/12/04 Javascript
jQueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug及解决方案
2016/12/19 Javascript
jQuery插件之validation插件
2017/03/29 jQuery
vue-router之nuxt动态路由设置的两种方法小结
2018/09/26 Javascript
react 移动端实现列表左滑删除的示例代码
2019/07/04 Javascript
详解vue页面首次加载缓慢原因及解决方案
2019/11/06 Javascript
vue项目使用高德地图的定位及关键字搜索功能的实例代码(踩坑经验)
2020/03/07 Javascript
Python性能提升之延迟初始化
2016/12/04 Python
Python实现的桶排序算法示例
2017/11/29 Python
python实现字符串加密 生成唯一固定长度字符串
2019/03/22 Python
python opencv 图像拼接的实现方法
2019/06/27 Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
2020/03/02 Python
pycharm部署、配置anaconda环境的教程
2020/03/24 Python
Python脚本打包成可执行文件过程解析
2020/10/20 Python
人力资源管理毕业生自荐信
2013/11/21 职场文书
初一体育教学反思
2014/01/29 职场文书
活动策划邀请函
2014/02/06 职场文书
主题党日活动总结
2014/07/08 职场文书
个人四风问题整改措施思想汇报
2014/10/04 职场文书
2015年银行信贷员工作总结
2015/05/19 职场文书
Pytorch 中net.train 和 net.eval的使用说明
2021/05/22 Python
JavaScript利用html5新方法操作元素类名详解
2021/11/27 Javascript
使用Redis实现点赞取消点赞的详细代码
2022/03/20 Redis