微信开发之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
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

linux查看占用端口程序 结束掉进程

前言

在OS X中使用GAE引擎来科学上网比如goagent或者wallproxy,可能会在启动过程中出现如下报错然后导致服务启动不成功。

原因

其实就是因为你曾启动过相同或者类似的服务占用了这个端口,一般来讲,在Mac上直接用Python启动的话,会导致退出不完整,你不能通过点击GUI的“退出”按钮来一步到位,后台的Python进程还是存在的,而它就是一直占用端口不释放的元凶。

解决办法

一个是改掉默认的80878086端口,另一个,就是干掉占用端口的程序。

前者立竿见影,但缺点是你总不能一天换一个的吧,如果说是因为其他应用占用端口还好说,那要是因为退出不完整呢?所以,后者才是治标治本的解决办法。但是想要找到这个占用端口的程序,就要引入下面的内容了:

lsof命令

简介

lsof(list open files)命令是一个列出当前系统打开文件的工具。在类UNIX环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以我们使用它来找出占用了端口的程序,看看它究竟是不是冲突是不是错误。

lsof -i 用以显示符合条件的进程情况

所以,我们使用如下命令即可查找出占用了某个端口的程序和其对应的PID

然后使用下面的命令干掉对应的进程: