代码改变世界

【入门Node.js】模块与包管理工具

2017-03-09 16:06  SiestaKc  阅读(831)  评论(0编辑  收藏  举报

记得半年之前已为高级程序员的舅舅就跟我说要多接触新的技术,除了最基础的知识储备外,框架以及工程化这些也很重要,还向我推荐了Node.js,时至今日,我才开始涉水,希望不会太晚!最近知识付费的讨论如火如荼,想想去年暑假班级导师就推荐过的培训课程说原价4888,现价99的还加入了一回,到头来发现所学甚少。但是,看过一个观点,不要一味地拒绝二手知识,二手知识往往是一个新手对于未入门领域最便捷最有效的通道,所以,对于nodejs的入门想试一把先从看教学视频入门,看能不能更快速地掌握住知识,这里,仅是对慕课网上【Node.js】的系列课程的知识梳理,有遗漏和错误的地方会慢慢修正!anyway,对于新的知识仍需要持续不断地学习和思索!

一、Node.js的模块和Commonjs规范

前提:js缺少一种模块管理机制,来隔离实现不同功能的js片段,我们采用命名空间的方式,把变量和函数限制在某个特定的作用域内,我们需要约定一套规范来约束代码,保证了代码的安全。

Commondjs:一套规范,包括了【modules模块、packages包、system系统、binary二进制、console控制台、encodings编码、sockets套接字、unit test单元测试】等等来约定js怎么来阻止,应该怎么编写。

  • 首先把执行不同任务的特定的代码块或文件,看作是一个独立的模块,每个模块看作是一个独立的作用域,但每个模块之间不是孤立,可能存在依赖关系。
  • 一个模块可能分成三个关键部分:定义、标识、引用。

{nodejs和Couchdb就是对Commonjs的实现,而且规范与实现相互促进,形成一个良好的循环链}

 

Node.js:是借鉴了commonjs的模块管理阻止理念,实现了一套模块管理系统。

  • 在nodejs里面每个js文件可以看作是一个独立的模块,在它里面不需要有命名空间,不担心变量、方法的污染,隔离。同时这些模块(文件)通过彼此的引入,组建成了一个更大的模块(功能包)。
  • 我们在安装nodejs时会自动安装npm这个包管理工具。通过npm包管理工具,可以往项目里面引入各种形形色色的模块。他们或简单或复杂,但是每个模块都是完整的、独立的。

二、模块的分类

模块的分类有 核心模块、文件模块、第三方模块三类。

在nodejs中,文件和模块是一一对应的。

引用模块的方式

  • 用文件路径引用
  • 用模块名来引用

::如果用名称引用非核心模块的话,node就会把模块名映射到对应模块名的路径,包含了核心函数的模块会在node启动时预先加载。(非核心模块就是使用npm安装的第三方模块,或是其他人创建的模块。)

三、模块的流程

 

  • 创建模块
//创建一个student.js

function add(student){
    console.log('Add student:' +student)
}

exports.add = add

//创建一个teacher.js

function add(teacher){
    console.log('Add Teacher:' +teacher)
}
exports.add = add 
  • 导出模块
exports.add = add 
  • 加载模块
//创建一个class.js

/*
利用require加载模块*/ var student = require('./student') var teacher = require('./teacher')

/*用add function使用模块*/ teacher.add('Scott') function add(teacherName,students){ teacher.add(teacherName) students.forEach(function(item,index){ student.add(item) }) } exports.add = add module.exports = add
  • 使用模块
//创建一个school.js

var class = require('./class')

exports.add = function(classes){
   classes.forEach(function(item,index){
       var _class = item
       var teacherName = item.teacherName
       var students = item.studentName
        class.add(teacherName, students)
   })

exports.add和moudle.exports的区别

  • moudel.exports是真正的接口,exports只不过是它的辅助工具,是指向module.exports的引用
  • 模块可以是任何你设置给它的东西(任何合法的javascript对象--boolean,number,date,JSON,string,array等)
  • 如果没有显示地给Module.exports设置任何的属性和方法,那么模块的属性则是exports设置给Module.exports的属性
  • 如果想要导出一个特定类型的模块,用moudle.exports
  • 如果想要导出一个典型的"实例化对象",即用exports.(推荐使用exports导出模块)