在小程序中集成redux/immutable/thunk第三方库的方法


Posted in Javascript onAugust 12, 2018

一、前言

小程序给我们暴露了两个参数 require 和 module , require 用来在模块中加载其他模块, module 用来将模块中的方法暴露出去

module.exports = function(){}

所以只要需要让第三方库的代码使用这种形式的 export 就可以了

二、构建Redux的微信小程序包

打一个 Redux 包,让它可以兼容微信小城的加载方式

git clone https://github.com/reactjs/redux.git

npm install

# 详细内容可以到redux项目的package.json中查看
# 这些命令是是使用webpack构建UMD模式的包。也就是说所有的代码,包括依赖的库都会被打包到一个文件中,并且自带一段模块加载代码,文件可以在dist目录下找到
npm run build:umd && npm run build:umd

用编辑器打开 dist 目录下的 redux.js 文件

(function webpackUniversalModuleDefinition(root, factory) {
  if(typeof exports === 'object' && typeof module === 'object')
    module.exports = factory();
  else if(typeof define === 'function' && define.amd)
    define([], factory);
  else if(typeof exports === 'object')
    exports["Redux"] = factory();
  else
    root["Redux"] = factory();
})(this, function() {
... 
})

这段代码是用来加载模块的,里面的factory函数的返回的内容是用webpack提供的loader组织起来的redux的代码和第三方依赖。

  • 如果我们把这个文件拷贝到小程序中,只需要让程序能正常进入第三行代码,就能把Redux加载进来
  • 将第二行代码: if(typeof exports === 'object' && typeof module === 'object') 修改成: if(typeof module === 'object')
  • 这样修改的原因是,在微信小程序的环境中是没有exports变量的,所以就没办法正确进入这个分支,删除之后就可以正确进入
  • 我们拷贝到 libs 目录下,那么我们在程序中使用时,只要当做是一个本地模块去 require 就可以了 var redux = require('./libs/redux.js')
  • 我们可以通过类似的方法,使用 Webpack 打包第三方库,就可以集成任何库了

三、集成Redux-devtools

因为微信小程序的开发环境是定制的,暂时没有发现办法直接安装 redux-devtool 的插件

安装remote-redux-devtools

原版的 remote-redux-devtools 使用的一个 websocket 的依赖会使用原生的 WebSocket ,小程序是不支持的,所以需要改成小程序的 websocket 实现,修改好的代码 https://github.com/poetries/wx-redux-immutable-template/blob/master/wx-redux-immutable-template/public/libs/remote-redux-devtools.js

把代码下载到工程目录里面就可以用了

安装和启动remotedev-server

npm install -g remotedev-server
remotedev --hostname=localhost --port=5678

因为没办法用 npm 安装到本地(微信小程序会尝试去加载项目目录中的所有js),所以这里使用全局安装,第二条命令是启动 remotedev-server , hostname 和 port 分别指定为 localhost 和 5678

集成devtool

在 store 下集成 devtool

const {createStore, compose} = require('./libs/redux.js');
const devTools = require('./libs/remote-redux-devtools.js').default;
const reducer = require('./reducers/index.js')

function configureStore() {
 return createStore(reducer, compose(devTools({
  hostname: 'localhost',
  port: 5678,
  secure: false
 })));
}

module.exports = configureStore;

把 devtool 使用 redux 的 compose 加到 store 中去。 hostname 和 port 是指定为之前启动 remotedev-server 启动时候指定的参数。保存之后重启一下小程序,如果没有报错的话就OK了

可以在浏览器中访问 localhost:5678

四、小程序中集成immutable

Immutable 是 Facebook 开发的不可变数据集合。不可变数据一旦创建就不能被修改,是的应用开发更简单,允许使用函数式编程技术,比如惰性评估。微信小程序无法直接使用 Immutable.js ,下面就来说说微信小程序如何使用第三方库 Immutable.js

Immutable使用了UMD模块化规范

(function (global, factory) {
 typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
 typeof define === 'function' && define.amd ? define(factory) :
 (global.Immutable = factory());
}(this, function () { 'use strict';var SLICE$0 = Array.prototype.slice;

....

}));

修改 Immutable 代码,注释原有模块导出语句,使用 module.exports = factory() 强制导出

(function(global, factory) {
 /*
 typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
 typeof define === 'function' && define.amd ? define(factory) :
 (global.Immutable = factory());
 */

 module.exports = factory();

}(this, function() {

导入修改好的 immutable 到小程序中即可 https://github.com/poetries/wx-redux-immutable-template/blob/master/wx-redux-immutable-template/public/libs/immutable.js

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Z-Blog中用到的js代码
Mar 15 Javascript
JS获取页面input控件中所有text控件并追加样式属性
Feb 25 Javascript
jquery实现智能感知连接外网搜索
May 21 Javascript
JS获得URL超链接的参数值实例代码
Jun 21 Javascript
js 基础篇必看(点击事件轮播图的简单实现)
Aug 20 Javascript
node.js操作mongodb简单示例分享
May 25 Javascript
vue项目中添加单元测试的方法
Jul 21 Javascript
JavaScript ES6常用基础知识总结
Feb 09 Javascript
bootstrap+spring boot实现面包屑导航功能(前端代码)
Oct 09 Javascript
基于Element的组件改造的树形选择器(树形下拉框)
Feb 27 Javascript
Vue微信公众号网页分享的示例代码
May 28 Javascript
一篇文章带你搞懂Vue虚拟Dom与diff算法
Aug 25 Javascript
Vue实现左右菜单联动实现代码
Aug 12 #Javascript
Vue中的v-for循环key属性注意事项小结
Aug 12 #Javascript
vue实现商品加减计算总价的实例代码
Aug 12 #Javascript
Vue.js中使用iView日期选择器并设置开始时间结束时间校验功能
Aug 12 #Javascript
深入理解Vue父子组件生命周期执行顺序及钩子函数
Aug 12 #Javascript
VUE在for循环里面根据内容值动态的加入class值的方法
Aug 12 #Javascript
JS中的两种数据类型及实现引用类型的深拷贝的方法
Aug 12 #Javascript
You might like
PHP网页游戏学习之Xnova(ogame)源码解读(十二)
2014/06/25 PHP
Yii2实现增删改查后留在当前页的方法详解
2017/01/13 PHP
PHP封装的page分页类定义与用法完整示例
2018/12/24 PHP
Yii 使用intervention/image拓展实现图像处理功能
2019/06/22 PHP
Aster vs Newbee BO5 第二场2.19
2021/03/10 DOTA
[对联广告] JS脚本类
2006/08/27 Javascript
javaScript对象和属性的创建方法
2007/01/15 Javascript
JQuery中getJSON的使用方法
2010/12/13 Javascript
Jquery 动态循环输出表格具体方法
2013/11/23 Javascript
JS小游戏之极速快跑源码详解
2014/09/25 Javascript
JS实现从顶部下拉显示的带动画QQ客服特效代码
2015/10/24 Javascript
一不小心就做错的JS闭包面试题
2015/11/25 Javascript
jQuery Validation PlugIn的使用方法详解
2015/12/18 Javascript
js简单实现调整网页字体大小的方法
2016/07/23 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的方法
2016/11/29 Javascript
JSONP跨域请求
2017/03/02 Javascript
vue复合组件实现注册表单功能
2017/11/06 Javascript
JS中offset和匀速动画详解
2018/02/06 Javascript
微信小程序实现带缩略图轮播效果
2018/11/04 Javascript
vue刷新页面时去闪烁提升用户体验效果的实现方法
2018/12/10 Javascript
Vuex的API文档说明详解
2020/02/05 Javascript
自己使用总结Python程序代码片段
2015/06/02 Python
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
2018/01/07 Python
python实现一行输入多个值和一行输出多个值的例子
2019/07/16 Python
python 使用while写猜年龄小游戏过程解析
2019/10/07 Python
python 实现将小图片放到另一个较大的白色或黑色背景图片中
2019/12/12 Python
win10下opencv-python特定版本手动安装与pip自动安装教程
2020/03/05 Python
利用css3制作3D样式按钮实现代码
2013/03/18 HTML / CSS
详解css3中 text-fill-color属性
2019/07/08 HTML / CSS
巴西宠物店在线:Geração Pet
2017/05/31 全球购物
Veronica Beard官网:在酷、经典和别致之间找到了平衡
2018/01/11 全球购物
财务工作者先进事迹材料
2014/01/17 职场文书
俞敏洪一分钟演讲稿
2014/08/26 职场文书
2014乡镇干部对照检查材料思想汇报
2014/09/26 职场文书
2014年反腐倡廉工作总结
2014/12/05 职场文书
【海涛dota解说】DCG联赛第一周 LGD VS DH
2022/04/01 DOTA