目录
一、Node.js 基础
1.Node.js 是什么
- 不是一门语言,不是库,不是框架
- 是一个JavaScript运行时环境,简单点说就是node.js可以解析和执行JavaScript代码
- nodejs使用JavaScript语言编程,运行在JavaScript引擎上(V8)
- node.js为JavaScript提供了许多服务器级别的操作API(http,fs等)
- node.js包含EcmaScript,但是不包含DOM,BOM,编码方法同JavaScript
- node.js是一个基于 Chrome浏览器 V8 引擎的 JavaScript 运行时(环境)
- node可以理解为是nodejs的作者基于Chrome浏览器的V8引擎,使用JavaScript开发的一个平台(环境),所以node可以解析和执行JavaScript代码
- Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台
- Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。
2.Node.js 安装
Node.js 安装教程:Node.js 安装配置 | 菜鸟教程
Node.js 安装注意:
- Node.js 的安装直接前往官网安装即可,根据需求选择版本
- 配置环境变量
- 设置npm安装程序时的默认位置,和缓存位置
npm config set prefix "D:\nodejs\X64\node_global" //默认位置
npm config set cache "D:\nodejs\X64\node_cache" //缓存位置
注:先在相应的位置建立文件node_global和node_cache,再设置
- 设置环境变量NODE_PATH
NODE_PATH = D:\nodejs\X64\node_global\node_modules(很重要,尤其是全局安装node插件时),否则会出现XXX不是内部命令的错误。
3.Node.js 特性
- 单线程
在Java,PHP或者.net语言中,会为每一个客户端连接创建一个新的线程,而每个线程需要耗费大约2MB内存,所以就会 限制同时连接的用户数量。Node.js不为每个客户连接创建一个新的线程,而仅仅使用一个线程,当有用户连接了就触发一 个内部事件,通过非阻塞I/O、事件驱动机制,让Nodejs程序宏观上也是并行的,大大提高用户的连接数量(性能)。
- 非阻塞IO模型(IO指 input output 输入 输出)
当在访问数据库取得数据的时候,需要一段时间,在传统的单线程处理机制中,在执行了访问数据库代码之后,整个线程都 将暂停下来,等待数据库返回结果,才能执行后面的代码,也就是说,I / O阻塞了代码的执行,极大的降低了程序的执行效率,而Nodejs中采用了非阻塞型I / O机制,因此在执行访问数据库的代码之后,将立即转而执行其后面的代码,把数据库返回的结果处理代码放在回调函数中,从而提高了程序的执行效率,当某个I / O执行完毕时,将以事件的形式通知执行I / O操作的线程,线程执行这个事件的回调函数,为了处理异步I / O,线程必须有事件循环,不断的检查有没有未处理的 事件,依次予以处理。阻塞模式下,一个线程只能处理一项任务,想要提高吞吐量必须通过多线程,而非阻塞模式下,一个线程永远在执行计算操作,这个线程的CPU核心利用率永远是100 %。
- 事件驱动
在Nodejs中,客户端请求建立连接,提交数据等行为,会触发相应的事件。在Node中,在一个时刻,只能执行一个事件回 调函数,但是在执行一个事件回调函数的中途,可以转而处理其他事件(比如,又有新用户连接了),然后返回继续执行 原 事件的回调函数,这种处理机制,称为“事件环”机制。
- 轻量和高效
- 没有全局作用域
只有模块作用域,所以不能进行像JavaScript那样的变量等的访问、调用操作
Nodejs中没有根目录(目录)的概念,因为它没有任何的web容器(可以理解成相当于一个服务器,如Apache/Tomcat)
4.Node.js的简单使用
(1) 、命令终端
- Node.js的全局对象是 global ; javascript的全局对象是 window
- 直接在命令终端中输入node,然后回车,就会出现 ‘>’ 标识,然后就可以写js语法了
- 命令终端退出: Ctrl + c 两次
(2) 、文件型使用
-
命令行键盘 tab 键 自动补全文件名称
- 执行文件/运行文件:
$ node 文件名称.js
二、NPM
1.NPM是什么
NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:
- 允许用户从NPM服务器下载别人编写的第三方包到本地使用。
- 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
- 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。
注:
- 输入 "npm -v" 来测试是否成功安装
2.NPM使用
(1)、使用淘宝镜像的命令
大家都知道国内直接使用 npm 的官方镜像是非常慢的,这里推荐使用淘宝 NPM 镜像。
淘宝 NPM 镜像是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步。
你可以使用淘宝定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm:
npm install -g cnpm --registry=https://registry.npm.taobao.org
这样就可以使用 cnpm 命令来安装模块了:
cnpm install [name]
(2)、npm 命令安装模块
npm 安装 Node.js 模块语法格式如下:
npm install <Module Name>
以下实例,我们使用 npm 命令安装常用的 Node.js web框架模块 express:
npm install express
express 包就放在了工程目录下的 node_modules 目录中
因此在代码中只需要通过 require('express') 的方式引用就好,无需指定第三方包路径。
var express = require('express');
(3)、全局安装与本地安装
npm 的包安装分为本地安装(local)、全局安装(global)两种,从敲的命令行来看,差别只是有没有-g而已,比如
npm install express # 本地安装
npm install express -g # 全局安装
本地安装:
- 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。
- 可以通过 require() 来引入本地安装的包。
全局安装:
- 将安装包放在 /usr/local 下或者你 node 的安装目录。
- 可以直接在命令行里使用。
(4)、查看安装信息
可以使用以下命令来查看所有全局安装的模块:
npm list -g
(5)、 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 - 关键字
(6)、卸载模块
卸载 Node.js 模块:
npm uninstall express
卸载后,你可以到 /node_modules/ 目录下查看包是否还存在,或者使用以下命令查看:
npm ls
(7)、更新模块
我们可以使用以下命令更新模块:
npm update express
(8)、搜索模块
使用以下来搜索模块:
npm search express
(9)、创建模块
$ 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
可以使用以下命令在 npm 资源库中注册用户(使用邮箱注册):
$ npm adduser
Username: mcmohd
Password:
Email: (this IS public) mcmohd@gmail.com
接下来我们就用以下命令来发布模块:
npm publish
(10)、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>
可以撤销发布自己发布过的某个版本代码
三、Node.js扩展
1.Node.js REPL
Node 自带了交互式解释器,可以执行以下任务:
-
读取 - 读取用户输入,解析输入的 Javascript 数据结构并存储在内存中。
-
执行 - 执行输入的数据结构
-
打印 - 输出结果
-
循环 - 循环操作以上步骤直到用户两次按下 ctrl-c 按钮退出。
(1)、REPL 命令
-
ctrl + c - 退出当前终端。
-
ctrl + c 按下两次 - 退出 Node REPL。
-
ctrl + d - 退出 Node REPL.
-
向上/向下 键 - 查看输入的历史命令
-
tab 键 - 列出当前命令
-
.help - 列出使用命令
-
.break - 退出多行表达式
-
.clear - 退出多行表达式
-
.save filename - 保存当前的 Node REPL 会话到指定文件
-
.load filename - 载入当前 Node REPL 会话的文件内容。
(2)、停止 REPL
按下两次 ctrl + c 键就能退出 REPL:
$ node
>
(^C again to quit)
>
2.require详解
nodejs中require使用非常频繁,或者说在模块化开发中起到非常重要的作用
使用通常类似这样:
var fs = require('fs')
const http = require('http')
可是你真的了解它吗?在node中require方法有两个作用:
- 加载文件模块并执行里面的代码
- 拿到被加载文件模块导出的接口对象 (exports)
3.文件系统
FileSystem,文件系统,样例:
// 引入fs模块
const fs = require('fs')
// 读文件
fs.readFile('./我的生词本.txt', function (err, data) {
console.log(data.toString())
console.log(err)
})
// 写文件
fs.writeFile('./writeFile.txt', '大家好,我是帅哥!', function (err) {
console.log('文件写入成功')
console.log(err)
})
4.http
使用http API可以快速的创建一个服务器
// 引入http模块
const http = require('http')
// 创建一个web服务器(使用createServe方法,返回一个Serve实例)
var serve = http.createServer();
// 注册 request 请求事件(当客户端发请求过来就会自动触发 request 请求事件,执行回调函数)
// 回调函数接收两个参数,request,response
// request是客户端发送的请求信息
// response有一个write方法,可以用来向客户端发送响应信息
serve.on('request', function (request, response) {
console.log('客户端请求发送成功')
// console.log(request)
response.writeHead(200, { 'Content-Type': 'text/plain;charset=UTF8' })// 设置响应头
response.write('这是服务端向客户端响应的内容~~~')
response.write('nodejs')
// 通过response.end方法结束响应,告诉客户端,服务端响应完毕
response.end()
})
// 绑定端口号,启动服务器
serve.listen('5000', function () {
console.log('服务器启动成功了~')
})
// 创建一个服务,并加载html文件,展示页面
var http=require("http");
var fs=require("fs"); //导入文件模块
var server =http.createServer(function(req,res){
//设置头信息
res.setHeader("Content-Type","text/html;charset='utf-8'");
//读文件
fs.readFile("./index.html","utf-8",function(err,data){
if(err) {
console.log("index.html loading is failed :"+err);
} else {
//返回index.html页面
res.end(data);
}
});
}).listen(8888); //监听端口,注:一个程序只能监听一个端口
5.path
path模块提供了一些用于处理文件与目录的路径的实用工具。
最常用的resolve方法:
// path
const path = require('path')
// 使用如:
index: path.resolve(__dirname, '../dist/index.html'),
// path.resolve() 方法将路径或路径片段的序列解析为绝对路径,
// 给定的路径序列从右到左进行处理,每个后续的 path 前置,直到构造出一个绝对路径
// 如果任何参数不是字符串,则抛出 TypeError
Node.js中提供了两个与文件操作相关全局可用变量__dirname和__filename,__dirname表示当前文件所在的目录,__filename表示正在执行脚本的文件名。
6.express框架
express是基于 Node.js 平台,快速、开放、极简的 Web 开发框架。
原生的node开发存在很多问题:
- 呈递静态页面很不方便,需要处理每个http请求,还要处理304问题
- 路由处理代码不直观清晰,需要很多正则表达式和字符串函数
- 不能集中精力写业务,要考虑很多其他的东西
所以express框架应运而生:
- express框架有着惊艳的路由能力,正则提取数据能力足够一般工作使用
- express中的静态文件处理就是一句话的事
- express与模板引擎的配合更直观清晰
Express 框架核心特性:
-
可以设置中间件来响应 HTTP 请求。
-
定义了路由表用于执行不同的 HTTP 请求动作。
-
可以通过向模板传递参数来动态渲染 HTML 页面。
安装 Express 并将其保存到依赖列表中:
$ cnpm install express --save
以上命令会将 Express 框架安装在当前目录的 node_modules 目录中, node_modules 目录下会自动创建 express 目录。以下几个重要的模块是需要与 express 框架一起安装的:
-
body-parser - node.js 中间件,用于处理 JSON, Raw, Text 和 URL 编码的数据。
-
cookie-parser - 这就是一个解析Cookie的工具。通过req.cookies可以取到传过来的cookie,并把它们转成对象。
-
multer - node.js 中间件,用于处理 enctype="multipart/form-data"(设置表单的MIME编码)的表单数据。
$ cnpm install body-parser --save
$ cnpm install cookie-parser --save
$ cnpm install multer --save
Express 框架实例
//express_demo.js 文件
var express = require('express');
var app = express();
app.get('/', function (req, res) {
res.send('Hello World');
})
var server = app.listen(8081, function () {
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)
})
//输出 "Hello World"
本文由博主在学习过程中所写,如有错误和问题,望理解。