Node.js 安装环境和简单实用教程
不说废话了,直接开始。
下载和安装 Node.js
Node.js 官网:https://nodejs.org/en/
Node 中国官网,并无卵用,可忽视。
当前长期支持版(在很多软件里,LTS
表示 long time support)为 4.2.4,最后稳定版为 5.4.1。如下图,这里选择长期支持版本,windows 64 位版本,直接点击 下载。其他版本请前往 下载页面 甄选。
这个版本安装过程没有特别的,选好安装目录,一路下一步完成安装,在 cmd 窗口输入 node --version
验证安装。
下载和安装 Git(可选)
Git 官网: http://git-scm.com/download/
npm
在安装和下载项目依赖包的时候,有些依赖文件存在于 github
上,需要调用 git
命令 clone
文件,所以需要安装 Git 程序。如果你确定你所有的依赖包都不需要调用 git 命令,则可以忽略安装。
建议安装,windows 64 位系统直接点击 下载。
Git 安装过程也没有什么特别的,为了好用一点,只需要关注下下图的两个选项。其他默认,一路 Next。
Git 在线学习资料请访问廖雪峰的日志。点这里。
Git 代理环境设置
git 在代理环境下默认无法,访问代理环境。
Administrator@WIN-K1DN823VN5N MINGW64 /c/workspace
$ git clone https://github.com/jquery/jquery.git
Cloning into 'jquery'...
fatal: unable to access 'https://github.com/jquery/jquery.git/': Couldn't resolve host 'github.com'
在 shell/cmd 命令行中设置 git 代理的格式如下:
git config --global http.proxy ip:port
则在 C:\Users\Administrator
目录下生成配置文件 .gitconfig
,故,这是第二种设置代理方式。配置文件中新增了下面两行,其他请类推:
[http]
proxy = 192.190.10.101:3128
npm 代理环境设置
npm获取配置有6种方式,优先级由高到底。
- 命令行参数。
--proxy http://server:port
即将 proxy 的值设为http://server:port
。 - 环境变量。 以
npm_config_
为前缀的环境变量将会被认为是 npm 的配置属性。如设置 proxy 可以加入这样的环境变量npm_config_proxy=http://server:port
。 - 用户配置文件。可以通过
npm config get userconfig
查看文件路径。如果是 mac 系统的话默认路径就是$HOME/.npmrc
。 - 全局配置文件。可以通过
npm config get globalconfig
查看文件路径。mac 系统的默认路径是/usr/local/etc/npmrc
。 - 内置配置文件。安装 npm 的目录下的 npmrc 文件。
- 默认配置。 npm 本身有默认配置参数,如果以上5条都没设置,则 npm 会使用默认配置参数。
为npm设置代理
$ npm config set proxy http://server:port
$ npm config set https-proxy http://server:port
如果代理需要认证的话可以这样来设置。
$ npm config set proxy http://username:password@server:port
$ npm config set https-proxy http://username:pawword@server:port
如果代理不支持https的话需要修改npm存放package的网站地址。
$ npm config set registry "http://registry.npmjs.org/"
Node 包管理器 npm 介绍
Node包管理器(npm: Node Package Manager)。
npm 包含三部分:一个用来存放第三方包的代码库,一个管理本地已经安装包的机制,一个用来定义包依赖关系的标准。npm 提供了一个公共的注册服 务,它包含了大家发布的所有包,并提供了一个命令行工具,用来下载,安装和管理这些包。你可以按照 Node 的包格式标准来制定你的包或者应用需要依赖的其 他第三方包。
虽然不用了解NPM就可以开始使用 Node,但是如果要用第三方包你就必须要学习它了,因为 Node 本身只提供了一些低层的 API,使用第三方模块 可以大幅减少开发复杂度,不用什么都得亲自编码。npm 允许你在一个沙箱里下载和使用模块,你可以尽情地试验你感兴趣的东西,而不用担心污染全局的包环境。
npm 和 Node 以前需要独立安装,从 0.6.0 版本以后,npm 已经包含在了Node安装包里。
NPM模块的全局和本地模式
npm 的操作主要有两种模式:全局
和本地
。这两种模式会影响包存放的目录结构,以及 Node 加载包时的顺序。
本地模式是 npm 的默认操作模式,在这个模式下,npm 只工作在工作目录下,不会造成系统范围的修改,这个模式让你在某个 Node 程序下尽情地安装,测试模块,而不会影响你电脑上的其他 Node 程序。
全局模式适合那些将被很多程序使用,而且总是被全局加载的公共模块,比如命令行工具这些公不会被应用程序直接使用的模块。
如果你不知道一个模块该用哪个模式安装,那就应该使用本地模式。如果一个模块的作者需要某个模块被全局的安装,通常他会在安装说明里指出。
全局模式
举例子,如果你安装 Node 时使用的默认目录,在全局模式下面,npm 会把包安装到 /usr/local/lib/node_modules
。如果你执行下面的命令,npm 会搜索并下载名为 sax 的最新版并安装到 /usr/local/lib/node_modules/sax 目录下。
$ npm install –g sax
注意:如果你当前 shell 用户没有足够的权限,你需要使用 root 用户登录或者使用 sudo 来执行命令:
$ sudo npm install –g sax
随后在你的 Node 脚本里需要 sax 模块的时候,使用下面的语句来加载:
var sax = require('sax');
如果你没有在应用程序目录下用本地模式安装过 sax,Node 将会在前面的安装目录里查找名为 sax 的模块,否则会优先加载本地版本。
默认模式是本地模式,因此你需要在 npm 命令后加上 -g
标记来启用全局模式。
本地模式
本地模式是 Node 包依赖机制的默认推荐模式,这个模式下,npm 安装的所有东西都在当前工作目录(根目录也不例外),而不会影响任何全局的设置。 这种机制可以让你一个个的设置应用程序的依赖模块以及它们的版本,而不用担心会污染全局的模块空间。这意味着你可以有依赖同一个模块不同版本的两个应用, 它们却不会产生冲突。
在这个模式下,npm 使用当前工作目录下的 node_modules
目录来存放模块,比如你当前工作目录是 /home/user/apps/my_app
,npm 将会用 /home/user/apps/my_app/node_modules
来存放所有本地模块。这意味着,如果你在代码里使用模块名来引用模块,Node 首先会到这个本地的 node_modules 目录下查找,如果没找到才会去搜索全局的 node_modules 目录,本地模块优先级总是高于全局模块。
安装模块
使用下面命令来安装一个模块的最新版本:
$ npm install <package name>
例如,下载和安装名一个名为 jquery 的模块的最新版本,你首先需要把你应用程序的根目录设置为当前目录,然后输入:
$ npm install jquery
这个操作,会在当前目录下建立 node_modules
子目录(如果不存在的话),然后在下面安装 jqeury 模块。
你也可以通过下面的命令,来选择安装某个特定的版本:
$ npm install <package name>@<version spec>
使用指定的版本号替换命令里的占位符即可,比如,要下载 jquery 模块的 1.11.0 版本,你只用运行:
$ npm install jquery@1.11.0
或者,安装版本号小于 1.11.0 的最新版:
$ npm install jquery@”<1.11.0”
甚至可以指定一个版本范围:
$ npm install jquery@">=1.7.0 <1.11.0"
卸载模块
使用下面命令可以卸载一个本地模块:
$ npm uninstall <package name>
如果要卸载的是一个全局模块,加上 -g
标记即可:
$ npm uninstall -g <package name>
更新本地模块
$ npm update <package name>
这个命令会尝试获取最新版的模块包并更新本地版本,如果本地没有安装,则会安装它,如果需要更新的是全局环境,需要加上 -g
标记:
$ npm update –g <package name>
依赖关系
npm 不仅安装你需要的模块包,而且会安装这些模块所依赖的其它模块,比如,如果你需要安装模块 A
,而 A
又依赖模块 B
和 C
,那么在你安装 A
的时候 B
和 C
同时会被安装到 ./node_modules/A/node_modules
目录下。
例如,你用下面的命令本地安装了一个叫 nano
的模块:
$npm install nano
npm 的输出会类似这样:
这告诉你 nano 模块依赖 underscore 和 request 两个模块,并且还指出了安装的版本。如果你现在去查看 ./node_modules/nano/node_modules 目录,你会发现这两个模块已经被安装了:
$ ls node_modules/nano/node_modules
request underscore
重要的 package.json 文件
当开始编写一个应用程序时,可以在应用程序根目录创建一个 package.json
文件来定义应用程序的元数据,比如应用的名字,作者,代码库地址,联系方式等等。程序依赖的外部模块也在这个文件里指定。
如果不打算把程序发布到 npm 上,就可以不用建这个文件,不过即使你的程序是私有的,这个文件其实也有用,它可以告诉 npm 这个应用程序的依赖关系。比如你把项目源码从开发环境复制到生产环境,可以通过调用 npm install
来一次性安装所有依赖包,npm 会通过 package.json
内指定的依赖关系来自动完成依赖模块的下载安装,不用自己一个个去操作。
package.json
是一个 JSON 格式的文件,包含了一系列属性,但是如果仅仅是为了说明程序的依赖关系,则只用一个 dependencies
属性就行。比如,一个叫 MyApp
的应用程序依赖 sax,nano 和 request 模块,只需要建立这样一个 package.json:
{
"name" : "MyApp",
"version" : "1.0.0",
"dependencies" : {
"sax" : "0.3.x",
"nano" : "*",
"request" : ">0.2.0"
}
}
你指定了 MyApp 应用,依赖 0.3 版本的 sax,任意版本的 nano,以及版本高于 0.2.0 的 request 模块。
注意:你可能发现,如果你指定了 name 和 version 字段,npm 会不工作,这只会发生在旧版本的 npm,因为最初 npm 是针对公共模块使用的,而不是私有程序。
然后,在应用程序的根目录,执行:
$ npm install
这样,npm 就会分析依赖关系以及你本地的 node_modules
目录,并自动的下载和安装缺失的模块。
你也可以通过下面的命令把所有本地模块更新到符合你定义的依赖项设置的最新版本:
$npm update
package.json 配置项解释
- name
在 package.json 中最重要的就是 name
和 version
字段。他们都是必须的,如果没有就无法 install;
想好名字之前可以先去 npm registry 查看一下这个名字是否已经被使用了,http://registry.npmjs.org/。
- version
version 必须能被 node-semver 解析,它被包在 npm 的依赖中;
name 和 version 一起组成的标识在假设中是唯一的。改变包应该同时改变version。
- private
如果你设置 "private": true
,npm 就不会发布它;
这是一个防止意外发布私有库的方式。如果你要确定给定的包是只发布在特定 registry(如内部 registry )的,用 publishConfighash 的描述来重写 registry 的 publish-time 配置参数。
- scripts
“scripts” 是一个由脚本命令组成的 hash 对象,他们在包不同的生命周期中被执行。key 是生命周期事件,value 是要运行的命令。
- dependencies
依赖是给一组包名指定版本范围的一个 hash。这个版本范围是一个由一个或多个空格分隔的字符串。依赖还可以用 tarball 或者 git URL。
以上五项仅仅是 Express4 package.json 使用的,其他细节可参考文档,传送门https://www.npmjs.org/doc/files/package.json.html。
dependencies 和 devDependencies
简单地说,dependencies
是正式依赖的文件,devDependencies
是开发环境下测试使用的包,并不随发布而被包含,类似于 maven 中的 test scope。
在 package.json 所在文件夹内执行 npm install jquery --save
将把最新版本的 jquery 依赖信息添加到 dependencies
下,执行 npm install jquery --save-dev
将把他添加到 devDependencies
下。
依赖包版本信息配置详解
比如在 dependencies
或 devDependencies
下,有这么一段配置,
"dependencies": {
"cluster": ">= 0.7.7",
"commander": "^2.6.0",
"async" : "*"
}
版本号前的符号是什么意思,他们具体的区别如下:
第一种: "cluster": ">= 0.7.7"
貌似通过字面意思你应该懂得, cluster 版本必须大于等于 0.7.7。npm 安装的时候你也可以这样指定:
npm install cluster@">=0.7.7"
甚至你可以把版本范围指定到更小,让安装的版本大于0.7.7并且小于 0.8.0。
npm install cluster@">=0.7.7<0.8.0"
第二种:"commander": "^2.6.0"
上面我们提到过默认通过包名称安装,写入 package.json
里的版本控制前面就加了 ^
(上尖号)。
^
符号表示,可以接受小版本和补丁版本的变化。什么意思?简单说就是大版本不变即可,其他版本随便更新。
当我们 npm install 的时候,安装到 node_modules 目录下的 commander 开源包可能是 2.6.0 或 2.7.3 或 2.8.9 ……只要前面 2 不变即可。
这种版本限制先对宽松,还是少用为妙。
如果你确定代码已经健壮,api已经非常稳定,而且开发者确实对兼容性做的很好,关键开发者还符合版本规范,这样控制版本也可行。
第三种:"async" : "*"
没有版本限制,最好忽略,不要使用这一项。凡是有规矩,才成方圆。
举个栗子
一个相对比较完整的 package.json 文件如下。
{
"name": "angular2-demo",
"version": "1.0.0",
"scripts": {
"tsc": "tsc",
"tsc:w": "tsc -w",
"lite": "lite-server",
"start": "concurrent \"npm run tsc:w\" \"npm run lite\" "
},
"license": "ISC",
"dependencies": {
"angular2": "2.0.0-beta.0",
"bootstrap": "^3.3.6",
"es6-promise": "^3.0.2",
"es6-shim": "^0.33.3",
"reflect-metadata": "0.1.2",
"rxjs": "5.0.0-beta.0",
"systemjs": "0.19.6",
"zone.js": "0.5.10"
},
"devDependencies": {
"concurrently": "^1.0.0",
"lite-server": "^1.3.1",
"typescript": "^1.7.3"
}
}
【完】谢谢阅读。