Javascript天生的缺点
熟悉JS的都知道,我们可以通过var或function定义一个全局访问的变量或函数。但是当有多人协作或大量引入JS文件时,那么变量和函数就很容易重写和覆盖,特别是有很多依赖关系的时候,很容易出错。这是因为Javascript天生就缺少模块管理机制,来隔离JS片段相互影响,因此我们常采用命名空间的方式:将变量和函数限制在某个特定的作用域内。从而保证代码安全执行。
Commonjs规范
它不是一个具体负责某个职能的JS库,它是一套规范,来规定Javascript怎么去组织,怎么去编写。同时大部分的标准都在拟定和讨论之中的。首先是把执行不同的任务的代码块或代码文件看做独立的模块,每个模块都是有独立的作用域,模块间可以有依赖关系。对于一个模块可以分成3个关键部分:定义、标识、引用。这种设计规范在社区内不断成长壮大,对许多开源的产品产生了极大的推动作用,比如nodejs/couchdb,都是对这个规范的实现,虽然不是百分百的实现,但又反馈给社区,促进进一步的优化,从而形成一个良性的循环链,彼此推动。
nodejs借鉴了Commonjs模块组织的理念,形成了一套模块管理系统。在nodejs里面,每一个JS文件可以看成一个独立的模块,在里面不需要有命名空间,不用担心变量污染和方法使用时的隔离,整个文件中的代码可以非常自然的组织起来。同时,这些独立的模块/文件通过彼此的依赖和引入可以组合成更强大、更完整的模块/功能包。
我们安装nodejs时,会同时安装NPM包管理工具,通过这个工具,我们可以像项目中引入各种形形色色的模块。
模块的分类
在nodejs里面,文件和模块是一一对应的,模块有几种类型,大概分为:
- 核心模块 http fs path...——将在最后接触
- 本地模块(同事们创建) var util=require('./util.js')——后面学习第一个接触
- 第三方模块(通过NPM安装的) var promise = require('bluebird')——第二个接触
引用方式
根据模块的类型,有几种引用的方式。
在nodejs里面,可以通过文件路径来引用模块,也可以通过模块名。如果用名称引用非核心模块,nodejs最终会把模块名映射到对应模块文件的路径。包含核心模块的模块会在node启动时预先加载。
到此总结下,上面说了很多,其实只要记住nodejs是模块化的管理机制,并且模块分为三种:node启动时预先加载的核心模块、自己或同事创建的本地模块、通过NPM加载的第三方模块。并且不同模块有不同的引入方式。
实现一个本地模块的流程
- 创建模块 teacher.js 创建一个JS文件,里面添加特定的功能
- 导出模块 exports.add=function(){} 功能和模块名建立关系
- 加载模块 var teacher=require('./teacher.js') 其他文件引入,并加载模块
- 使用模块 teacher.add('张三') 直接调用模块中的方法
注意exports有加s
exports与module.exports区别
它们两调用的功能是一样的,如果你想让你的模块成为特别的对象类型,那么请使用module.exports,如果你想让你的模块成为传统的模块实例,那就使用exports。现也不深究,后面学的时候,再研究。推荐使用exports。