Nodejs----简介

1.概述:

      Node.js是基于Chrome JavaScript运行时建立的一个平台,实际上它是对Google Chrome V8引擎进行了封装,它主要用于创建快速的、可扩展的网络应用。Node.js采用事件驱动和非阻塞I/O模型,使其变得轻微和高效,非常适合构建运行在分布式设备的数据密集型实时应用。

      运行于浏览器的Javascript,浏览器就是Javascript代码的解析器,而Node.js则是服务器端JS的代码解析器,存于服务器端的JS代码由Node.js来解析和应用。

      JS解析器只是JS代码运行的一种环境,浏览器是JS运行的一种环境,浏览器为JS提供了操作DOM对象和window对象等接口。Node.js也是JS的一种运行环境,node.js为JS提供操作文件、创建http服务、创建TCP、UDP服务等接口,所以Node.js可以完成其他后台语言能完成的工作。

2.交互式运行环境:PEPL

      Node.js提供了一个交互式运行环境,通过这个环境,可以立即执行JS代码,使用方法类似于Chrome浏览器中Firebug插件中的Console。

      在Linux环境进入终端后,属于"node"或者“nodejs”进入Node.js的交互式运行环境,Ctrl+d可以退出此环境。

      查看系统中安装的Node.js版本:node -v or nodejs -v

      运行JS文件,eg:node file.js or nodejs file.js

3.Node.js模块和包

      a.模块

         Node.js官方提供了很多模块,这些模块分别实现了一种功能,如操作文件模块fs,构建http服务模块的http等,每个模块都是一个JS文件,当然也可以自己编   写模块。

      2.包

          包可以将多个具有依赖关系的模块组织在一起,封装多个模块,以方便管理。Node.js采用了CommonJS规范,根据CommonJS规范规定,一个JS文件就是 一个模块,而包是一个文件夹,包内必须包含一个JSON文件,命名package.json。一般情况下,包内bin文件夹存放二进制文件,包内的lib文件夹存放JS文件,包内的doc文件夹存放文档,包内的test文件夹存放单元测试。package.json文件中需要包含的字段及包的使用。

      3.npm包管理工具

         npm是node.js的包管理工具,npm定义了包依赖关系标准,我们使用npm主要用来下载第三方包和管理本地下载的第三方包。

4:总结

一:什么是nodejs:
	什么是 NodeJS
	JS是脚本语言,脚本语言都需要一个解析器才能运行。对于写在 HTML 页面里的 JS,浏览器充当了解析器的角色。而对于需要独立运行的 JS,NodeJS 就是一个解析器。
	每一种解析器都是一个运行环境,不但允许JS定义各种数据结构,进行各种计算,还允许 JS 使用运行环境提供的内置对象和方法做一些事情。例如运行在浏览器中的JS的用途是操作 DOM,浏览器就提供了 document 之类的内置对象。而运行在 NodeJS 中的 JS 的用途是操作磁盘文件或搭建 HTTP 服务器,NodeJS 就相应提供了 fs、http 等内置对象。---------------------------------------------------------------------------------------------nodejs是一个解释器,是运行在服务端的js.

二:Nodejs用途:--------------------------------------------------------------------------------------------实现高性能web服务器,看重的是事件机制和异步IO.
	用途
		尽管存在一听说可以直接运行 JS 文件就觉得很酷的同学,但大多数同学在接触新东西时首先关心的是有啥用处,以及能带来啥价值。
		NodeJS 的作者说,他创造 NodeJS 的目的是为了实现高性能 Web 服务器,他首先看重的是事件机制和异步 IO 模型的优越性,而不是 JS。但是他需要选择一种编程语言实现他的想法,这种编程语言不能自带 IO 功能,并且需要能良好支持事件机制。JS 没有自带 IO 功能,天生就用于处理浏览器中的 DOM 事件,并且拥有一大群程序员,因此就成为了天然的选择。
		如他所愿,NodeJS 在服务端活跃起来,出现了大批基于 NodeJS 的 Web 服务。而另一方面,NodeJS 让前端众如获神器,终于可以让自己的能力覆盖范围跳出浏览器窗口,更大批的前端工具如雨后春笋。
		因此,对于前端而言,虽然不是人人都要拿 NodeJS 写一个服务器程序,但简单可至使用命令交互模式调试 JS 代码片段,复杂可至编写工具提升工作效率。

三:安装nodejs:---------------------------------------------------------------------------------------------官网下载,安装
	1:windous安装:
		32 位安装包下载地址 : https://nodejs.org/dist/v4.4.3/node-v4.4.3-x86.msi
		64 位安装包下载地址 : https://nodejs.org/dist/v4.4.3/node-v4.4.3-x64.msi
		安装步
			1:点点点。
			2:检测PATH环境变量是否配置了Node.js,点击开始=》运行=》输入"cmd" => 输入命令"path",输出如下结果:
			(也可以自己手动配置环境变量)
			3:查看版本node --version

	2:Windows 二进制文件 (.exe)安装:
		32 位安装包下载地址 : http://nodejs.org/dist/v0.10.26/node.exe
		64 位安装包下载地址 : http://nodejs.org/dist/v0.10.26/x64/node.exe
		安装步骤
			1: 双击下载的安装包 Node.exe
			2:点击 Run(运行)按钮将出现命令行窗口:
			3:版本测试
				cd downlocad
				node --version

	3:Ubuntu 上安装 Node.js
		Node.js 源码安装:
			1:在 Github 上获取 Node.js 源码:
				$ sudo git clone https://github.com/nodejs/node.git
				Cloning into 'node'...
			2:修改目录权限:
				$ sudo chmod -R 755 node
			3:使用 ./configure 创建编译文件,并按照:
				$ cd node
				$ sudo ./configure
				$ sudo make
				$ sudo make install
			4:查看 node 版本:
				$ node --version
				v0.10.25
		Ubuntu apt-get命令安装
			命令格式如下:
				sudo apt-get install nodejs
				sudo apt-get install npm

	4:CentOS 下安装 Node.js
		1:下载源码,你需要在https://nodejs.org/en/download/下载最新的Nodejs版本,本文以v0.10.24为例:
			cd /usr/local/src/
			wget http://nodejs.org/dist/v0.10.24/node-v0.10.24.tar.gz
		2:解压源码
			tar zxvf node-v0.10.24.tar.gz
		3: 编译安装
			cd node-v0.10.24
			./configure --prefix=/usr/local/node/0.10.24
			make
			make install
		4:配置NODE_HOME,进入profile编辑环境变量
			vim /etc/profile
			设置nodejs环境变量,在 export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL 一行的上面添加如下内容:
			#set for nodejs
			export NODE_HOME=/usr/local/node/0.10.24
			export PATH=$NODE_HOME/bin:$PATH
		5::wq保存并退出,编译/etc/profile 使配置生效
			source /etc/profile
		6:验证是否安装配置成功
			node -v
		7:输出 v0.10.24 表示配置成功
			npm模块安装路径
				/usr/local/node/0.10.24/lib/node_modules/
				注:Nodejs 官网提供了编译好的Linux二进制包,你也可以下载下来直接应用。

四:在 Cloud Studio 中运行 node.js 程序:
	Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台。基于 Google 的 V8 引擎,使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。前端程序员在不懂 PHPRubyPython 这样的动态编程语言时完全可以基于 Node.js 使用自己熟悉的JS语言来搭建一个高效的 Web 服务。通过 Cloud Studio 平台,我们可以快速开始自己的 Node.js 项目,并且可以实时访问他。
	Cloud Studio 已经为我提供了内置的 Node.js 开发环境,我们不仅可以通过切换运行环境来编写 Node.js 代码,也可以通过 访问链接 功能来实时查看代码的运行效果,下面我通过一个例子来展示:
		step1:访问Cloud Studio(https://studio.coding.net),注册/登录账户。
		step2:在右侧的运行环境菜单选择:"Node.js" 运行环境
		step3:在左侧代码目录中新建Node.js代码目录编写你的 Node.js 代码
		step4:进入 Node.js 代码目录运行 node hello.js 我们在代码中引入了 http 模块,并且通过http.createServer()方法创建了一个 http 服务器,通过listen() 方法绑定了 8888 端口
		step5:点击最右侧的【访问链接】选项卡,在访问链接面板中填写端口号为:8888,点击创建链接,即可点击生成的链接访问我们的 Node.js 项目
	/*代码示例*/:
		var http = require('http');
		http.createServer(function (request, response) {

		    // 发送 HTTP 头部 
		    // HTTP 状态值: 200 : OK
		    // 内容类型: text/plain
		    response.writeHead(200, {'Content-Type': 'text/plain'});

		    // 发送响应数据 "Hello World"
		    response.end("Hello, Universe! I'm running on Cloud Studio!
");
		}).listen(8888);

	// 终端打印如下信息
		console.log('Server running at http://127.0.0.1:8888/');
		Tips: 从终端中输入命令可以看出 Cloud Studio 为我们集成了 Ubuntu16.04.1 + node8.10.0 的开发环境:

五:Node.js 创建第一个应用:
	如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi。
	从这个角度看,整个"接收 HTTP 请求并提供 Web 页面"的需求根本不需 要 PHP 来处理。
	不过对 Node.js 来说,概念完全不一样了。使用 Node.js 时,我们不仅仅 在实现一个应用,同时还实现了整个 HTTP 服务器。事实上,我们的 Web 应用以及对应的 Web 服务器基本上是一样的。

	在我们创建 Node.js 第一个 "Hello, World!" 应用前,让我们先了解下 Node.js 应用是由哪几部分组成的:
		1:引入 required 模块:我们可以使用 require 指令来载入 Node.js 模块。
		2:创建服务器:服务器可以监听客户端的请求,类似于 Apache 、Nginx 等 HTTP 服务器。
		3:接收请求与响应请求 服务器很容易创建,客户端可以使用浏览器或终端发送 HTTP 请求,服务器接收请求后返回响应数据。:
	创建 Node.js 应用
		步骤一、引入 required 模块
			我们使用 require 指令来载入 http 模块,并将实例化的 HTTP 赋值给变量 http,
			实例如下:
				var http = require("http");
		步骤二、创建服务器
			接下来我们使用 http.createServer() 方法创建服务器,并使用 listen 方法绑定 8888 端口。 函数通过 request, response 参数来接收和响应数据。

			实例如下,在你项目的根目录下创建一个叫 server.js 的文件,并写入以下代码:
				var http = require('http');
				http.createServer(function (request, response) {
				    // 发送 HTTP 头部 
				    // HTTP 状态值: 200 : OK
				    // 内容类型: text/plain
				    response.writeHead(200, {'Content-Type': 'text/plain'});
				    // 发送响应数据 "Hello World"
				    response.end('Hello World
');
				}).listen(8888);

			// 终端打印如下信息
			console.log('Server running at http://127.0.0.1:8888/');
			以上代码我们完成了一个可以工作的 HTTP 服务器。
		步骤三:使用 node 命令执行以上的代码:
			node server.js
			Server running at http://127.0.0.1:8888/
			cmdrun

		接下来,打开浏览器访问 http://127.0.0.1:8888/,你会看到一个写着 "Hello World"的网页。

	分析Node.js 的 HTTP 服务器:
		第一行请求(require)Node.js 自带的 http 模块,并且把它赋值给 http 变量。
		接下来我们调用 http 模块提供的函数: createServer 。这个函数会返回 一个对象,这个对象有一个叫做 listen 的方法,这个方法有一个数值参数, 指定这个 HTTP 服务器监听的端口号。

六:NPM 使用介绍--------------------------------------------------------------------------------------------包管理工具
	NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:
	允许用户从NPM服务器下载别人编写的第三方包到本地使用。
	允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
	允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。

	1:由于新版的nodejs已经集成了npm,所以之前npm也一并安装好了。测试是否成功安装----------------------------npm -v
		$ npm -v
		2.3.0
	2: 如果你安装的是旧版本的 npm,可以很容易得通过 npm 命令来升级-----------------------------------------$ sudo npm install npm -g
		/usr/local/bin/npm -> /usr/local/lib/node_modules/npm/bin/npm-cli.js
		npm@2.14.2 /usr/local/lib/node_modules/npm

	3:如果是 Window 系统使用以下命令即可:---------------------------------------------------------------npm install npm -g

	4:使用淘宝镜像的命令:------------------------------------------------------------------------------cnpm install npm -g

	使用 npm 命令安装模块:
		npm 安装 Node.js 模块语法格式-------------------------------------------------------------------npm install <Module Name>

	express安装:---------------------------------------------------------------------------------------npm install express
		安装好之后,express 包就放在了工程目录下的 node_modules 目录中,因此在代码中只需要通过 require('express') 的方式就好,无需指定第三方包路径。
			var express = require('express');

	全局安装:-----------------------------------------------------------------------------------------npm install express -g
		1. 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。
		2. 可以通过 require() 来引入本地安装的包。

	本地安装:-----------------------------------------------------------------------------------------npm install express
		1. 将安装包放在 /usr/local 下或者你 node 的安装目录。
		2. 可以直接在命令行里使用。
		npm 的包安装分为本地安装(local)、全局安装(global)两种,从敲的命令行来看,差别只是有没有-g而已
		如果出现以下错误:
			npm err! Error: connect ECONNREFUSED 127.0.0.1:8087 
		解决办法为:
			$ npm config set proxy null
	如果你希望具备两者功能,则需要在两个地方安装它或使用----------------------------------------------------npm link。

	接下来我们使用全局方式安装 express:------------------------------------------------------------------npm install express -g
		安装过程输出如下内容,第一行输出了模块的版本号及安装位置。
			express@4.13.3 node_modules/express
			├── escape-html@1.0.2
			├── range-parser@1.0.2
			├── merge-descriptors@1.0.0
			├── array-flatten@1.1.1
			├── cookie@0.1.3
			├── utils-merge@1.0.0
			├── parseurl@1.3.0
			├── cookie-signature@1.0.6
			├── methods@1.1.1
			├── fresh@0.3.0
			├── vary@1.0.1
			├── path-to-regexp@0.1.7
			├── content-type@1.0.1
			├── etag@1.7.0
			├── serve-static@1.10.0
			├── content-disposition@0.5.0
			├── depd@1.0.1
			├── qs@4.0.0
			├── finalhandler@0.4.0 (unpipe@1.0.0)
			├── on-finished@2.3.0 (ee-first@1.1.1)
			├── proxy-addr@1.0.8 (forwarded@0.1.0, ipaddr.js@1.0.1)
			├── debug@2.2.0 (ms@0.7.1)
			├── type-is@1.6.8 (media-typer@0.3.0, mime-types@2.1.6)
			├── accepts@1.2.12 (negotiator@0.5.3, mime-types@2.1.6)
			└── send@0.13.0 (destroy@1.0.3, statuses@1.2.1, ms@0.7.1, mime@1.3.4, http-errors@1.3.1)
	查看安装信息----------------------------------------------------------------------------------------npm list -g
		├─┬ cnpm@4.3.2
		│ ├── auto-correct@1.0.0
		│ ├── bagpipe@0.3.5
		│ ├── colors@1.1.2
		│ ├─┬ commander@2.9.0
		│ │ └── graceful-readlink@1.0.1
		│ ├─┬ cross-spawn@0.2.9
		│ │ └── lru-cache@2.7.3
		……

	如果要查看某个模块的版本号,可以使用命令如下:----------------------------------------------------------npm list grunt
		projectName@projectVersion /path/to/project/folder
		└── grunt@0.4.1

	使用 package.json
		package.json 位于模块的目录下,用于定义包的属性。接下来让我们来看下 express 包的 package.json 文件,位于 node_modules/express/package.json 内容:	
			Package.json 属性说明
			name - 包名。

			version - 包的版本号。

			description - 包的描述。

			homepage - 包的官网 url 。

			author - 包的作者姓名。

			contributors - 包的其他贡献者姓名。

			dependencies - 依赖包列表。如果依赖包没有安装,npm 会自动将依赖包安装在 node_module 目录下。

			repository - 包代码存放的地方的类型,可以是 git 或 svn,git 可在 Github 上。

			main - main 字段指定了程序的主入口文件,require('moduleName') 就会加载这个文件。这个字段的默认值是模块根目录下面的 index.js。

			keywords - 关键字

	卸载模块--------------------------------------------------------------------------------------------npm uninstall express
		卸载后,你可以到 /node_modules/ 目录下查看包是否还存在,或者使用以下命令查看:-----------------------npm ls

	更新模块--------------------------------------------------------------------------------------------npm update express

	搜索模块--------------------------------------------------------------------------------------------npm search express

	创建模块package.json 文件是必不可少的。我们可以使用 NPM 生成 package.json 文件--------------------------npm init
		This utility will walk you through creating a package.json file.
		It only covers the most common items, and tries to guess sensible defaults.

		See `npm help json` for definitive documentation on these fields
		and exactly what they do.

		Use `npm install <pkg> --save` afterwards to install a package and
		save it as a dependency in the package.json file.

		Press ^C at any time to quit.
		name: (node_modules) runoob                   # 模块名
		version: (1.0.0) 
		description: Node.js 测试模块(www.runoob.com)  # 描述
		entry point: (index.js) 
		test command: make test
		git repository: https://github.com/runoob/runoob.git  # Github 地址
		keywords: 
		author: 
		license: (ISC) 
		About to write to ……/node_modules/package.json:      # 生成地址

		{
		  "name": "runoob",
		  "version": "1.0.0",
		  "description": "Node.js 测试模块(www.runoob.com)",
		  ……
		}
		Is this ok? (yes) yes
		以上的信息,你需要根据你自己的情况输入。在最后输入 "yes" 后会生成 package.json 文件。

	接下来我们可以使用以下命令在 npm 资源库中注册用户(使用邮箱注册):--------------------------------------npm adduser
		Username: mcmohd
		Password:
		Email: (this IS public) mcmohd@gmail.com
	接下来我们就用以下命令来发布模块:--------------------------------------------------------------------npm publish


	版本号:
		使用NPM下载和发布代码时都会接触到版本号。NPM使用语义版本号来管理代码,这里简单介绍一下。
		语义版本号分为X.Y.Z三位,分别代表主版本号、次版本号和补丁版本号。当代码变更时,版本号按以下原则更新。
		如果只是修复bug,需要更新Z位。
		如果是新增了功能,但是向下兼容,需要更新Y位。
		如果有大变动,向下不兼容,需要更新X位。
		版本号有了这个保证后,在申明第三方包依赖时,除了可依赖于一个固定版本号外,还可依赖于某个范围的版本号。例如"argv": "0.0.x"表示依赖于0.0.x系列的最新版argv。

	NPM支持的所有版本号范围指定方式可以查看官方文档。

	NPM 常用命令
		除了本章介绍的部分外,NPM还提供了很多功能,package.json里也有很多其它有用的字段。

		除了可以在npmjs.org/doc/查看官方文档外,这里再介绍一些NPM常用命令。

		NPM提供了很多命令,例如install和publish,使用npm help可查看所有命令。

		NPM提供了很多命令,例如install和publish,使用npm help可查看所有命令。

		使用npm help <command>可查看某条命令的详细帮助,例如npm help install。

		在package.json所在目录下使用npm install . -g可先在本地安装当前命令行程序,可用于发布前的本地测试。

		使用npm update <package>可以把当前目录下node_modules子目录里边的对应模块更新至最新版本。

		使用npm update <package> -g可以把全局安装的对应命令行程序更新至最新版。

		使用npm cache clear可以清空NPM本地缓存,用于对付使用相同版本号发布新版本代码的人。

		使用npm unpublish <package>@<version>可以撤销发布自己发布过的某个版本代码。

		使用淘宝 NPM 镜像
		大家都知道国内直接使用 npm 的官方镜像是非常慢的,这里推荐使用淘宝 NPM 镜像。

		淘宝 NPM 镜像是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步。

		你可以使用淘宝定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm:

		$ npm install -g cnpm --registry=https://registry.npm.taobao.org
		这样就可以使用 cnpm 命令来安装模块了:
		$ cnpm install [name]
		更多信息可以查阅:http://npm.taobao.org/。

七:Node.js REPL(交互式解释器)------------------------------------------------------------------------------终端
	Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电脑的环境,类似 Window 系统的终端或 Unix/Linux shell,我们可以在终端中输入命令,并接收系统的响应。

	Node 自带了交互式解释器,可以执行以下任务:
		读取 - 读取用户输入,解析输入了Javascript 数据结构并存储在内存中。
		执行 - 执行输入的数据结构
		打印 - 输出结果
		循环 - 循环操作以上步骤直到用户两次按下 ctrl-c 按钮退出。
		Node 的交互式解释器可以很好的调试 Javascript 代码。

	REPL:
		启动 Node 的终端:-----------------------------------------------------------node
			简单的表达式运算接下来让我们在 Node.js REPL 的命令行窗口中执行简单的数学运算:
			$ node
			> 1 +4
			5
			> 5 / 2
			2.5
			> 3 * 6
			18
			> 4 - 1
			3
			> 1 + ( 2 * 3 ) - 4
			3
			>

		使用变量
			你可以将数据存储在变量中,并在你需要的时候使用它。变量声明需要使用 var 关键字,如果没有使用 var 关键字变量会直接打印出来。
			使用 var 关键字的变量可以使用 console.log() 来输出变量。
				$ node
				> x = 10
				10
				> var y = 10
				undefined
				> x + y
				20
				> console.log("Hello World")
				Hello World
				undefined
				> console.log("www.runoob.com")
				www.runoob.com
				undefined

		多行表达式
			Node REPL 支持输入多行表达式,这就有点类似 JavaScript。接下来让我们来执行一个 do-while 循环:
			$ node
			> var x = 0
			undefined
			> do {
			... x++;
			... console.log("x: " + x);
			... } while ( x < 5 );
			x: 1
			x: 2
			x: 3
			x: 4
			x: 5
			undefined
			>
			... 三个点的符号是系统自动生成的,你回车换行后即可。Node 会自动检测是否为连续的表达式。

		下划线(_)变量:
			你可以使用下划线(_)获取上一个表达式的运算结果:
			$ node
			> var x = 10
			undefined
			> var y = 20
			undefined
			> x + y
			30
			> var sum = _
			undefined
			> console.log(sum)
			30
			undefined
			>
			REPL 命令
			ctrl + c - 退出当前终端。

			ctrl + c 按下两次 - 退出 Node REPL。

			ctrl + d - 退出 Node REPL.

			向上/向下 键 - 查看输入的历史命令

			tab 键 - 列出当前命令

			.help - 列出使用命令

			.break - 退出多行表达式

			.clear - 退出多行表达式

			.save filename - 保存当前的 Node REPL 会话到指定文件

			.load filename - 载入当前 Node REPL 会话的文件内容。

		停止 REPL---------------------------------------------------------------------ctrl + c 

八:运行
	打开终端,键入 node 进入命令交互模式,可以输入一条代码语句后立即执行并显示结果,例如:
		$ node
		> console.log('Hello World!');
		Hello World!

	如果要运行一大段代码的话,可以先写一个JS文件再运行。例如有以下 hello.js。
		function hello() {
		    console.log('Hello World!');
		}
		hello();
	写好后在终端下键入 node hello.js 运行,结果如下:
		$ node hello.js
		Hello World!

	权限问题:
		在 Linux 系统下,使用 NodeJS 监听 80 或 443 端口提供 HTTP(S)服务时需要 root 权限,有两种方式可以做到。
		一种方式是使用 sudo 命令运行 NodeJS。例如通过以下命令运行的 server.js 中有权限使用 80 和 443 端口。一般推荐这种方式,可以保证仅为有需要的 JS 脚本提供 root 权限。
			$ sudo node server.js
		另一种方式是使用 chmod +s 命令让 NodeJS 总是以 root 权限运行,具体做法如下。因为这种方式让任何JS脚本都有了 root 权限,不太安全,因此在需要很考虑安全的系统下不推荐使用。
			$ sudo chown root /usr/local/bin/node
			$ sudo chmod +s /usr/local/bin/node

九:模块
	编写稍大一点的程序时一般都会将代码模块化。在 NodeJS 中,一般将代码合理拆分到不同的 JS 文件中,每一个文件就是一个模块,而文件路径就是模块名。
	在编写每个模块时,都有 require、exports、module 三个预先定义好的变量可供使用。

	1:require:--------------------用于在当前模块中加载和使用别的模块:传入一个模块名,返回一个模块导出对象。模块名可使用相对路径(以./开头),或者是绝对路径(以/或C:之类的盘符开头)。模块名中的.js扩展名可以省略。
		例:
			var foo1 = require('./foo');
			var foo2 = require('./foo.js');
			var foo3 = require('/home/user/foo');
			var foo4 = require('/home/user/foo.js');
			// foo1 至 foo4 中保存的是同一个模块的导出对象。另外,可以使用以下方式加载和使用一个 JSON 文件。
			
			var data = require('./data.json');
	
	2:exports:---------------------对象是当前模块的导入对象:用于导入模块的公有方法和属性别的模块通过 require 函数使用当前模块时得到的就是当前模块的 exports 对象。
		例:exports.hello = function(){
			console.log('Hello word');
		};

	3:module-------------------------通过对象可以访问到当前模块的一些相关信息:但最多的用途是替换当前模块的导出对象。例如模块导出对象默认是一个普通对象,如果想改成一个函数的话
		使用以下方式。
			module.exports = function () {
			    console.log('Hello World!');
			};
			**以上代码中,模块默认导出对象被替换为一个函数。

		模块初始化:
				一个模块中的JS代码仅在模块第一次被使用时执行一次,并在执行过程中初始化模块的导出对象。之后,缓存起来的导出对象被重复利用。

		主模块
			    通过命令行参数传递给 NodeJS 以启动程序的模块被称为主模块。主模块负责调度组成整个程序的其它模块完成工作。例如通过以下命令启动程序时,main.js 就是主模块。
				$ node main.js

		完整示例:
				例如有以下目录。
				- /home/user/hello/
				    - util/
				        counter.js
				    main.js
				其中 counter.js 内容如下:
				var i = 0;
				function count() {
				    return ++i;
				}
				exports.count = count;
				该模块内部定义了一个私有变量 i,并在 exports 对象导出了一个公有方法 count。
				主模块 main.js 内容如下:

				var counter1 = require('./util/counter');
				var    counter2 = require('./util/counter');
				console.log(counter1.count());
				console.log(counter2.count());
				console.log(counter2.count());
				运行该程序的结果如下:
				$ node main.js
				可以看到,counter.js 并没有因为被 require 了两次而初始化两次。
	

  

原文地址:https://www.cnblogs.com/w-s-l123/p/9417790.html