目录
一、Node.js 基础
1.Node.js 是什么
2.Node.js 安装
3.Node.js 特性
4.Node.js的简单使用
(1) 、命令终端
(2) 、文件型使用
二、NPM
1.NPM是什么
2.NPM使用
(1)、使用淘宝镜像的命令
(2)、npm 命令安装模块
(3)、全局安装与本地安装
(4)、查看安装信息
(5)、 package.json
(6)、卸载模块
(7)、更新模块
(8)、搜索模块
(9)、创建模块
(10)、NPM 常用命令
三、Node.js扩展
1.Node.js REPL
(1)、REPL 命令
(2)、停止 REPL
2.require详解
3.文件系统
4.http
5.path
6.express框架
Node.js 安装教程:Node.js 安装配置 | 菜鸟教程
Node.js 安装注意:
npm config set prefix "D:\nodejs\X64\node_global" //默认位置
npm config set cache "D:\nodejs\X64\node_cache" //缓存位置
注:先在相应的位置建立文件node_global和node_cache,再设置
NODE_PATH = D:\nodejs\X64\node_global\node_modules(很重要,尤其是全局安装node插件时),否则会出现XXX不是内部命令的错误。
在Java,PHP或者.net语言中,会为每一个客户端连接创建一个新的线程,而每个线程需要耗费大约2MB内存,所以就会 限制同时连接的用户数量。Node.js不为每个客户连接创建一个新的线程,而仅仅使用一个线程,当有用户连接了就触发一 个内部事件,通过非阻塞I/O、事件驱动机制,让Nodejs程序宏观上也是并行的,大大提高用户的连接数量(性能)。
当在访问数据库取得数据的时候,需要一段时间,在传统的单线程处理机制中,在执行了访问数据库代码之后,整个线程都 将暂停下来,等待数据库返回结果,才能执行后面的代码,也就是说,I / O阻塞了代码的执行,极大的降低了程序的执行效率,而Nodejs中采用了非阻塞型I / O机制,因此在执行访问数据库的代码之后,将立即转而执行其后面的代码,把数据库返回的结果处理代码放在回调函数中,从而提高了程序的执行效率,当某个I / O执行完毕时,将以事件的形式通知执行I / O操作的线程,线程执行这个事件的回调函数,为了处理异步I / O,线程必须有事件循环,不断的检查有没有未处理的 事件,依次予以处理。阻塞模式下,一个线程只能处理一项任务,想要提高吞吐量必须通过多线程,而非阻塞模式下,一个线程永远在执行计算操作,这个线程的CPU核心利用率永远是100 %。
在Nodejs中,客户端请求建立连接,提交数据等行为,会触发相应的事件。在Node中,在一个时刻,只能执行一个事件回 调函数,但是在执行一个事件回调函数的中途,可以转而处理其他事件(比如,又有新用户连接了),然后返回继续执行 原 事件的回调函数,这种处理机制,称为“事件环”机制。
只有模块作用域,所以不能进行像JavaScript那样的变量等的访问、调用操作
Nodejs中没有根目录(目录)的概念,因为它没有任何的web容器(可以理解成相当于一个服务器,如Apache/Tomcat)
命令行键盘 tab 键 自动补全文件名称
$ node 文件名称.js
NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:
注:
- 输入 "npm -v" 来测试是否成功安装
大家都知道国内直接使用 npm 的官方镜像是非常慢的,这里推荐使用淘宝 NPM 镜像。
淘宝 NPM 镜像是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步。
你可以使用淘宝定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm:
npm install -g cnpm --registry=https://registry.npm.taobao.org
这样就可以使用 cnpm 命令来安装模块了:
cnpm install [name]
npm 安装 Node.js 模块语法格式如下:
npm install
以下实例,我们使用 npm 命令安装常用的 Node.js web框架模块 express:
npm install express
express 包就放在了工程目录下的 node_modules 目录中
因此在代码中只需要通过 require('express') 的方式引用就好,无需指定第三方包路径。
var express = require('express');
npm 的包安装分为本地安装(local)、全局安装(global)两种,从敲的命令行来看,差别只是有没有-g而已,比如
npm install express # 本地安装
npm install express -g # 全局安装
本地安装:
全局安装:
可以使用以下命令来查看所有全局安装的模块:
npm list -g
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 - 关键字
卸载 Node.js 模块:
npm uninstall express
卸载后,你可以到 /node_modules/ 目录下查看包是否还存在,或者使用以下命令查看:
npm ls
我们可以使用以下命令更新模块:
npm update express
使用以下来搜索模块:
npm search express
$ 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 --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) [email protected]
接下来我们就用以下命令来发布模块:
npm publish
NPM提供了很多命令,例如install和publish,使用npm help可查看所有命令。
NPM提供了很多命令,例如install
和publish
,使用npm help
可查看所有命令。
使用npm help
可查看某条命令的详细帮助,例如npm help install
。
在package.json
所在目录下使用npm install . -g
可先在本地安装当前命令行程序,可用于发布前的本地测试。
使用npm update
可以把当前目录下node_modules
子目录里边的对应模块更新至最新版本。
使用npm update
可以把全局安装的对应命令行程序更新至最新版。
使用npm cache clear
可以清空NPM本地缓存,用于对付使用相同版本号发布新版本代码的人。
使用npm unpublish
可以撤销发布自己发布过的某个版本代码
Node 自带了交互式解释器,可以执行以下任务:
读取 - 读取用户输入,解析输入的 Javascript 数据结构并存储在内存中。
执行 - 执行输入的数据结构
打印 - 输出结果
循环 - 循环操作以上步骤直到用户两次按下 ctrl-c 按钮退出。
ctrl + c - 退出当前终端。
ctrl + c 按下两次 - 退出 Node REPL。
ctrl + d - 退出 Node REPL.
向上/向下 键 - 查看输入的历史命令
tab 键 - 列出当前命令
.help - 列出使用命令
.break - 退出多行表达式
.clear - 退出多行表达式
.save filename - 保存当前的 Node REPL 会话到指定文件
.load filename - 载入当前 Node REPL 会话的文件内容。
按下两次 ctrl + c 键就能退出 REPL:
$ node
>
(^C again to quit)
>
nodejs中require使用非常频繁,或者说在模块化开发中起到非常重要的作用
使用通常类似这样:
var fs = require('fs')
const http = require('http')
可是你真的了解它吗?在node中require方法有两个作用:
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)
})
使用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); //监听端口,注:一个程序只能监听一个端口
path模块提供了一些用于处理文件与目录的路径的实用工具。
最常用的resolve方法:
// path
const path = require('path')
// 使用如:
index: path.resolve(__dirname, '../dist/index.html'),
// path.resolve() 方法将路径或路径片段的序列解析为绝对路径,
// 给定的路径序列从右到左进行处理,每个后续的 path 前置,直到构造出一个绝对路径
// 如果任何参数不是字符串,则抛出 TypeError
Node.js中提供了两个与文件操作相关全局可用变量__dirname和__filename,__dirname表示当前文件所在的目录,__filename表示正在执行脚本的文件名。
express是基于 Node.js 平台,快速、开放、极简的 Web 开发框架。
原生的node开发存在很多问题:
所以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"
本文由博主在学习过程中所写,如有错误和问题,望理解。