在客户端,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
,每一个模块都有独一无二的
id
。
exports
表示可使用它建立你的模块,添加到这个对象的属性能够在外部访问。
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.js
和app.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
官网查看学习。