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 相关文章推荐
跨浏览器的设置innerHTML方法
Sep 18 Javascript
js 获取和设置css3 属性值的实现方法
May 06 Javascript
JavaScript创建对象的写法
Aug 29 Javascript
如何减少浏览器的reflow和repaint
Feb 26 Javascript
使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码
Apr 07 Javascript
简单谈谈javascript中的变量、作用域和内存问题
Aug 30 Javascript
js jquery获取当前元素的兄弟级 上一个 下一个元素
Sep 01 Javascript
Vue中封装input组件的实例详解
Oct 17 Javascript
AngularJS实现的省市二级联动功能示例【可对选项实现增删】
Oct 26 Javascript
微信小程序配置服务器提示验证token失败的解决方法
Apr 03 Javascript
详解JavaScript的内存空间、赋值和深浅拷贝
Apr 17 Javascript
浅谈vue的第一个commit分析
Jun 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
mysql 全文搜索 技巧
2007/04/27 PHP
php 设计模式之 单例模式
2008/12/19 PHP
如何使用PHP获取指定日期所在月的开始日期与结束日期
2013/08/01 PHP
Thinkphp将二维数组变为标签适用的一维数组方法总结
2014/10/30 PHP
基于命令行执行带参数的php脚本并取得参数的方法
2016/01/25 PHP
php中的常用魔术方法汇总
2016/02/14 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
JavaScript 继承详解(四)
2009/07/13 Javascript
JavaScript 数组循环引起的思考
2010/01/01 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
2014/05/04 Javascript
JQuery+EasyUI轻松实现步骤条效果
2016/02/22 Javascript
Google Maps基础及实例解析
2016/08/06 Javascript
微信小程序 PHP后端form表单提交实例详解
2017/01/12 Javascript
js和jquery中获取非行间样式
2017/05/05 jQuery
layui前段框架日期控件使用方法详解
2017/05/19 Javascript
详谈表单格式化插件jquery.serializeJSON
2017/06/23 jQuery
JavaScript变量提升和严格模式实例分析
2019/01/27 Javascript
用VueJS写一个Chrome浏览器插件的实现方法
2019/02/27 Javascript
超简单的微信小程序轮播图
2019/11/22 Javascript
vue远程加载sfc组件思路详解
2019/12/25 Javascript
快速了解Vue父子组件传值以及父调子方法、子调父方法
2020/07/15 Javascript
如何利用JavaScript编写一个格斗小游戏
2021/01/06 Javascript
[00:55]2015国际邀请赛中国区预选赛5月23日——28日约战上海
2015/05/25 DOTA
快速入门python学习笔记
2017/12/06 Python
Python SQL查询并生成json文件操作示例
2018/08/17 Python
pandas计算最大连续间隔的方法
2019/07/04 Python
wxpython绘制音频效果
2019/11/18 Python
Python 将json序列化后的字符串转换成字典(推荐)
2020/01/06 Python
eBay法国购物网站:eBay.fr
2017/10/21 全球购物
怎样写演讲稿
2014/01/04 职场文书
计算机专业毕业生求职信
2014/04/30 职场文书
党的群众路线教育实践活动学习笔记范文
2014/11/06 职场文书
新闻稿标题
2015/07/18 职场文书
授权协议书范本(3篇)
2019/10/15 职场文书
开发一个封装iframe的vue组件
2021/03/29 Vue.js
java.util.NoSuchElementException原因及两种解决方法
2022/06/28 Java/Android