lodash
lodash
是一个js
的工具库,其封装了一系列常用的方法,如常用的防抖节流以及深拷贝等,我在PC端用惯了lodash
,想着小程序也引用下这个库,引用过程中发现了如下问题,于是就有了这一篇记录。
小程序中使用 lodash
- 小程序单独引入
lodash
会报错, 报错信息指向Array
等的prototype
找不到,报错导致整个页面都渲染不出来 - 通过百度,网上很多说重新给
root.Array
指定下对象即可,我试了下,加上如下代码:
root.Array = Array;
// root.Buffer = Buffer
root.DataView = DataView;
root.Date = Date;
root.Error = Error;
root.Float32Array = Float32Array;
root.Float64Array = Float64Array;
root.Function = Function;
root.Int8Array = Int8Arrayp;
root.Int16Array = Int16Arrayip;
root.Int32Array = Int32Arrayip;
root.Map = Maptry;
root.Object = Object;
root.Promise = Promise;
root.RegExp = RegExp;
root.Set = Set;
root.String = String;
root.Symbol = Symbol;
root.TypeError = TypeError;
root.Uint8Array = Uint8Array;
root.Uint8ClampedArray = Uint8ClampedArray;
root.Uint16Array = Uint16Array;
root.Uint32Array = Uint32Array;
root.WeakMap = WeakMap;
root._ = _;
root.clearTimeout = clearTimeout;
root.isFinite = isFinite;
root.parseInt = parseInt;
root.setTimeout = setTimeout;
- 经过上面重新定义
root
对象之后,发现还是报错,于是我打开源码,看到源码中下面这一段
/** Detect free variable `global` from Node.js. */
var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;

/** Detect free variable `self`. */
var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
/** Used as a reference to the global object. */
var root = freeGlobal || freeSelf || Function('return this')();
才发现,root
对象依赖于node.js
的宿主对象global
或者self
对象,我在小程序中试着打印这两个对象,发现self
是undefined
,global
对象虽然有值,但是global.Object
没有定义(如下图)
所以,正常情况下只要对global
对象做下重定义就能正常使用lodash
的功能了,需要注意的是:重定义的代码必须在lodash
引用之前就引入,如下代码
global.Object = Object;
global.Array = Array;
// global.Buffer = Buffer
global.DataView = DataView;
global.Date = Date;
global.Error = Error;
global.Float32Array = Float32Array;
global.Float64Array = Float64Array;
global.Function = Function;
global.Int8Array = Int8Array;
global.Int16Array = Int16Array;
global.Int32Array = Int32Array;
global.Map = Map;
global.Math = Math;
global.Promise = Promise;
global.RegExp = RegExp;
global.Set = Set;
global.String = String;
global.Symbol = Symbol;
global.TypeError = TypeError;
global.Uint8Array = Uint8Array;
global.Uint8ClampedArray = Uint8ClampedArray;
global.Uint16Array = Uint16Array;
global.Uint32Array = Uint32Array;
global.WeakMap = WeakMap;
global.clearTimeout = clearTimeout;
global.isFinite = isFinite;
global.parseInt = parseInt;
global.setTimeout = setTimeout;
- 以上,只要在页面文件中引入
lodash
之前先引用上面重新给global
赋值的文件,就能正常使用lodash
的功能啦,如下:
import "../utils/fix";
import _ from "../miniprogram_npm/lodash/index";
Page({
// 点击提交按钮
submit: _.debounce(
async function () {
// 一系列表单操作
},
1000,
{ leading: true, trailing: false }
),
});