Node.js包和NPM(Node.js自学第六天)

546 阅读4分钟

Javascript的问题

JavaScript最初设计目标是运行在客户端控制页面的交互行为;随着服务器端应用的展开,其在下列问题开始展现:
(1)JavaScript没有模块的概念。没有原生的密闭作用域支持和依赖管理;
(2)JavaScript没有标准库。确实文件IO、Socket、加密等API标准;
(3)JavaScript没有标准接口。确实数据库访问的统一接口。
(4)JavaScript没有包管理系统。不能自动加载和安装依赖文件。

由于缺少统一的标准和规范,上述问题限制了服务器端JS更广法更大规模的应用。

CommonJS规范

2009年业界提出了ServerJS规范,ServerJS最后改名CommonJS,CommonJS(www.commonjs.org/)不是一门语言,而是为…

(1)服务器端应用
(2)命令行应用
(3)桌面GUI应用
(4)混合应用

CommonJS规范目前已有很多实现,如Node.js、Narwhal、Wakanda等,实现了其定义的常用API,以及模块和包的编写、使用和维护规范。

CommonJS包规范

package:包,是模块的集合,是在模块基础上更深一步的抽象,蕾仕于C/C++的函数库或者Java/.Net的类库。它将特定功能相关的模块封装起来,用于发布、更新、依赖管理和版本控制。

根据CommonJS包规范(wiki.commonjs.org/wiki/packag…

(1)在一个package.json文件位于顶级目录下;
(2)在bin目录下保持二进制文件;
(3)在lib目录下保存说明文档;
(4)在doc目录下保存说明文档;
(5)在test目录下保存单元测试文件。

require和包

require方法也是CommonJS规范中的一部分,除了可以映入文件模块之外,还可以引入包,其参数是包的名称;

require('my_package');

CommonJS规范要求被引入的包应位于当前目录或者当前目录的父目录下的node_modules目录下,或者NODE_PATH环境变量所指定的目录下,require函数由近及远依次查找。

package.json

CommonJS规范规定了用于描述包特征的文件:package.json,其内容包括:

{
  "name": "mynode",//包名。由小写字母、数字和下划线组成;
  "version": "1.0.0",//版本号;
  "main": "app.js",//主文件名称;
  "dependencies": {//所依赖的包;
    "iconv-lite": "^0.5.0",
    "express":"4.0",
    "mysql":["2.11","2.0","1.0"]
  },
  "devDependencies": {},
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "authors": "",作者信息数组。每个元素可包含name、enmail、web属性;
  "license": "ISC",
  "description": "这是我的一个为了介绍CommonJS创建的案例包",//包说明;
  "maintainers":[
    {
    	"name":"ZDM",
      "email":"zdm@qq.com"
    }
  ],//包维护者信息数组;
  "bugs":[
    {
    	"mail":"zdm@qq.com",
      "web":"http://test.zdm.com"
    }
  ],//bug提交网址,网址或邮件地址;
  "licenses":[
    {
    	"type":"Apache License v2",
      "url":"http://www.apache.org/licenses/apache2.html"
    }
  ],//许可证数组;
  "repositories":[
    {
    	"type":"git",
      "url":"https://github.com/zdm/unit.git"
    }
  ],//仓库托管地址数组;
  "keywords":["ZDM","Demo","lesson"],//关键字数组;
  "engines":""//可以运行的引擎版本
}

NPM

更具CommonJS规范,Node.js已经提供了几十个核心模块,但在更广泛的项目应用中,这些模块显得不足;于是第三方组织和个人开发了更多的扩展包:www.npmjs.com/

image.png

image.png

npm:Node Package Manager,一个用于下载、安装、查找、更新、删除第三方Node.js包的工具——这些包含都符合CommonJS包规范;同时,还可以执行打包、发布模块、解决模块间依赖等功能,已经成为Node.js包管理的标准。

Node.js的安装文件中,已经集成了NPM包管理工具。

本地安装

将下载的NPM包安装在当前项目工作路径:

npm install 包名

1、安装包将保存在npm root 命令所指定的目录下。
2、可以通过require()来引入本地安装的包。

image.png

image.png

全局安装

将下载的NPM包安装在全局:

npm install 包名 -g

1、安装包将保存在npm root -g 命令所指定的目录下;
2、可以直接在交互模式下使用,不能供脚本文件使用。

image.png

维护

列出已经安装的包:

npm ls

image.png

更新已经安装的包:

npm update [包名]

直接npm update是将安装的包全部更新,npm update 包名是更新指定的包。

卸载已经安装的包:

npm uninstall 包名

创建包

使用npm init 命令可以在当前目录下生成一个package.json文件。

image.png

image.png

{
  "name": "mytest",
  "version": "1.0.0",
  "description": "我的测试包",
  "main": "app.js",
  "scripts": {
    "test": "tets.js"
  },
  "keywords": [
    "测试"
  ],
  "author": "zdm",
  "license": "ISC"
}

使用npm help json命令可以查看package.json文件所有可用的配置选项。(命令行会自动打开一个文档)

image.png

发布包

如果希望开源自定义的包,可以将其发布到npmjs.org上:
(1)在https://www.npmjs.org上注册账号(可以省略);
(2)使用npm adduser命令注册新账号或者登陆已有帐号;
(3)进入配置完成的包目录,使用npm publish命令发布包;
(4)到npmjs.org搜索刚刚发布的包。

image.png