Node的模块化

在客户端,JavaScript运行在浏览器中。当咱们定义一个变量,它的做用域是全局的。好比咱们在文件app.js中定义一个sayHello函数,它的做用域是全局,能够经过window对象来访问。node

/* app.js文件 */
let sayHello = function() {
    console.log('hello');
}
window.sayHello();
复制代码

但这样会产生一个问题,那就是在真实的编程中,咱们常常会将不一样的代码放到不一样的文件中去。若是这时在2个文件中都有定义了同名的sayHello函数,被自动添加到了window对象当中,而最新的定义会覆盖先前的定义。形成全局做用域的污染。因此在创建可信和可维护的应用时应避免定义全局变量和函数。这时候就要用到模块化,建立小型的拼装块或是模块来存放变量和函数。 编程

这样不一样模块之间的同名变量和函数不会互相覆盖,它们都被封装到模块里了。 node的核心概念就是模块,每一个 node中的文件都被看作模块,每一个模块中定义的变量和函数做用域仅在模块内。以面向对象的观点咱们称之为私有成员,在容器外,也就是模块外是不可见的。若是你要在模块外使用一个定义在模块中的变量或函数,外卖须要明确的导出它为公开成员。

每一个node工程至少要包含一个文件或者说一个模块,这里的app.js就是这个项目的主模块。浏览器

删除文件中的代码,而后把module对象打印出来看下。 bash

这是一个 JSON对象,它包含了键值对,好比 id,每一个模块都有独一无二的 idexports表示可使用它建立你的模块,添加到这个对象的属性能够在外部访问。 parent表示最早引用该模块的模块。 filename也就是这个模块的物理位置。 loader表示这个模块是否被加载。 children表示被该模块引用的模块对象。 paths表示模块的搜索路径。

因此在node中,每一个文件都是模块,模块中定义的成员做用域只在模块中,它们在模块外是不可见的。那咱们如何建立模块并加载模块呢?app

首先咱们建立一个logger.js的新文件,假设咱们为记录信息建立一个模块,在不少的地方会复用到这个模块。有可能也会在其它应用里用到这个模块。 模块化

在模块中咱们假设要使用一个远程日志服务来记录咱们的日志,有个其它的网站能够提供日志服务,它提供了一个 URL,能够经过给它发送 HTTP请求来记录日志。

/* logger.js文件 */
let url = 'http://mylogger.io/log';
function log(message) {
  //发送http请求
  console.log(message);
}
//在exports对象中添加log方法,将这里的log函数赋值给它
module.exports.log = log;
复制代码

为了保持模块的简单使用,原则就是公开最小限度的成员。在logger模块中,这个url是实现细节,其它的模块不须要了解它,它们只须要调用log函数就能够了。让log变为公开,而保持url私有。好的,如今logger模块已经作好了,接下来就是要到app.js中使用它。函数

app.js中的代码都删除,加载模块须要用到require函数,这是node才有的函数,浏览器是没有的。这个函数须要一个参数,也就是咱们想加载的模块名称。学习

/* app.js文件 */
//引入模块
let logger = require('./logger');
console.log(logger);
复制代码

咱们获得了一个对象,对象中有一个单一的函数 log,这样就能够在 app.js中调用这个函数了。

/* app.js文件 */
//引入模块,可不写后缀名,node会自动补全
let logger = require('./logger');
logger.log('hello node');
复制代码

这就是 node中模块的工做方式,定义一个模块,导出一个或多个成员。为了使用模块,咱们使用 require函数进行导入。最佳实践的是将导入的模块保存在常量中。使用 const。避免意外的将 logger从新赋值。

const logger = require('./logger');
复制代码

有时候咱们不想导出一个对象,只是想导出一个简单的函数,如上所示同样。导出对象是在有多个属性或者方法时才用获得,因此改造下logger.jsapp.js的代码。网站

/* logger.js文件 */
let url = 'http://mylogger.io/log';
function log(message) {
  //发送http请求
  console.log(message);
}
module.exports = log;
复制代码
/* app.js文件 */
let log = require('./logger');

log('hello node');
复制代码

因此在你的模块中,你能够导出对象或者单一函数。如今对模块的建立和引用加载有了一些印象,固然 node包含了不少有用和经常使用的模块。这个在实际编程中都会用到,具体的能够从 nodejs官网查看学习。
相关文章
相关标签/搜索