微信小程序使用第三方库Underscore.js步骤详解


Posted in Javascript onSeptember 27, 2016

前言

Underscore.js是一个很精干的库,压缩后只有4KB。Underscore 提供了100多个函数,包括常用的:map、filter、invoke — 当然还有更多专业的辅助函数,如:函数绑定、JavaScript 模板功能、创建快速索引、强类型相等测试等等。弥补了标准库的不足,大大方便了JavaScript的编程。

微信小程序无法直接使用require( 'underscore.js' )进行调用。

微信小程序模块化机制

微信小程序运行环境支持CommoJS模块化,通过module.exports暴露对象,通过require来获取对象。

微信小程序Quick Start utils/util.js

function formatTime(date) {
 var year = date.getFullYear()
 var month = date.getMonth() + 1
 var day = date.getDate()

 var hour = date.getHours()
 var minute = date.getMinutes()
 var second = date.getSeconds();


 return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
}

function formatNumber(n) {
 n = n.toString()
 return n[1] ? n : '0' + n
}

module.exports = {
 formatTime: formatTime
}

pages/log/log.js

var util = require('../../utils/util.js')
Page({
 data: {
 logs: []
 },
 onLoad: function () {
 this.setData({
 logs: (wx.getStorageSync('logs') || []).map(function (log) {
 return util.formatTime(new Date(log))
 })
 })
 }
})

原因分析

Underscore CommonJs模块导出代码如下:

// Export the Underscore object for **Node.js**, with
// backwards-compatibility for the old `require()` API. If we're in
// the browser, add `_` as a global object.
if (typeof exports !== 'undefined') {
 if (typeof module !== 'undefined' && module.exports) {
 exports = module.exports = _;
 }
 exports._ = _;
} else {
 root._ = _;
}

exports、module必须都有定义,才能导出。通过测试,微信小程序运行环境exports、module并没有定义

//index.js

//获取应用实例
var app = getApp();

Page({ 

 onLoad: function () {
 console.log('onLoad');
 var that = this;

 console.log('typeof exports: ' + typeof exports); 
 console.log('typeof module: ' + typeof exports); 

 var MyClass = function() {

 }

 module.exports = MyClass;

 console.log('typeof module.exports: ' + typeof module.exports); 
 }
})

微信小程序使用第三方库Underscore.js步骤详解

解决方法

修改Underscore代码,注释原有模块导出语句,使用module.exports = _ 强制导出

/*
 // Export the Underscore object for **Node.js**, with
 // backwards-compatibility for the old `require()` API. If we're in
 // the browser, add `_` as a global object.
 if (typeof exports !== 'undefined') {
 if (typeof module !== 'undefined' && module.exports) {
 exports = module.exports = _;
 }
 exports._ = _;
 } else {
 root._ = _;
 }
 */

 module.exports = _;
/*
 // AMD registration happens at the end for compatibility with AMD loaders
 // that may not enforce next-turn semantics on modules. Even though general
 // practice for AMD registration is to be anonymous, underscore registers
 // as a named module because, like jQuery, it is a base library that is
 // popular enough to be bundled in a third party lib, but not be part of
 // an AMD load request. Those cases could generate an error when an
 // anonymous define() is called outside of a loader request.
 if (typeof define === 'function' && define.amd) {
 define('underscore', [], function() {
 return _;
 });
 }
 */

使用Underscore.js

//index.js

var _ = require( '../../libs/underscore/underscore.modified.js' );

//获取应用实例
var app = getApp();


Page( {

 onLoad: function() {
 //console.log('onLoad');
 var that = this;

 var lines = [];

 lines.push( "_.map([1, 2, 3], function(num){ return num * 3; });" );
 lines.push( _.map( [ 1, 2, 3 ], function( num ) { return num * 3; }) );

 lines.push( "var sum = _.reduce([1, 2, 3], function(memo, num){ return memo + num; }, 0);" );
 lines.push( _.reduce( [ 1, 2, 3 ], function( memo, num ) { return memo + num; }, 0 ) );

 lines.push( "var even = _.find([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });" );
 lines.push( _.find( [ 1, 2, 3, 4, 5, 6 ], function( num ) { return num % 2 == 0; }) );

 lines.push( "_.sortBy([1, 2, 3, 4, 5, 6], function(num){ return Math.sin(num); });" );
 lines.push( _.sortBy( [ 1, 2, 3, 4, 5, 6 ], function( num ) { return Math.sin( num ); }) );

 lines.push( "_.indexOf([1, 2, 3], 2);" );
 lines.push( _.indexOf([1, 2, 3], 2) );

 this.setData( {
  text: lines.join( '\n' )
 })
 }
})

微信小程序使用第三方库Underscore.js步骤详解

总结

以上就是微信小程序使用第三方库Underscore.js的全部内容,希望对大家的学习或者工作带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
推荐一些非常不错的javascript学习资源站点
Aug 29 Javascript
Div自动滚动到末尾的代码
Oct 26 Javascript
用jQuery扩展自写的 UI导航
Jan 13 Javascript
javascript一些实用技巧小结
Mar 18 Javascript
js简单实现点击左右运动的方法
Apr 10 Javascript
jquery实现网页的页面平滑滚动效果代码
Nov 02 Javascript
JavaScript字符串删除重复字符的方法
Dec 25 Javascript
JavaScript数据结构与算法之链表
Jan 29 Javascript
老生常谈js中0到底是 true 还是 false
Mar 08 Javascript
利用canvas中toDataURL()将图片转为dataURL(base64)的方法详解
Nov 20 Javascript
利用js给datalist或select动态添加option选项的方法
Jan 25 Javascript
vue3.0 自适应不同分辨率电脑的操作
Feb 06 Vue.js
微信小程序使用第三方库Immutable.js实例详解
Sep 27 #Javascript
微信小程序 在Chrome浏览器上运行以及WebStorm的使用
Sep 27 #Javascript
微信小程序 开发指南详解
Sep 27 #Javascript
纯JavaScript 实现flappy bird小游戏实例代码
Sep 27 #Javascript
jQuery实现表格文本框淡入更改值后淡出效果
Sep 27 #Javascript
angular基于路由控制ui-router实现系统权限控制
Sep 27 #Javascript
IOS中safari下的select下拉菜单文字过长不换行的解决方法
Sep 26 #Javascript
You might like
apache rewrite_module模块使用教程
2008/01/10 PHP
PHP游戏编程25个脚本代码
2011/02/08 PHP
php根据年月获取季度的方法
2014/03/31 PHP
PHP程序员不应该忽略的3点
2015/10/09 PHP
PHP在线书签系统分享
2016/01/04 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
2016/05/17 PHP
示例详解Laravel重置密码代码重构
2016/08/10 PHP
PHPCMS忘记后台密码的解决办法
2016/10/30 PHP
Zend Framework入门教程之Zend_Config组件用法详解
2016/12/09 PHP
js异步加载的三种解决方案
2013/03/04 Javascript
setTimeout()与setInterval()方法区别介绍
2013/12/24 Javascript
AngularJS基础 ng-keypress 指令简单示例
2016/08/02 Javascript
详解springmvc 接收json对象的两种方式
2016/12/06 Javascript
微信小程序 数据封装,参数传值等经验分享
2017/01/09 Javascript
vue.js实现只弹一次弹框
2018/01/29 Javascript
vue.js层叠轮播效果的实例代码
2018/11/08 Javascript
vuejs中父子组件之间通信方法实例详解
2020/01/17 Javascript
Vue中fragment.js使用方法小结
2020/02/17 Javascript
[01:02:03]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS VG
2014/05/26 DOTA
Python中zip()函数用法实例教程
2014/07/31 Python
Python3基础之函数用法
2014/08/13 Python
使用Python编写Linux系统守护进程实例
2015/02/03 Python
不可错过的十本Python好书
2017/07/06 Python
python实现百度语音识别api
2018/04/10 Python
Flask框架工厂函数用法实例分析
2019/05/25 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
2019/10/25 Python
Python网络编程之使用TCP方式传输文件操作示例
2019/11/01 Python
什么是Python包的循环导入
2020/09/08 Python
美国男装连锁零售商:Men’s Wearhouse
2016/10/14 全球购物
英国最大的化装舞会服装网站:Fancydress.com
2017/08/15 全球购物
Berghaus官网:户外服装和设备,防水服
2020/01/17 全球购物
GWT都有什么特性
2016/12/02 面试题
实习鉴定范文
2013/12/19 职场文书
本科毕业生求职自荐信
2014/02/03 职场文书
个人承诺书格式
2014/06/03 职场文书
python开发制作好看的时钟效果
2022/05/02 Python