概念:模块(Module)和包(Package)是Node.js最重要的支柱。开发一个具有一定规模的程序不可能只用一个文件,通常需要把各个功能拆分、分装、然后组合起来。模块正式为了实现这种方式而诞生,在浏览器JavaScript中,脚本模块的拆分和组合通常使用HTML的script标签来实现,Node.js提供了require函数来调用其他模块,而且模块都是基于文件,机制非常简单,模块和包的区别是透明的,因此经常不作区分。

一、模块

1.什么是模块

Ryan
模块和文件是一一对应的。一个Node.js文件就是一个模块,这个文件可能是JavaScript代码、JSON或者编译过的C/C++扩展。
var http=require('http'),其中http是Node.js的一个核心模块,通过require函数获取这个模块,然后使用其中的对象

2.创建及加载模块

(1)创建模块

Node.js提供了exports和require两个对象,其中exports是模块公开的接口,require用于从外部获取一个模块的接口,即获取模块的exports对象
附件module.js和getModule.js的实现
案例:
module.js:
var name;
exports.setName=function(thyName){name=thyName;
}
exports.sayHello=function(){console.log('hello'+name);
}

getModule.js:

var myModule=require('./module');
myModule.setName('marico');
myModule.sayHello();

(2)单次加载

上面的例子有点类似创建一个对象,但实际上和对象又有本质的区别,因为require不会重复加载模块,也就是说无论调用多少次require,获取的模块都是同一个
getModule2.js
var myModule1=require('./module');
myModule1.setName('marico');
var myModule2=require('./module');
myModule2.setName('yfc');
myModule1.sayHello();

(3)覆盖exports

有时我们知识想把一个对象封装到模块中,例如
定义模块:singleobejct.js
引入模块使用:getSingleObject.js
繁琐:exports.hello=hello;
引入:require("./singleobject").hello;
简易:module.exports=hello;
exports本身仅仅是一个普通的空对象,即{},它是专门用来声明接口
案例:
singleobject..js
function hello(){var name;this.setName=function(thyName){name=thyName;}this.sayHello=function(){console.log('hello '+name);}
}
//exports.hello=hello;
module.exports=hello;

getSingleObject.js

var hello=require('./singleobject');
var he=new hello();
he.setName('marico');
he.sayHello();
var he2=new hello();
he2.setName('yfc');
he2.sayHello();

二、创建包

1.包的概念

包是在模块基础上更深一步的抽象,Node.js的包类似于C/C++的函数库或者java的类库,它讲某个独立的功能封装起来,用于发布、更新、依赖管理的版本控制。开发了npm来解决包的发布和获取需求。

2.如何创建一个包

CommonJS规范的包应该具备一下特征:

package.json必须在包的顶层目录下
二进制文件应该在bin目录下
javaScript代码应该在lib目录下
文档应该在doc目录下
单元测试应该在test目录下
Node.js对包要求并没有那么严格,只要顶层目录下有package.json,并符合基本规范即可
(1)作为文件夹的模块
somepackage文件夹
最简单的包,就是一个作为文件夹的模块,
创建一个文件夹 somepackage,里面有一个index.js,里面提供一个方法sayHello()
var somepackage=require('./somepackage');
somepackage.sayHello();
我们使用这种方法可以把文件夹封装成一个模块,即所谓的包。包通常是一些模块的集合,在模块的基础上提供了更高层的抽象,相当于提供了一些固定接口的函数库,通过定制package.json,我们可以创建更复杂、更完善、更符合规范的包用于发布。
package.js
exports.say=function(){
console.log(" test package!");
}

test01.js

var mymodule=require('/源码/05/package/lib/package.js');
console.log(mymodule.say());
(2)package.json
前面的例子,在somepackage文件夹下,我们创建一个package.json的文件,内容
{
'main':'./lib/index.js'
}
Node.js在调用某个包时,会检查包中package.json文件的main字段,将其作为包的接口模块,如果package.json或main字段不存在,会常事寻找index.js或index.code作为包的接口
package.json的规范属性:
name:包的名称,必须是唯一
description:包的简要说明
version:符合语义化版本识别规范的版本字符串
keywords:关键字数据,通常用于搜索
maintainers:维护者数组,每个元素要包含name、email、web可选字段
contributors:贡献者数组,格式与maintainers相同。包的坐着应该是贡献者数据的第一个元素
bugs:提交bug的地址,可以是网址或者电子邮件地址
licenses:许可证数组,每个元素要包含type和url字段
repositories:仓库托管地址数组,每个元素要包含type、url和path字段
dependencies:包的依赖,一个关联数组,由包名称和版本号组成。

node.js模块和包相关推荐

  1. node.js 模块_如何创建Node JS可重用模块

    node.js 模块 In my previous post, we have discussed about "How to export and import a Node JS Mod ...

  2. Node.js「一」—— Node.js 简介 / Node.js 模块 / 包 与 NPM

    本文为 Node.js 系列笔记第一篇.文章参考:nodejs 教程 -- 大地:<深入浅出 Node.js>:阮一峰 nodejs 博客 文章目录 一.Node 简介 1. 简单介绍 2 ...

  3. Node.js 模块以及npm包的管理和使用

    Node.js模块系统 Node.js的模块系统是将可重用代码封装在各种模块中,减少了应用程序的代码量,模块系统提高了开发效率和代码的可读性,并且模块打包代码的方式不会改变全局作用域,开发人员可以在被 ...

  4. (8)Node.js 模块介绍

    一.Node.js模块介绍 模块(包)是 Node.js 中具有特定功能的对象. 二.web浏览器端和Node端的对比图 我们通过如上图可以看到,再web浏览器端的基本语法,再Node端也能使用,但是 ...

  5. 编写原生的Node.js模块

    通常,我们开发原生Node.js模块包括但不仅限于以下原因: 对性能有比较苛刻要求的应用.尽管Node.js得益于libuv,在异步I/O操作很有优势,但遇到数字计算时并不是一个很好的选择. 使用更加 ...

  6. node 大写_大写Node.js模块

    node 大写 Today, let's see a third party module that helps us in working with upper-case letters witho ...

  7. Node.js 模块之Nimble流程控制

    NodeJS异步的特性有时候会导致程序非常的难看,回调一层套着一层,这个时候就要用流程控制模块来控制究竟是同步还是异步了. Nimble是一个轻量.可移植的函数式流程控制模块.经过最小化和压缩后只有8 ...

  8. 不再为 Node.js 模块自动引入 Polyfills

    在早期,webpack 的目的是为了让大多数的 Node.js 模块运行在浏览器中,但如今模块的格局已经发生了变化,现在许多模块主要是为前端而编写.webpack <= 4 的版本中提供了许多 ...

  9. Node.js---02、node.js 模块加载机制

    2019独角兽企业重金招聘Python工程师标准>>> node.js模块分为自定义模块.扩展模块和核心模块.所有模块的加载都是通过关键字require()实现. 1.自定义模块的加 ...

最新文章

  1. linux下vi命令大全[转]
  2. leetcode 795. Number of Subarrays with Bounded Maximum | 795. 区间子数组个数(Java)
  3. RecursiveTask和RecursiveAction的使用 以及java 8 并行流和顺序流
  4. React Native之react-native bundle --platform android --dev false --entry-file index.js --bundle失败
  5. [USACO1.5]八皇后 Checker Challenge
  6. ant 路径_在Ant中显示路径
  7. qt中QMap与QMultimap用foreach遍历
  8. 小丑马戏团风格英文404网页模板
  9. .NET Timer控件
  10. 《Hadoop MapReduce实战手册》一1.10 使用MapReduce监控UI
  11. 大学生程序设计邀请赛(华东师范大学)C:袋鼠妈妈找孩子
  12. SpringBean生命周期详解
  13. DIY智能车赛优胜奖开源作品——手机遥控麦克纳姆轮小车(1)
  14. CMD隐藏黑窗口运行
  15. 计算机控制plc开机,PLC控制系统与工控计算机控制系统的区别
  16. electron使用下载监听接口(will-download)出现不触发done
  17. Spring AOP 的工作原理
  18. 杰理ac18芯片_AC6905B/AC6905C杰理JL24脚四合一蓝牙芯片
  19. python---input()输入浮点数,整数,字符串
  20. 为什么上班只是坐着,一天下来还是觉得好累?

热门文章

  1. shiro ajax权限拦截器,Shiro Ajax请求权限不满足,拦截后解决方案
  2. 中断、异常、处理对于操作系统的概念
  3. JAVA入门级教学之(浮点型数据类型)
  4. 青岛旅游学校计算机证书,【我和我的旅校】青岛旅游学校优秀毕业生郭千瑜
  5. 程序员的数学 pdf_作为一个程序员,分享我日常学习方式,自学渠道和方式
  6. springmvc 拦截器_Spring MVC拦截器学习
  7. python创建access表_Access创建表
  8. python的open函数百度百科,open函数
  9. apple ii 模拟器 mac_苹果自研芯片Mac价格曝光
  10. linux redis 主从配置,redis集群(主从配置)