前言

书上还有很大一部分讲了C/C++模块的编译过程、核心模块编写和C/C++扩展模块的内容,不过我对C++一窍不通因此没有仔细看,如果以后需要再自习看吧。

包与NPM

第三方模块中,模块和模块之间是散列在各地的,互相之间不能直接引用。而在模块之外,包和NPM则是将模块联系起来的一种机制。

CommonJS的包规范定义其实也十分简单,它由包结构和包描述文件两个部分组成,前者用于组织包中的各种文件,后者用于描述包的相关信息,以供外部读取分析。

包结构

包实际上是一个存档文件,即一个目录直接打包为.zip或tar.gz格式的文件,安装后解压还原为目录,完全符合CommonJS规范的包结构应该包含如下这些文件:

  • package.json 包描述文件
  • bin 存放可执行二进制文件
  • lib 存放js代码
  • doc 存放文档
  • test 存放单元测试用例代码

包描述文件与NPM

包描述文件用于表达非代码相关的信息,它是一个JSON格式的文件——package.json,位于包的根目录下。文件中的字段就不放上来了(字太多了);

NPM常用功能

1.查看帮助

安装Node之后,执行npm -v可以查看当前NPM版本:

执行NPM查看帮助引导说明:

使用npm help <command>可以查看具体命令说明,执行命令后会在浏览器打开一个说明文档。

2.安装系统依赖包

安装系统依赖包是NPM最常见的用法,它的执行语句是npm install <packageName>。执行命令后Node会在当前目录下创建node_modules目录(如果当前目录下不存在这个目录),然后在node_modules中创建对应包名的目录,然后将压缩包解压到这个目录下。安装好依赖包后就可以通过require(<packageName>)来引入包。

全局模式安装

如果包中含有命令行工具,那么需要执行npm install <packageName> -g来进行全局模式安装。

全局模式这个称谓具有误导性,全局模式安装并不是将一个模块包安装为一个全局包,它并不意味着可以从任何地方用require()引用到这个模块。它实际上是将一个包安装位全局可用的可执行命令,它根据包描述文件中的bin字段配置,将实际脚本链接带与Node执行文件相同的路径下。

通过全局模式安装的包都被安装进了一个同一目录下,这个目录可以用如下方式推算出来:

path.resolve(process.execPath, '..', '..', 'lib', 'node_modules');

从本地安装

对于一些没有发布到NPM上或者因为网络原因没下载的包,可以通过将包下载到本地,然后以本地安装。本地安装只需为NPM指明package.json文件所在的位置即可:它可以是一个包含package.json的存档文件,也可以是一个URL地址,也可以是一个目录下有package.json文件的目录位置:

npm install <tarball file>
npm install <tarball url>
npm install <folder>
从非官方源安装

如果不能通过官方源安装,可以通过镜像源安装。在执行命令时,添加--registry=http://registry.url即可,示例如下:

npm install underscore --registry=http://registry

可以指定默认源:

npm config set registry http://registry.url

3.NPM钩子命令

4.发布包

编写模块
//hello.js
exports.sayHello = function () {
return 'Hello, world.';
}
初始化包描述文件

可以在包目录下使用npm init来生成package.json文件:

注册包仓库帐号

执行npm adduser然后按顺序进行即可。

上传包

在package.json文件所在目录下,执行npm publish

安装包

执行npm install <packageName> --registry=https://registry.npmjs.org/

管理包权限
npm owner ls <packageName>
npm owner add <user> <packageName>
npm owner rm <user> <pacjageName>
分析包

npm ls可以列出当前路径下能够通过模块路径找到的所有包,并生成依赖树:

局域NPM

NPM潜在问题

前后端共用模块

《深入浅出Nodejs》笔记——模块机制(2)的更多相关文章

  1. 《深入浅出Nodejs》笔记——模块机制(1)

    前言 这是我读<深入浅出Nodejs>的笔记,真是希望我的机械键盘快点到啊,累死我了. CommonJS规范 主要分为模块引用.模块定义.模块标识三个部分. 模块引用 上下文提供requi ...

  2. 浅谈NodeJs的模块机制

    J历史 我们都知道,js在刚被创建的时候,只是为了在网页上写一些小脚本而已,比如网页特效,表单验证等等,创立者也许没觉悟到以后的js会发展到如此规模.这是web1.0时代. 在web 2.0时代,各种 ...

  3. 深入浅出node(2) 模块机制

    这部分主要总结深入浅出Node.js的第二章 一)CommonJs 1.1CommonJs模块定义 二)Node的模块实现 2.1模块分类 2.2 路径分析和文件定位 2.2.1 路径分析 2.2.2 ...

  4. nodejs笔记--模块篇(三)

    文件模块访问方式通过require('/文件名.后缀')    require('./文件名.后缀')    requrie('../文件名.后缀') 去访问,文件后缀可以省略:以"/&qu ...

  5. 【读书笔记】《深入浅出nodejs》第二章 模块机制

    1.什么是模块? 指在程序设计中,为完成某一功能所需的一段程序或子程序:或指能由编译程序.装配程序等处理的独立程序单位:或指大型软件系统的一部分. ----<百度百科> 2.JavaScr ...

  6. 深入浅出Nodejs读书笔记

    深入浅出Nodejs读书笔记 转:http://tw93.github.io/2015-03-01/shen-ru-qian-chu-nodejs-reading-mind-map.html cate ...

  7. Nodejs:Node.js模块机制小结

    今天读了<深入浅出Nodejs>的第二章:模块机制.现在做一个简单的小结. 序:模块机制大致从这几个部分来讲:JS模块机制的由来.CommonJS AMD CMD.Node模块机制和包和n ...

  8. 通过Anuglar Material串串学客户端开发 - NodeJS模块机制之Module.Exports

    module.exports 前文讲到在Angular Material的第二个编译文件docs/gulpfile.js中却看到了一个奇怪的东西module.exports那么module.expor ...

  9. 深入浅出Nodejs读书笔记(转)

    Node简介 这一章简要介绍了Node,从中可以了解Node的发展历程及其带来的影响和价值. 为什么叫Node?起初,Ryan Dahl称他的项目为web.js,就是一个Web服务器,但是项目的发展超 ...

随机推荐

  1. python socket和简单tcp通信实现

    python 服务端和客户端的简单交互 TCP服务端: 1 创建套接字,绑定套接字到本地IP与端口 s = socket.socket(socket.AF_INET,socket.SOCK_STREA ...

  2. 【BZOJ4880】排名的战争 [暴力]

    排名的战争 Time Limit: 8 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description 小Q是一名出色的质检员,他负责质检 ...

  3. 20151024_001_C#基础知识(静态与非静态的区别,值类型和引用类型,堆和栈的区别,字符串的不可变性,命名空间)

    1:我们把这些具有相同属性和相同方法的对象进行进一步的封装,抽象出来类这个概念. 类就是个模子,确定了对象应该具有的属性和方法. 对象是根据类创建出来的. 2:类:语法 [public] class ...

  4. 第一章:读取文件一行IO::File

    #!c:\\perl\\bin\\perl.exe use IO::File; #读取一行 my $fd = IO::File->new('perl.txt'); my $one_line = ...

  5. rabbitmq之队列性能测试及优化方法(六)

    前言 下面关注一下rabbitmq实际使用时的性能问题和怎么进行一些优化. 性能测试 针对每个需要生产/消费者与rabbitmq进行通讯的方法进行测试 测试环境 排除网络IO的干扰,采用生产者和消费者 ...

  6. FC4-i386-SRPMS

    [重点] http://archives.fedoraproject.org/pub/archive/fedora/linux/core/6/ http://archives.fedoraprojec ...

  7. write-ups

    https://github.com/MarioVilas/write-ups https://github.com/Deplorable-Mountaineer/Robot_Dynamite htt ...

  8. Linux下用freetds执行SQL Server的sql语句和存储过程

    Linux下用freetds执行SQL Server的sql语句和存储过程 http://www.linuxidc.com/Linux/2012-06/61617.htm freetds相关 http ...

  9. 【POJ2420】A star not a tree?

    蒟蒻开始学模拟退火…… 起初一直不肯学,因为毕竟玄学算法…… 哎呀玄学怎么就没用呢?对不对? #include<iostream> #include<cstdio> #incl ...

  10. ajax之深入解析(2)

    我们前面实现了用原生的JavaScript代码实现ajax的异步数据传输.接下来,我们再使用一个流行的js框架jQuery来实现ajax. 通过 jQuery AJAX 方法,我们能够使用 HTTP ...