Node.js入门-通俗易懂版
一、初始Node.js
1.Node.js是什么?
通俗的解释:
Node.js = Javascript + 本地/服务器文件读写删除等功能。
简单的说 Node.js 就是运行在服务端的 JavaScript。执行在浏览器上的时候成为JavaScript,执行在服务器上的时候叫做Node.js。当然写法是有区别的。
JavaScript受限于浏览器沙盒模式,只能运行在浏览器中。而Node.js拓展了JavaScript的功能,使其可以运行在本地/服务器。
它不是后端语言,但是可以用来写后端程序。
特性:
Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。
Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。
2.Node.js的安装
在官方网站下载长效支持版本(LTS)即可。可以使用 node -v 查看安装的node版本。
3.node.js需要借助命令行界面来运行
1)node的控制台模式
在终端中输入 node可以进入node的控制台模式,进入之后命令行(终端)的符号会由$变为>,代表已经进入node的控制台模式。一个小例子:
2)引入外部代码文件
① 如果要在控制台执行某个外部代码文件,比如执行index.js,我们可以用cd命令进入该目录之后输入 node index.js
② 如果把其他的js文件引入到当前的js文件中,代码如下:
var x = require ('./index2') (引入当前目录下的index2.js到当前文件)
control + c 是退出当前程序的组合键,我们可以使用 control + c 来退出node控制台模式。
4.Node.js REPL(交互式解释器)
REPL 命令
-
ctrl + c - 退出当前终端。
-
ctrl + c 按下两次 - 退出 Node REPL。
-
ctrl + d - 退出 Node REPL.
-
向上/向下 键 - 查看输入的历史命令
-
tab 键 - 列出当前命令
-
.help - 列出使用命令
-
.break - 退出多行表达式
-
.clear - 退出多行表达式
-
.save filename - 保存当前的 Node REPL 会话到指定文件
-
.load filename - 载入当前 Node REPL 会话的文件内容。
二、NPM
1.什么是NPM?
NPM的全称是Node Package Manager,是随同NodeJS一起安装的包管理和分发工具。
它可以很方便地让JavaScript开发者下载、安装、上传以及管理已经安装的包。
2.npm的使用
2.1 npm的安装
安装node.js之后,系统会自动安装npm。使用 npm -v 命令可以查看安装的版本号。
2.2 初始化——新建工程项目
命令: npm init
先用 cd 命令进入要操作的文件夹,然后使用 npm init 命令指定让npm控制当前目录。输入并回车之后会出现如下提示:
在这里输入项目的名称、版本号、项目描述等信息,回车则填写括号里面的默认内容。
初始化之后,文件夹中会有一个初始化配置文件package.json。
Package.json 属性说明
-
name - 包名。
-
version - 包的版本号。
-
description - 包的描述。
-
homepage - 包的官网 url 。
-
author - 包的作者姓名。
-
contributors - 包的其他贡献者姓名。
-
dependencies - 依赖包列表。如果依赖包没有安装,npm 会自动将依赖包安装在 node_module 目录下。
-
repository - 包代码存放的地方的类型,可以是 git 或 svn,git 可在 Github 上。
-
main - main 字段是一个模块ID,它是一个指向你程序的主要项目。就是说,如果你包的名字叫 express,然后用户安装它,然后require("express")。
-
keywords - 关键字
2.3 全局安装与本地安装
使用npm我们可以很方便的安装各种包。
比如安装jQuery,可以这样写
npm install jquery --save
如果想制定要安装的版本的jQuery,可以写:
npm install jquery@2 --save npm 会自动安装jQuery2的最高版本。
--save是安装到当前文件夹的意思,如果想安装到全局(全局依赖),可以使用 -g
比如我们要全局安装gulp,可以使用 npm install gulp -g ,这时的安装路径为/usr/local/bin/(以MAC OS为例)
使用-dev可以在配置文件中标注项目依赖了哪些包,写法 --save-dev (开发阶段一般使用这个)
通过-Dev生成的配置文件里面注明了需要安装的包的清单,在多人共同开发时,通过这个配置文件,可以通过命令行(终端)快速安装自己电脑上面没有的包。通过命令行(终端)进入根目录,使用 npm install 命令可以根据dependencies配置安装所有的依赖包。
2.4 使用淘宝 NPM 镜像
大家都知道国内直接使用 npm 的官方镜像是非常慢的,这里推荐使用淘宝 NPM 镜像。
淘宝 NPM 镜像是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟一次以保证尽量与官方服务同步。
在命令行(终端)输入如下代码:
npm install -g cnpm --registry=https://registry.npm.taobao.org
然后就可以通过 cnpm install *** -save 的命令来安装各种包了。
2.5 npm常用命令
http://www.cnblogs.com/PeunZhang/p/5553574.html#npm-update
三、commonJS模块
1、什么是模块:
模块是node.js应用程序的基本组成部分。
每一个js文件都是一个模块。
为了让Node.js文件相互调用而提供的系统称为模块系统。
所有默认自带的模块直接用模块名就可以引用。
2、创建一个应用(认识http模块)
2.1 Node.js 应用由哪几部分组成?
-
引入 required 模块:我们可以使用 require 指令来载入 Node.js 模块。
-
创建服务器:服务器可以监听客户端的请求,类似于 Apache 、Nginx 等 HTTP 服务器。
-
接收请求与响应请求 服务器很容易创建,客户端可以使用浏览器或终端发送 HTTP 请求,服务器接收请求后返回响应数据。
-
2.2 创建Node.js应用的步骤
步骤一、引入 required 模块
我们使用 require 指令来载入 http 模块,并将实例化的 HTTP 赋值给变量 http,实例如下:
var http = require("http");
步骤二、创建服务器
接下来我们使用 http.createServer() 方法创建服务器,并使用 listen 方法绑定 8888 端口。
函数通过 request, response 参数来接收和响应数据。
实例如下,在你项目的根目录下创建一个叫 server.js 的文件,并写入以下代码:
var http = require('http'); var server = http.createServer(function (request, response) {
//这里的参数使用了回调函数,回调函数的执行是不按顺序的,不需要等待文件读取完,在读取文件的同时执行接下来的代码,大大提高了程序的性能 // 发送 HTTP 头部 // HTTP 状态值: 200 : OK // 内容类型: text/plain response.writeHead(200, {'Content-Type': 'text/plain'}); // 发送响应数据 "Hello World" response.end('Hello World\n'); })
server.listen(8888); // 终端打印如下信息 console.log('Server running at http://127.0.0.1:8888/');
(关于Node.js的回调函数更详细的介绍可以看这篇 http://www.runoob.com/nodejs/nodejs-callback.html )
以上代码我们完成了一个可以工作的 HTTP 服务器。
使用 node 命令执行以上的代码:
node server.js Server running at http://127.0.0.1:8888/
接下来,打开浏览器访问 http://127.0.0.1:8888/,你会看到一个写着 "Hello World"的网页。
小结:分析Node.js 的 HTTP 服务器:
-
- 第一行请求(require)Node.js 自带的 http 模块,并且把它赋值给 http 变量。
- 接下来我们调用 http 模块提供的函数: createServer 。这个函数会返回 一个对象,这个对象有一个叫做 listen 的方法,这个方法有一个数值参数, 指定这个 HTTP 服务器监听的端口号。
3. require方法
原生模块与文件模块
原生模块在nodejs安装时便存在,通过require(‘模块名’)引用。
文件模块一般为用户建立—require(‘完整模块路径’)引用。引用了一个外部js文件,即引用了一个模块,也就是创建了一个模块。
4. exports对象
exports 是模块公开的接口。
require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象。
在一个 js 中通过 require('./xxx') 加载这个模块,然后就可以直接访 问 xxx.js 中 exports 对象的成员函数了。
有时候我们只是想把一个对象封装到模块中,格式如下:
module.exports = function() { // ... }
例如:
//hello.js function Hello() { var name; this.setName = function(thyName) { name = thyName; }; this.sayHello = function() { console.log('Hello ' + name); }; }; module.exports = Hello;
这样就可以直接获得这个对象了:
//main.js var Hello = require('./hello'); hello = new Hello(); hello.setName('BYVoid'); hello.sayHello();
模块接口的唯一变化是使用 module.exports = Hello 代替了exports.world = function(){}。
在外部引用该模块时,其接口对象就是要输出的 Hello 对象本身,而不是原先的 exports。
module.exports与exports的不同
- module.exports可以让模块成为特别对象类型
- exports可以让模块成为传统的模块实例
- exports是module.exports的辅助方法
- module.exports.name 相当于 exports.name
5. Node.js中也有全局对象的概念
JavaScript 中有一个特殊的对象,称为全局对象(Global Object),它及其所有属性都可以在程序的任何地方访问,即全局变量。
在浏览器 JavaScript 中,通常 window 是全局对象,window在浏览器环境中可用(在浏览器的控制台中可用),node.js中没有window,所以dom对象在node.js中无效。
而 Node.js 中的全局对象是 global,所有全局变量(除了 global 本身以外)都是 global 对象的属性。在 Node.js 我们可以直接访问到 global 的属性,而不需要在应用中包含它。
5.1 全局对象与全局变量
global 最根本的作用是作为全局变量的宿主。
当你定义一个全局变量时,这个变量同时也会成为全局对象的属性。
注意: 永远使用 var 定义变量以避免引入全局变量,因为全局变量会污染命名空间,提高代码的耦合风险。
5.2 process
process 是一个全局变量,即 global 对象的属性。
process属性
Process 提供了很多有用的属性,便于我们更好的控制系统的交互。
在node控制台模式输入process并回车,可以看到process的所有属性。