微信开发之module.exports用法 及module.exports和exports的区别

常见用法:在data.js文件中定义

var dataPost = {
“seller”: {
“name”: “粥品香坊”,
“description”: “蜂鸟专送”,
“deliveryTime”: 38,
“score”: 4.2,
“serviceScore”: 4.1,
},
}

module.exports={
myDataPost: dataPost // 对外暴露的变量名叫myDataPost,对应着内部的dataPost对象
}

在index.js中调用:
let Data = require(‘../../data/data.js’); // 引入公共代码
var dataList = Data.myDataPost.seller; // 开始通过对外暴露变量myDataPost,访问内部dataPost对象

微信开发中,可以将一些公共的代码抽离成为一个单独的 js 文件,作为一个模块。模块只有通过 module.exports 或者 exports 才能对外暴露接口。

需要注意的是:

推荐开发者采用 module.exports 来暴露模块接口。
小程序目前不支持直接引入 node_modules , 开发者需要使用到 node_modules 时候建议拷贝出相关的代码到小程序的目录中。
// common.js
function sayHello(name) {
console.log(`Hello ${name} !`)
}
function sayGoodbye(name) {
console.log(`Goodbye ${name} !`)
}

module.exports.sayHello = sayHello
exports.sayGoodbye = sayGoodbye
​在需要使用这些模块的文件中,使用 require(path) 将公共代码引入

var common = require(‘common.js’)
Page({
helloMINA: function() {
common.sayHello(‘MINA’)
},
goodbyeMINA: function() {
common.sayGoodbye(‘MINA’)
}
})
Tips

tip: require 暂时不支持绝对路径
require 用来加载代码,而 exports 和 module.exports 则用来导出代码。

其他例子:

1、返回一个JSON Object

var app = {
name: ‘app’,
version: ‘1.0.0’,
sayName: function(name){
console.log(this.name);
}
}
module.exports = app;
这种方法可以返回全局共享的变量或者方法。
调用方法:

var app = require(‘./app.js’);
app.sayName(‘hello’);//hello
或者这样用:

var func1 = function() {
console.log(“func1”);
};

var func2 = function() {
console.log(“func2”);
};

exports.function1 = func1;
exports.function2 = func2;
调用方法为:

var functions = require(“./functions”);
functions.function1();
functions.function2();
2、返回一个构造函数

CLASS.js:

var CLASS = function(args){
this.args = args;
}
module.exports = CLASS;
调用:

var CLASS = require(‘./CLASS.js’);
var c = new CLASS(‘arguments’);
3、返回一个实例对象:

//CLASS.js
var CLASS = function(){
this.name = “class”;
}
CLASS.prototype.func = function(){
alert(this.name);
}
module.exports = new CLASS();
调用:

var c = require(‘./CLASS.js’);
c.func();//”class”

exports 和 module.exports 的区别

exports就是module.exports的引用

module.exports 初始值为一个空对象 {}
exports 是指向的 module.exports 的引用
require() 返回的是 module.exports 而不是 exports

https://blog.csdn.net/LVXIANGAN/article/details/79351571

 

在node中我们为了实现模块化,会经常遇到这样的情况:一个文件中需要引用另一个文件中的某些function或者对象等(使用require() ),同时这个文件里面的某些function或者对象又会被其他地方给引用(使用model.exports或者exports)。

通常在一个文件里面有两个可用的用来暴露函数或者对象等的对象:module.exports、exports,一般用前者更好,在文章的最后将说明他们的区别。

这里就涉及到模块化的思想。在我再这里就简单的说一下怎么用。

module.exports

如果想在一个文件中暴露本文件的变量或者函数等可以在文件的最后使用module.exports。module是一个对象,像下面给出的代码一样。

var module = {
id: ‘hello’,
exports: {}
};
例子:

module.exports={key:value} //相当于暴露一个对象出去
module.exports.key = value
module.exports=function name(){} //暴露一个函数或者数组
require()

在一个文件中可以使用require()来引用另一个文件中的中暴露出来的函数或者变量等。

例子:

var hello = require(‘文件所在位置’)
注意此时引用到的是一个对象或者数组或者函数,具体看在另一个文件中使用module.exports暴露的是一个对象还是数组函数函数,如果是对象使用对象的访问方式去访问里面的属性,数组和函数也使用相应的访问方式使用。
module.exports和exports的区别

module的样子在前面已经列出来了。其实exports就是module.exports的引用。但是exports不能暴露函数和数组。也就是不能像下面这样暴露。

exports = function name(){}
可以像下面这样理解:

把exports看成是对module.exports的引用,可以用exports.foo往里面增加新的属性,但是如果直接对exports赋值,exports的指向改变,exports就不再是module.exports的引用了,所以moudule.exports仍然为空对象{}。

前面的例子中就是相当于函数返回一个新的引用,改变了exports的指向。


 

微信小程序中module.exports与exports的用法可以查看下面官方提供的文档,使用起来还是比较简单方便的,但时对于这两者的区别解释的不是很明白。

微信小程序官方文档–框架–逻辑层–模块化.png

为了更好的理解 exports 和module.exports 的关系,我们先来补点 js 基础。示例:

// index.js
Page({
    onLoad: function(){
        var a = {name: '张三'};
        var b = a;
        console.log(a);
        console.log(b);

        b.name = '李四';
        console.log(a);
        console.log(b);

        var b = {name: '王五'};
        console.log(a);
        console.log(b);
    }
})

运行 app.js 结果为:

{ name: '张三' }
{ name: '张三' }
{ name: '李四' }
{ name: '李四' }
{ name: '李四' }
{ name: '王五' }

解释一下:
a 是一个对象,b 是对 a 的引用,即 a 和 b 指向同一个对象,即 a 和 b 指向同一块内存地址,所以前两个输出一样。
当对 b 作修改时,即 a 和 b 指向同一块内存地址的内容发生了改变,所以 a 也会体现出来,所以第三四个输出一样。
当对 b 完全覆盖时,b 就指向了一块新的内存地址(并没有对原先的内存块作修改),a 还是指向原来的内存块,即 a 和 b 不再指向同一块内存,也就是说此时 a 和 b 已毫无关系,所以最后两个输出不一样。

明白了上述例子后,我们进入正题。我们只需知道三点即可知道exports 和module.exports 的区别了:

  • exports 是指向的module.exports 的引用;
  • module.exports 初始值为一个空对象{},所以exports 初始值也是{};
  • require() 返回的是module.exports 而不是exports。
    所以:我们通过
var name = '张三';
exports.name = name;
exports.sayName = function() {
    console.log(name);
}
exports 赋值其实是给module.exports 这个空对象添加了两个属性而已,上面的代码相当于:
var name = '张三';
module.exports.name = name;
module.exports.sayName = function() {
     console.log(name);
}

下面就在微信小程序中module.exports和exports的区别做出示例

// common.js 
function sayHello(name) {
    console.log(`Hello ${name} !`);
}
function sayGoodbye(name) {
    console.log(`Goodbye ${name} !`);
}
// 第一种情况,module.exports初始值为空对象,两个函数使用module.exports或exports都一样效果
module.exports.sayHello = sayHello;
module.exports.sayGoodbye = sayGoodbye; 
exports.sayHello = sayHello;
exports.sayGoodbye = sayGoodbye; 

// 第二种情况,module.exports初始值不为空对象,只能使用module.exports暴露接口,而不能使用exports暴露,会出现is not a function错误。
module.exports = {name:1};// module.exports给一个初始值

//以下两个正常使用
module.exports.sayHello = sayHello;  
module.exports.sayGoodbye = sayGoodbye;

//使用以下两个会报错误sayHello is not a function
exports.sayHello = sayHello;  
exports.sayGoodbye = sayGoodbye;

综上所述,当module.exports 指向新的对象时,exports 断开了与 module.exports 的引用,module.exports 指向了新的内存块,而 exports 还是指向原来的内存块。
因此,在不是很清楚两者关系的时候,请采用module.exports来暴露接口,而尽量不采用exports暴露接口。

作者:吕周坤
链接:https://www.jianshu.com/p/2431adaa97bf
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

亚马逊url参数分析

https://www.amazon.com/VicTsing-Non-Slip-Gaming-Typist-Office/dp/B072C93TQL/ref=sr_1_1?ie=UTF8&qid=1504531098&sr=8-1&keywords=B072C93TQL
https://www.amazon.com/Belkin-WaveRest-Mouse-Wrist-Support/dp/B00000JRRD/ref=pd_sbs_229_1?_encoding=UTF8&psc=1&refRID=VB2M27JXJ57RC3BTQD8E

https://www.amazon.com/OMOTON-Ultra-Slim-Bluetooth-Keyboard-Enabled/dp/B00GD1BGYO/ref=sr_1_1_sspa?ie=UTF8&qid=1531813108&sr=8-1-spons&keywords=keyboard&psc=1&smid=AG8D5TKU5UGTB

VicTsing-Non-Slip-Gaming-Typist-Office 这个叫Slug,是Amazon根据listing的title生成的,对于同一个listing而言,这个是固定的
dp/B072C93TQL 产品ASIN

ref=sr_1_1 搜索来源 后面1表示第1个产品 sr_1_1_sspa 广告参数 Sponsored
ref=pd_sbs_229_1 Customers who viewed this item also viewed【猜你喜欢】 模块点击的产品 1代表第一个产品
ref=sspa_dk_detail_0 Sponsored products related to this item 【广告】模块点击的产品 0 代表第一个产品

ie=UTF8 网页显示的编码
qid=1504531098 时间戳 :
每一个URL有一个时间戳,记录了每一个搜索点击的具体时间,使每个人为的搜索将只算作一次。若没规避这个机制,Super Url的安全性也就低了,无法做到模拟人工搜索。

sr=8-1 第1个产品 8-1-spons 第1个广告产品 Sponsored
keywords=B072C93TQL 搜索关键词参数
_encoding=UTF8 字符编码
psc=1
refRID=VB2M27JXJ57RC3BTQD8E
smid=AG8D5TKU5UGTB 商家merchant id
s=videogames 商品品类描述
refRID 该参数暂时未知

git push origin codeannotation ssh: connect to host bitbucket.org port 22: Connection timed out fatal: Could not read from remote repository.

$ git push origin codeannotation
ssh: connect to host bitbucket.org port 22: Connection timed out
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

 

完美解决办法   windows  linux  找到.ssh目录

我做了下面提到的事情,它开始工作了。

 vim ~/.ssh/config

添加这些行并保存。

Host bitbucket.org
Hostname  altssh.bitbucket.org
Port  443

 

 

crodas/text-rank textrank算法提取关键词、描述信息

README

extract relevant keywords from a given text

How to use it

In order to use the class, you must instance a Config object.

<?php

require __DIR__ . "/vendor/autoload.php";

use \crodas\TextRank\Config;
use \crodas\TextRank\TextRank;

$config   = new Config;
$textrank = new TextRank($config);

$keywords = $textrank->getKeywords($some_long_text);

var_dump($keywords);

It is possible to get better results by adding few information about the language (stopword list, stemmer with pecl install stem).

<?php

require __DIR__ . "/vendor/autoload.php";

use \crodas\TextRank\Config;
use \crodas\TextRank\TextRank;
use \crodas\TextRank\Stopword;

$config = new Config;
$config->addListener(new Stopword);

$textrank = new TextRank($config);
$keywords = $textrank->getKeywords($some_long_text);

var_dump($keywords);

By doing this it will detect the language of the text and will remove common words (from the stopword list). If ext-stem is available the results will be even better.

Summarize large texts

This class is also capable of summarizing long texts

$config = new \crodas\TextRank\Config;
$config->addListener(new \crodas\TextRank\Stopword);
$analizer = new \crodas\TextRank\Summary($config);
$summary = $analizer->getSummary($text);         

$summary is at most 5% of the sentences of the text.

https://packagist.org/packages/crodas/text-rank

https://github.com/crodas/TextRank

安装是重点


composer require crodas/languagedetector

composer.json 文件加 autoload内容 src/lib/ 对相应 textRank 算法目录

需要到github下载 https://github.com/crodas/TextRank


{
"require": {
"crodas/languagedetector": "^0.1.1"
},
"autoload": {
"classmap":["src/lib/"]
}
}

有哪些适配微信小程序的开源UI项目?分享几个微信小程序开发框架

1.基于规范的小程序 UI 组件库,自定义标签组件,简洁、易用、工具化 https://meili.github.io/min/docs/minui/

https://meili.github.io/min/docs/minui/index.html

 

2.高颜值、好用、易扩展的微信小程序 UI 库,Powered by 有赞

https://github.com/youzan/zanui-weapp

 

3.A UI library by WeChat official design team, includes the most useful widgets/modules.

https://github.com/Tencent/weui-wxss

https://weui.io/

4.wux – 微信小程序自定义组件(对话框、指示器、五星评分…)

https://github.com/skyvow/wux

5.微信小程序日历组件

https://github.com/iamaddy/calendar

6.https://github.com/TalkingData/iview-weapp

7.https://github.com/aben1188/awesome-wepy

8.城市组件https://github.com/shmy/we-city-select

9. 微信小程序组件和功能封装,基于微信Component自定义组件开发

https://github.com/ChanceYu/weapp

10.https://www.bidianer.com/bag/443

 

 

【小程序开发框架】

1、官方框架MINA

小程序提供的开发框架为MINA框架,它类似于淘宝Weex、Vue框架。MINA框架通过封装微信客户端提供的文件系统、网络通信、任务管理、数据安全等基础功能,对上层提供一整套JavaScript API,让开发者能够非常方便地使用微信客户端提供的各种基础功能与能力,快速构建一个应用。

地址:

https://developers.weixin.qq.com/miniprogram/dev/framework/MINA.html

2、美团小程序框架mpvue

mpvue 是美团点评开源的一个使用Vue.js开发小程序的前端框架。框架基于 Vue.js 核心,mpvue 修改了 Vue.js 的  runtime 和  compiler 实现,使其可以运行在小程序环境中,从而为小程序开发引入了整套 Vue.js 开发体验。使用  mpvue 开发小程序,你将在小程序技术体系的基础上获取到这样一些能力:

  • 彻底的组件化开发能力:提高代码复用性
  • 完整的 Vue.js 开发体验
  • 方便的 Vuex 数据管理方案:方便构建复杂应用
  • 快捷的 webpack 构建机制:自定义构建策略、开发阶段 hotReload
  • 支持使用 npm 外部依赖
  • 使用 Vue.js 命令行工具 vue-cli 快速初始化项目
  • H5 代码转换编译成小程序目标代码的能力

Github:

https://github.com/Meituan-Dianping/mpvue

官网:

http://mpvue.com/

3、Tina.js 一款轻巧的渐进式微信小程序框架

tina-js.jpg

特性: 轻盈小巧。 极易上手,保留 MINA (微信小程序官方框架) 的大部分 API 设计;无论你有无小程序开发经验,都可以轻松过渡上手。 渐进增强,既有状态管理器,也有路由增强,还可以自己编写插件。

Tina.js 开源框架地址:

https://github.com/tinajs/tina

4、组件化开发框架wepy

WePY 是一款让小程序支持组件化开发的框架,通过预编译的手段让开发者可以选择自己喜欢的开发风格去开发小程序。框架的细节优化,Promise,Async Functions的引入都是为了能让开发小程序项目变得更加简单,高效。

特性:
  • 类Vue开发风格
  • 支持自定义组件开发
  • 支持引入NPM包
  • 支持Promise
  • 支持ES2015+特性,如Async Functions
  • 支持多种编译器,Less/Sass/Styus、Babel/Typescript、Pug
  • 支持多种插件处理,文件压缩,图片压缩,内容替换等
  • 支持 Sourcemap,ESLint等
  • 小程序细节优化,如请求列队,事件优化等

Github地址:

https://github.com/Tencent/wepy

官网地址:

https://tencent.github.io/wepy

5、前端框架weweb

weweb是一个兼容小程序语法的前端框架,你可以用小程序的写法,来写web应用。如果你已经有小程序了,通过它你可以将你的小程序运行在浏览器中。

特性: 跨平台,一套代码多端运行(小程序、h5、未来直接打包成安卓、ios app也不是梦) 自带常用组件,完美继承了小程序内置组件 兼容小程序rpx语法,使页面更容易适配各种机型

地址:

https://github.com/wdfe/weweb

小程序开发工具

1、图片处理工具Jinaconvertjinaconvert.jpg

Jinaconvert可以帮你把图片处理成各种需要的格式,你只需要在 Jinaconvert 上选择你需要的格式类型,再将图片文件上传至即可。

工具网站地址:

https://jinaconvert.com/cn/

2、单位转换工具postcss-px2units

将px单位转换为rpx单位,或者其他单位的PostCSS插件。 postcss-px2units就可以使用简单的配置,轻松实现转换。而且该插件可以将px转换为任意你想转换的单位,比如rem。

地址:

https://github.com/yingye/postcss-px2units

3、腾讯云上传插件qcloud-upload

基于nodejs的腾讯云上传插件 支持自定义文件前缀、覆盖及非覆盖上传方式

地址:

https://github.com/yingye/qcloud-upload

4、二维码工具weapp.qrcode.js

在微信小程序中,快速生成二维码 可自定义二维码内容、宽高、纠错级别。此外,还支持生成不同前后景色的二维码。

地址:

https://github.com/yingye/weapp-qrcode

微信小程序脚手架工具 wxdad

一款微信小程序脚手架工具,帮助你快速开发微信小程序应用。目前有两个功能: 快速构建初始项目架构。 把 wxdad 语法快速编译成 wxml 和 wxjs 文件,帮助开发者急速开发。

地址:

https://gitee.com/lisniuse/wxdad

5、小程序图标工具wx-charts

基于 canvas 绘制、体积小巧的微信小程序图表工具。

  • 支持图表类型:
  • 饼图 pie
  • 圆环图 ring
  • 线图 line
  • 柱状图 column
  • 区域图 area
  • 雷达图 radar

地址:

https://github.com/xiaolin3303/wx-charts

6、小程序开发、微信公号管理系统RhaPHP

RhaPHP微信平台管理系统,支持多公众号管理,小程序开发,APP接口开发,平台反文旁虫立且快速简洁易用。灵活的扩展应用机制,具有容易上手,几乎融合微信接口,简单的调用对二次开发与开发扩展应用模块大大提高开发效率,降低企业商家运营成本。扩展应用模块化,机制灵活,代码简单并快速上手。基于THINKPHP5强力内核驱动与LAYUI前端框架,支持 Linux/Windows/Mac。

官方网站:

https://www.rhaphp.com/

7、即速应用:适合技术小白的小程序开发工具

可视化操作,直接拖拽组件生成页面 提供大量可套用的模板 可将代码打包下载,直接对接到小程序的开发工具 下载下来后的代码可以任意编辑 复杂的功能仍然需要专业程序员二次开发

官网:

http://www.jisuapp.cn/

附:微信小程序开发者文档官网地址

https://mp.weixin.qq.com/debug/wxadoc/dev/index.html

 

 

Gearman-任务分发系统

简介

Gearman是一个分发任务的程序框架,可以用在各种场合,与Hadoop相比,Gearman更偏向于任务分发功能。

Gearman提供了一个通用的应用程序,可以工作在更加适合处理这项任务的其他计算机或其他处理器上。它允许并行处理,载入平衡处理,而且可以在不同语言间进行调用。它可以应用于各种各样的应用场合。

Gearman最初用于LiveJournal的图片resize功能,由于图片resize需要消耗大量计算资 源,因此需要调度到后端多台服务器执行,完成任务之后返回前端再呈现到界面。

优点

以下是关于Gearman的一些优点:

  • 开源:完全开源,免费的。
  • 多语言:有许多语言接口,而且支持的语言数量一直在增加。
  • 灵活:不依赖于任何特定的设计。
  • 快速:简单的协议和接口,可以减少现有应用程序的开销。
  • 嵌入:轻量,可以以最小的代价引入到现有程序。
  • 没有单点故障:具有较强的容错性。

工作原理

Gearman Client:负责发起任务请求,创建Job
Gearman Job Server:负责任务调度,负责把来自Client的Job分发到不同服务器或不同处理器上的Worker。
Gearman Worker:负责Job处理,并通过Job Server返回结果给Client。

Worker工作流程

  1. Worker通过CAN_DO消息,注册到Job server上。
  2. 随后发起GRAB_JOB,主动要求分派任务。
  3. Job server如果没有job可分配,就返回NO_JOB。
  4. Worker收到NO_JOB后,进入空闲状态,并给Job server返回PRE_SLEEP消息,告诉Job server:”如果有工作来的话,用NOOP请求我先。”
  5. Job server收到worker的PRE_SLEEP消息后,明白了发送这条消息的worker已经进入了空闲态。
  6. 这时如果有job提交上来,Job server会给worker先发一个NOOP消息。
  7. Worker收到NOOP消息后,发送GRAB_JOB向Job server请求任务。
  8.  Job server把工作派发给worker。
  9. Worker干活,完事后返回WORK_COMPLETE给Job server。

处理时序图

同步

异步

集群

如果Job Server挂了该怎么办,Gearman会如何处理?我们可以同时运行多个Job Server。Clients和Workers通过配置好的Job Server,如果这个Job Server发生故障挂了,会自动故障切换到另一个可用的Job Server。Job Server建议两台以上,通过冗余来提高系统的容错性。
You probably don’t want to run too many job servers, but having two or three is a good idea for redundancy.(官网原文)
  • 高可用
启动两个job server,他们是独立的服务进程,有各自的内存队列。当一个job server进程出现故障,另一个job server可以正常调度。(worker api与client api可以完成job server故障的切换)。在任何时候我们可以关闭某个worker,即使那个worker正在处理工作任务(Gearman不会让正在被执行的job丢失的,由于worker在工作时与Job server是长连接,所以一旦worker发生异常,Job server能够迅速感知并重新派发这个异常worker刚才正在执行的工作)

  • 负载均衡

job server并不主动分派工作任务,而是由worker从空闲状态唤醒之后到job server主动抓取工作任务。

  • 可扩展

松耦合的接口和无状态的job,只需要启动一个worker,注册到Job server集群即可。新加入的worker不会对现有系统有任何的影响。

  • 分布式

gearman是分布式的任务分发框架,worker与job server,client与job server通信基于tcp的socket连接。
gearman内置内存队列,默认情况队列最大容量为300W,可以配置最大支持2^32-1,即4 294 967 295。

  • 高性能

作为Gearman的核心,Job server的是用C/C++实现的,由于只是做简单的任务派发,因此系统的瓶颈不会出在Job server上。

使用场景

  • 长时间运行的处理:图片处理,订单处理,批量邮件/通知 …
  • 要求高CPU或内存的处理:大容量的数据处理,MapReduce运算,日志聚集,视频编码
  • 分布式和并行的处理
  • 定时处理:增量更新,数据复制
  • 限制速率的FIFO处理

实例-python

Client-单任务

在没有worker启动的情况下,client并不会结束,会阻塞直到worker处理完job。

Client-多任务

同步非阻塞方式发送多个job的例子,在取得server返回结果之前,用了wait_until_jobs_completed函数来等待task中的所有job返回结果。

Worker

对worker而言,则会一直阻塞直到有新的job到来。

GearmanAdminClient

Job Server相关的API,用于监控和设置。
  • send_maxqueue(task, max_size): Sends a request to change the maximum queue size for a given task
  • end_shutdown(graceful=True): Sends a request to shutdown the connected gearman server
  • get_status():Retrieves a list of all registered tasks and reports how many items/workers are in the queue
  • get_version(): Retrieves the version number of the Gearman server
  • get_workers():Retrieves a list of workers and reports what tasks they’re operating on
  • ping_server(): Sends off a debugging string to execute an application ping on the Gearman server, return the response time

 

https://blog.csdn.net/zl18310999566/article/details/69615777?locationNum=10&fps=1

bash: netstat: command not found

apt-get install net-tools, 对于所有的linux系统都适用。

redhat系列的 Redhat、Centos、Fedora等 可以使用yum安装。

顺便说一句,wget只是个下载工具,相当于迅雷,不负责安装。

apt-get 和 yum才是包管理工具,不要傻傻分不清楚