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/


npm:Node Package Manager,一个用于下载、安装、查找、更新、删除第三方Node.js包的工具——这些包含都符合CommonJS包规范;同时,还可以执行打包、发布模块、解决模块间依赖等功能,已经成为Node.js包管理的标准。
本地安装
将下载的NPM包安装在当前项目工作路径:
npm install 包名
1、安装包将保存在npm root 命令所指定的目录下。
2、可以通过require()来引入本地安装的包。


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

维护
列出已经安装的包:
npm ls

更新已经安装的包:
npm update [包名]
直接npm update是将安装的包全部更新,npm update 包名是更新指定的包。
卸载已经安装的包:
npm uninstall 包名
创建包
使用npm init 命令可以在当前目录下生成一个package.json文件。


{
"name": "mytest",
"version": "1.0.0",
"description": "我的测试包",
"main": "app.js",
"scripts": {
"test": "tets.js"
},
"keywords": [
"测试"
],
"author": "zdm",
"license": "ISC"
}
使用npm help json命令可以查看package.json文件所有可用的配置选项。(命令行会自动打开一个文档)

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