module.exports

前文讲到在Angular Material的第二个编译文件docs/gulpfile.js中却看到了一个奇怪的东西module.exports 那么module.exports是什么东西呢?

一直以来,javascript最大的诟病就是全局变量,这也成为大型应用开发的最大阻碍。因此,很多人使用了很多方式来解决这个问题。如模块模式(Module Pattern), 而node.js这实现了模块装载系统,来解决组件实现的基本问题。

自从开始研究前端,我也几个相关的关键词在眼前晃荡, require() exports等等。当时,因为注意力在其他方面,一直也没下决心研究清楚。 就如下面文章中所讲:

作为开发人员常常面临这样的困境:当我们使用不熟悉的代码(库)时,我们究竟要花多少时间来研究它的原理和实现,这个研究又要有多深呢?经典答案就是,学习到足够可以开始写代码就可以了,等到时间容许在进一步深入研究。

那么现在就是深入研究 module.exports的时候了!

Node.js如何定义和使用模块

传统js文件

这里是一个简单的js文件,greeting.js,它的功能一看就明白:

//greetings.js
sayHelloInEnglish = function() {
return "Hello";
}; sayHelloInSpanish = function() {
return "Hola";
};
这里有两函数也就是两个功能。

用模块封装简单js文件

i> 想象该文件第一行有以下代码(是的,想象)

// var exports = module.exports ={};

ii> 把任何要重用(导出)的函数,赋值给exports

exports.sayHelloInEnglish = function() {
return "Hello";
};
exports.sayHelloInSpanish = function() {
return "Hola";
};

iii> 以上的结果相当于做了以下的事情

module.exports = {
sayHelloInEnglish = function() {
return "Hello";
}; sayHelloInSpanish = function() {
return "Hola";
};
};

这个方式看上去有点怪异,之后可以做更进一步的解释。在这之前,可以透露一点小道消息。 Typescript定义模块的语法就感觉自然多了:

module namespace {
exports function sayHelloInEnglish = function() {
return "Hello";
};

而用tsc转译以后,他就会变成上面的node.js语法。

什么是Typescript? OK,以后有时间再深入吧? (听起来怎么这么耳熟?)

导入/使用模块

我们准备在main.js中导入和使用greetings.js中的所有函数。

i> 关键词require

require是nodejs用来导入模块的关键词。想象一下require的定义如下 (怎么又是想象?)

var require =function(path){
//....
return module.exports;
};

ii> 导入greetings.js

//main.js
var greetings = require("./greetings");

想象一下以上代码等价于你的代码做了以下事情:

//main.js
var greetings = {
sayHelloInEnglish = function() {
return "Hello";
}; sayHelloInSpanish = function() {
return "Hola";
};
};

iii> 现在我么就可以重用greetings.js的功能了

//"Hello"
greetings.sayHelloInEnglish(); // "Hola"
greetings.sayHelloInSpanish();

警告:

正因为nodejs的这种模块机制,如果不小心给module.exports重新赋给了一个全新的对象,会导致不可预期的问题。

如:

//greetings.js
//var exports=module.exports = {};
exports.sayHelloInEnglish = ...
exports.sayHelloInSpanish = ...
/*
重新赋值module.exports
*/
module.exports= "Bonjour";

这时候,在main.js中我们在调用`greetings.sayHelloInEnglish()'就会出错。

下一步:进阶研究require()的工作原理。

通过Anuglar Material串串学客户端开发 - NodeJS模块机制之Module.Exports的更多相关文章

  1. 通过Anuglar Material串串学客户端开发 - javascript编译和gulpfile.js

    Angular Material不仅仅有本身框架的源代码,还有在这个框架上实现的一个应用docs.更为强大的是,这个应用是真正的产品网站:就是它的官网.我有理由相信,这个网站是从源代码直接发布的,从网 ...

  2. node (02 CommonJs 和 Nodejs 中自定义模块)顺便讲讲module.exports和exports的区别 dependencies 与 devDependencies 之间的区别

    CommonJS 规范的提出,主要是为了弥补当前 JavaScript 没有标准的缺陷.它的终极目标就是:提供一个类似 Python,Ruby 和 Java 语言的标准库,而不只是停留在小脚本程序的阶 ...

  3. 【前端知识体系-NodeJS相关】对NodeJS模块机制的理解

    1. CommonJS模块规范 1.1 模块引用 var math = require('math'); 1.2 模块定义 [!NOTE] 上下文提供exports对象用于导出当前模块的方法和变量,并 ...

  4. es6模块 nodejs模块和 typescript模块

    es6模块 import和export nodejs模块 require和module.exports typescript模块 module和export

  5. 《OD学微信开发》微信小程序入门示例

    官网地址: https://mp.weixin.qq.com/debug/wxadoc/dev/ 一.文件结构 小程序包含一个描述整体程序的 app 和多个描述各自页面的 page. .js后缀的是脚 ...

  6. nodeJS学习(9)--- nodeJS模块:exports vs module.exports

    模块简介: 通过Node.js的官方API可以看到Node.js本身提供了很多核心模块 http://nodejs.org/api/ 这些核心模块被编译成二进制文件,可以 require('模块名') ...

  7. nodejs模块中exports和module.exports的区别

    通过Node.js的官方API可以看到Node.js本身提供了很多核心模块 http://nodejs.org/api/ ,这些核心模块被编译成二进制文件,可以require('模块名')去获取:核心 ...

  8. NodeJS模块和ES6模块系统语法及注意点

    社区模块规范: 1.CommonJS规范 规范实现者: NodeJS 服务端 Browserify 浏览器 2.AMD规范 全称 异步模块定义 规范实现者: RequireJS 浏览器 3.CMD规范 ...

  9. 学Android开发,入门语言java知识点

    学Android开发,入门语言java知识点 Android是一种以Linux为基础的开源码操作系统,主要使用于便携设备,而linux是用c语言和少量汇编语言写成的,如果你想研究Android,就去学 ...

随机推荐

  1. Centos7 禁止firewalld并使用iptables 作默认防火墙以及忘记root密码的处理方法

    一.停止并禁用firewalld [root@test ~]# systemctl stop firewalld [root@test ~]# systemctl disable firewalld ...

  2. gulp-htmlmin压缩html

    通过一条命令用Npm安装gulp-htmlmin: npm install gulp-htmlmin --save-dev 安装完毕后,打开gulpfile.js文件,我们里面编写一个task用来专门 ...

  3. C 数据类型 长度

    ----数据类型长度 C99标准并不规定具体数据类型的长度大小.计算机具有不同位数的处理器,16,32和更高位的64位处理器,在这些不同的平台上,同一种数据类型具有不同的长度. char,short, ...

  4. 关于64位windows2003 未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0” 的问题

    我了个去啊! 在自己机器上测试通过的excel导入功能在客户服务器上死活都不好用,查了半天后来发现客户服务器是64位的win2003!! try catch捕捉问题为:未在本地计算机上注册“Micro ...

  5. java多线程学习-ThreadLocal

    为了凑字,把oracle文档里介绍ThreadLocal抄过来 public class ThreadLocal<T> extends Object This class provides ...

  6. jQuery -> bind / live / delegate 的终结者 - on

    Bind()方法: 给元素绑定事件 形式: .bind(eventType[,eventData],handler(eventObject)) eventType,string类型,一个或多个DOM事 ...

  7. SDK,monkey 浅谈

    最近在工作之余碰到一些手机测试的新手,现在测试手机的基本都是android的系统. 然后在遇到压力测试的时候就开始遇到问题了. 压力测试用什么工具?怎么使用?工具怎么来? 今天遇到两个人都问我SDK是 ...

  8. npoi实现 从固定的行读取数据作为表头并返回datable

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  9. 深入理解C语言的函数调用过程

    本文主要从进程栈空间的层面复习一下C语言中函数调用的具体过程,以加深对一些基础知识的理解.     先看一个最简单的程序: 点击(此处)折叠或打开 /*test.c*/ #include stdio. ...

  10. Daily Scrum 12.10

    今日完成任务: 终于修复了大部分的异常,感觉顿时松了一口气.重新在服务器上部署了webservice接口服务以及学霸网站.资源的上传下载功能正在逐渐完善. 遇到困难: 在本地运行正常,部署到服务器上运 ...