概念:模块(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的实现
                (2)单次加载
                      上面的例子有点类似创建一个对象,但实际上和对象又有本质的区别,因为require不会重复加载模块,也就是说无论调用多少次require,获取的模块都是同一个
                    getModule2.js
                (3)覆盖exports
                    有时我们知识想把一个对象封装到模块中,例如
                    定义模块:singleobejct.js
                    引入模块使用:getSingleObject.js
                    繁琐:exports.hello=hello;
                      引入:require("./singleobject").hello;
                    简易:module.exports=hello;
                 exports本身仅仅是一个普通的空对象,即{},它是专门用来声明接口
 
============ 包 ============
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,我们可以创建更复杂、更完善、更符合规范的包用于发布。
        (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:包的依赖,一个关联数组,由包名称和版本号组成。

nodejs的重要支柱的更多相关文章

  1. nodejs快速入门

    目录: 编写第一个Node.js程序: 异步式I/O和事件循环: 模块和包: 调试. 1. 编写第一个Node.js程序: Node.js 具有深厚的开源血统,它诞生于托管了许多优秀开源项目的网站—— ...

  2. Deno下一代Nodejs?Deno初体验

    前言 Ryan Dahl之父发布了新的项目Deno,很多IT媒体都使用了标题“下一代Nodejs”,首先我们看一下Deno的特性: 1.支持typescript (nodejs目前也支持). 2.无p ...

  3. webpack nodejs npm关系

    nodejs是js后端运行平台,可以把它看成java体系中对应的jdk,是三个里面最基础的.npm是nodejs的包管理工具,可以把它看成maven中包依赖管理那部分.webpack是前端工程化打包工 ...

  4. NodeJs之OS

    OS Node.js提供了一些基本的底层操作系统的模块OS. API var os = require('os'); console.log('[arch] 操作系统CPU架构'+os.arch()) ...

  5. NodeJs之Path

    Path模块 NodeJs提供的Path模块,使得我们可以对文件路径进行简单的操作. API var path = require('path'); var path_str = '\\Users\\ ...

  6. NodeJs之调试

    关于调试 当我们只专注于前端的时候,我们习惯性F12,这会给我们带来安全与舒心的感觉. 但是当我们使用NodeJs来开发后台的时候,我想噩梦来了. 但是也别泰国担心,NodeJs的调试是很不方便!这是 ...

  7. NodeJs在Linux下使用的各种问题

    环境:ubuntu16.04 ubuntu中安装NodeJs 通过apt-get命令安装后发现只能使用nodejs,而没有node命令 如果想避免这种情况请看下面连接的这种安装方式: 拓展见:Linu ...

  8. NodeJs之child_process

    一.child_process child_process是NodeJs的重要模块.帮助我们创建多进程任务,更好的利用了计算机的多核性能. 当然也支持线程间的通信. 二.child_process的几 ...

  9. nodejs进阶(6)—连接MySQL数据库

    1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...

随机推荐

  1. 利用POI获取Excel中图片和图片位置

    利用POI获取Excel中图片和图片位置(支持excel2003or2007多sheet) 转自:http://blog.csdn.net/delongcpp/article/details/8833 ...

  2. C++中构造函数或析构函数定义为private

    转自:http://www.blogjava.net/fhtdy2004/archive/2009/05/30/278971.html 很多情况下要求当前的程序中只有一个object.例如一个程序只有 ...

  3. 华中农业大学新生赛C题

    http://acm.hzau.edu.cn/problem.php?id=1099 题意: 输入两个整数 l 和 n,代表半径和output的保留小数点位数. 输出圆的面积,保留n位小数. 一开始觉 ...

  4. img转data

    http://blog.csdn.net/lwjok2007/article/details/50756273

  5. Subordinates

    Subordinates time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  6. sql 将表B中不存在表A的数据 插入到表A中

    insert into tableA select * from tableB b where not exists(select 1 from tableA a where a.id = b.id) ...

  7. Flask -- 消息闪现、错误处理

    flash 可以在任何需要的地方添加,类似于print from flask import flash @app.route('/') def index(): flash('You are in h ...

  8. 转:CSV Data Set Config 中文乱码问题

    从csv读取中文一直乱码. CSV Data Set Config的File encoding为GB2312,对应参数化文件编码也为GB2312,但读取出变量值一直为乱码,后发现是Allow quot ...

  9. android应用开发小技巧

    1,实现应用可以安装到SD卡里面去:在AndroidManifest.xml文件的manifest里面添加下面一行: 1 android:installLocation="preferExt ...

  10. IIS6 伪静态

    1. 设置IIS--主目录--脚本映射那一个属性 2.必须还要上传自己的urlrewriter组件,并在config里做相应的设置 二者缺一不可