Node.js 入门教程 (二):模块
由于新工作要做前端,作为前端小白而且能尽快学习,所以选择慕课网的node.js的入门教程。博客只做自己学习的记录。
JavaScript缺少模块管理机制,容易出现变量被覆盖,方法被替代的情况(既被污染)。特别是存在依赖关系时,容易出现错误。采用命名空间的方式,把变量和函数限制在某个特定的作用域内,人肉约定一套命名规范来限制代码,保证代码安全运行。
CommonJs是一套规范,包括了modules,system,encodings,unit test等等来约定JavaScript应该怎么去组织和编写。
首先把执行不同任务的代码块和代码文件看为独立的模块,每一个模块都是一个单独的作用域,但不是孤立的,可能存在依赖关系。每个模块分为三个部分,定义、标识和引用。node.js借鉴了Commonjs的理念,并且基于CommonJS实现了一套模块管理系统。
nodejs里面,每一个js文件可以看成一个独立的模块,里面不需要有命名空间,不需要担心变量污染和方法隔离,而每个模块通过依赖和引入组合起来又组成了更强大的功能包
(一)模块分类:
核心模块
文件模块
第三方模块
(二)引入模块:
路径引入
名字引入
(三)使用模块流程:
创建模块:teacher.js 入口的js文件,并且加入特定功能
导出模块:exports.add=function(){} 把这个功能跟模块名建立关系
加载模块:var teacher=require('./teacher.js') 在其他文件引入并加载模块
使用模块:teacher.add('Scott')
(四)代码试验:
目录结构:
school
----student.js
----teacher.js
----class.js
----index.js 入口文件
student.js:
function add(student){
console.log('Add student:' + student)
}
exports.add = add
代码解析:
exports是一个对象,可以挂载任何合法的JavaScript对象,包括属性,number,date,json,string,array等
klass.js:
var student = require('./student')
var teacher = require('./teacher')
teacher.add('Scott')
function add(teacherName, students){
teacher
students.forEach(function(item,index){
student.add(item)
})
}
exports.add = add
可以直接require模块,不用担心影响全局命名空间,node里面没有全局命名空间这个概念,如果模块没有错误,require就会返回这个模块对象,这个模块对象就是该模块的exports,而且还可以使用局部对象来接收require返回的对象
如果希望模块成为一个特别的对象类型,使用module.exports,如果希望模块成为一个传统的模块实例,使用exports.add(推荐使用)
index.js:
var klass = require('./klass')
exports.add = function(klasses){
klasses.forEach(function(item, index){
var _klass = item
var teacherName = item.teacherName
var students = item.students
klass.add(teacherName,students)
})
}var klass = require('./klass')
klass.add('Scott',['Lucy','Ben'])